Я пытался реализовать слой умножения в Керасе и получал несколько ошибок, связанных с Reshape
. Хотя все они решены сейчас, я все еще сомневаюсь, почему это работает. Итак, вот фрагмент кода, который я реализовал:
out2 = Dense(540, kernel_initializer='glorot_normal', activation='linear')(out2)
out2 = LeakyReLU(alpha=.2)(out2)
out2 = Reshape((9, 4, 15))(out2)
out2 = Lambda(lambda x: K.dot(K.permute_dimensions(x, (0, 2, 1, 3)), K.permute_dimensions(x, (0, 2, 3, 1))), output_shape=(4,9,9))(out2)
out2 = Dense(324, kernel_initializer='glorot_normal', activation='linear')(out2)
# K.dot should be of size (-1, 4, 9, 9), so I set output 324, and later on, reshape the ata
out2 = LeakyReLU(alpha=.2)(out2)
out2 = Reshape((-1, 4, 9, 9))(out2)
out2 = Permute((0, 2, 3, 1))(out2)
Теперь все работает нормально. Но я сделал 3 вещи, которые меня не устраивают:
Раньше у меня было out2 = Reshape((-1, 9, 4, 15))(out2)
вместо out2 = Reshape((9, 4, 15))(out2)
, и у меня была ошибка
ValueError: Dimension must be 5 but is 4 for 'lambda_1/transpose' (op: 'Transpose') with input shapes: [?,?,9,4,15], [4].
Очевидно, я не принимал во внимание размер пакета.
Теперь я попытался исправить строку out2 = Reshape((-1, 4, 9, 9))(out2)
в out2 = Reshape((4, 9, 9))(out2)
, используя ту же концепцию, но затем выдает ошибку
ValueError: total size of new array must be unchanged
Я не понимаю несоответствия.
- Наконец, мне было интересно, если удаление
output_shape=(4,9,9)
сделает что-то неправильное с кодом.