我试图在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件我不满意的事情:
我曾经有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)
是否会对代码造成任何错误。答案 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