Пользовательский плотный слой tf.keras с умножением пользовательских матриц не имеет градиента - PullRequest
1 голос
/ 08 марта 2019

Я пытаюсь реализовать свой собственный слой Dense в Tensorflow версии 1.12.0.Я следую инструкциям по определению пользовательских слоев из writing-your-own-keras-layer .Реализация пользовательского слоя Dense с использованием tf.matmul (input, self.kernel) работает отлично.Ниже приведено описание слоя 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))

Однако, когда я заменяю tf.matmul () на свой собственный pythonоснованный на алгоритме умножения матриц, он выдает следующие ошибки:

Traceback (последний вызов был последним): файл "custom_layer.py", строка 156, в ValueError: Операция имеет None для градиента,Пожалуйста, убедитесь, что все ваши операции имеют определенный градиент (то есть являются дифференцируемыми).Обычные операции без градиента: K.argmax, K.round, K.eval.

Мой пользовательский алгоритм умножения матриц использует три вложенных цикла для вычисления выходных данных.Может кто-нибудь уточнить, почему умножение пользовательских матриц имеет значение «Нет» для градиента.Или кто-нибудь может подсказать мне, что я здесь делаю неправильно.Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...