tf.keras具有自定义矩阵乘法的自定义密集层没有梯度

时间:2019-03-08 15:21:42

标签: python tensorflow keras

我正在尝试在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,   埃瓦尔。

我的自定义矩阵乘法算法使用三个嵌套循环来计算输出。 有人可以说明为什么自定义矩阵乘法的梯度为“无”。或者有人可以指导我我在这里做错了什么。 谢谢

0 个答案:

没有答案