在Keras中定义新的Lambda层时重塑错误

时间:2019-07-11 13:33:02

标签: python keras

我试图在Keras中实现乘法层,并且收到多个与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件我不满意的事情:

  1. 我曾经有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].

显然,我没有考虑批次大小的维度。

  1. 现在,我尝试使用相同的概念将行out2 = Reshape((-1, 4, 9, 9))(out2)改成out2 = Reshape((4, 9, 9))(out2),但是随后抛出错误

    ValueError: total size of new array must be unchanged

我不明白这种矛盾之处。

  1. 最后,我想知道删除output_shape=(4,9,9)是否会对代码造成任何错误。

1 个答案:

答案 0 :(得分:1)

关于批次大小的问题,Keras会自动处理。只是层层表示要应用于批次的功能而已,这是Keras的任务,是将这种功能应用于模型所获取的每个批次。因此,基本上,定义图层时应忽略批处理大小。

此外,Dense层无法按预期工作。它应用于输入的最后一个维度。如果您希望从那时起将数据作为常规MLP处理,则可以像在以常规完全连接层结尾的CNN之前使用Flatten()之前在Dense之前使用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 = Flatten()(out2) out2 = Dense(324, kernel_initializer='glorot_normal', activation='linear')(out2) out2 = LeakyReLU(alpha=.2)(out2) out2 = Reshape((4, 9, 9))(out2) 然后)。

总而言之,您可以执行以下操作:

async