我正在尝试在Tensorflow版本1.12.0中实现自己的自定义Dense层。我正在按照有关从writing-your-own-keras-layers定义自定义图层的说明进行操作。使用tf.matmul(inputs,self.kernel)实现自定义Dense层可以很好地实现。下面是对Dense层的描述。
class MyLayer(layers.Layer):
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MyLayer, self).__init__(**kwargs)
def build(self, input_shape):
shape = tf.TensorShape((input_shape[1], self.output_dim))
# Create a trainable weight variable for this layer.
self.kernel = self.add_weight(name='kernel',
shape=shape,
initializer='uniform',
trainable=True)
super(MyLayer, self).build(input_shape)
def call(self, inputs):
y = tf.matmul(inputs,self.kernel)
return (y)
模型如下:
model = tf.keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
MyLayer(20, input_shape=(1, 784)),
#MyLayer(input_shape=(10,)),
layers.Activation('relu'),
MyLayer(10,input_shape=(1, 20)),
#MyLayer(input_shape=(10,)),
layers.Activation('relu'),
keras.layers.Dense(10, input_shape=(1, 10), activation='softmax')])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(data, labels, epochs=1, batch_size=1,
validation_data=(val_data, val_labels))
但是,当我用自己的基于python的自定义矩阵乘法算法替换tf.matmul()时,会出现以下错误。
回溯(最近一次通话最后一次):文件“ custom_layer.py”,第156行, 在ValueError中:操作具有
None
用于渐变。请 确保所有操作都定义了渐变(即 可区分的)。不带渐变的常见操作:K.argmax,K.round, 埃瓦尔。
我的自定义矩阵乘法算法使用三个嵌套循环来计算输出。 有人可以说明为什么自定义矩阵乘法的梯度为“无”。或者有人可以指导我我在这里做错了什么。 谢谢