如何创建一个没有内核的tf.keras层,即创建一个可以在keras模型定义中任何地方使用的可训练变量?

如何创建一个没有内核的tf.keras层,即创建一个可以在keras模型定义中任何地方使用的可训练变量?,keras,Keras,例如,只想要偏见。标量。没有内核 在tf.变量和K.变量上使用model.add_权重失败 这应该很简单。在文档中找不到它 更新: 这似乎是迄今为止我遇到的最好的方式: class BiasLayer(keras.layers.Layer): def __init__(self, output_dim=1, **kwargs): self.output_dim = output_dim super().__init__(**kwargs) def

例如,只想要偏见。标量。没有内核

在tf.变量和K.变量上使用model.add_权重失败

这应该很简单。在文档中找不到它

更新:

这似乎是迄今为止我遇到的最好的方式:

class BiasLayer(keras.layers.Layer):
    def __init__(self, output_dim=1, **kwargs):
        self.output_dim = output_dim
        super().__init__(**kwargs)

    def build(self, input_shape):
        self.V = self.add_weight(shape=(1,), initializer=keras.initializers.Constant(value=0), dtype=tf.float32, trainable=True)
        super().build(input_shape)

    def call(self, x):
        return x * 0 + self.V # this is stupid, is there a better way
        # return self.V # this does not work, results in no trainable variables

    def compute_output_shape(self, input_shape):
        return (input_shape[0], self.output_dim)

您可以设置
内核大小=0
。我写了一个例子来证明这一点

正常内核 带内核的概要

无核 将
kernel\u size=5
更改为
kernel\u size=0

没有内核的摘要

您可以将内核值设置为全1。全零常量您的意思是?我的意思是全1常量。这就是标识内核。我只是想破解Keras,给我一个偏差变量,作为一个单独的变量进行训练,与其他变量无关。我不想添加额外的train变量。如果我能让Keras处理add_weight(tf.Variable,1.0)我也不需要这个hack.OMG,这么简单。我不认为内核大小为零应该有效!应该添加到文档中,作为创建变量的一种快速/好方法。我发现这对我的情况还不起作用…我只是在寻找一个包装好的可训练变量,我想你可能正在解决一些更复杂的情况,其中零选择e通过模型传播。
import tensorflow as tf
from tensorflow.keras import layers
import numpy as np

mnist = tf.keras.datasets.mnist


(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test = tf.keras.utils.to_categorical(y_test, 10)

x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)


kernel_size=(5, 5)
# kernel_size = 0

model = tf.keras.Sequential()
model.add(layers.Conv2D(64, kernel_size, strides=(1, 1), padding='same',
                        input_shape=(28, 28, 1)))
model.add(layers.LeakyReLU())
model.add(layers.MaxPooling2D(pool_size=(2,2)))

model.add(layers.Conv2D(32, kernel_size, strides=(1, 1), padding='same'))
model.add(layers.LeakyReLU())
model.add(layers.MaxPooling2D(pool_size=(2,2)))

model.add(layers.Flatten())
model.add(layers.Dense(10, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

# model.fit(x_train, y_train,
#           batch_size=32, nb_epoch=1, verbose=1)
# model.evaluate(x_test, y_test)
model.summary()