我试图在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/

10-12 19:24