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