我试图在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)
是否会对代码造成任何错误。 最佳答案
关于批量大小的问题,Keras会自动处理。只是层层表示要应用于批次的功能而已,这是Keras的任务,是将这种功能应用于模型所获取的每个批次。因此,基本上,定义图层时应忽略批次大小。
另外,Dense
层无法按预期工作。它应用于输入的最后一个维度。如果您希望从那时起将数据作为常规MLP处理,则可以在Flatten()
之前使用Dense
,就像使用以常规完全连接层结尾的CNN一样(当然,您可以在其后重塑形状)。
概括起来,您可以执行以下操作:
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)
关于python - 在Keras中定义新的Lambda层时重塑错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56990472/