В настоящее время я пытаюсь заставить работать пользовательские слои keras, вы можете увидеть упрощенную версию здесь:
class MyLayer(Layer):
def __init__(self, **kwargs):
super(MyLayer, self).__init__(**kwargs)
def build(self, input_shape):
print("input_shape: "+str(input_shape))
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[1], self.output_dim),
initializer='uniform',
trainable=True)
super(MyLayer, self).build(input_shape)
def call(self, x):
print("input tensor: "+str(x))
return K.dot(x, self.kernel)
inputs = Input(shape=(3,3), dtype='float', name='inputs')
results = MyLayer(input_shape=(3,3))(inputs)
В результате консольный вывод будет следующим:
input_shape: (None, 3, 3)
input tensor: Tensor("inputs:0", shape=(?, 3, 3), dtype=float32)
Как видите, input_shape, который получает слой, не (3,3), как я указал, а фактически (None, 3,3). Это почему? Форма входного тензора также имеет форму (?, 3,3), которую я считал следствием странной input_shape (None, 3,3). Но входной тензор также имеет эту форму с третьим измерением, если вы замените super(MyLayer, self).build(input_shape)
на super(MyLayer, self).build((3,3))
. Что это за загадочный керас третьего измерения автоматически добавляет и почему?