【问题标题】:Add 2 tensors with different rank添加 2 个不同等级的张量
【发布时间】:2019-12-27 14:16:11
【问题描述】:

我有 2 个张量:形状为 (None, 16, 7, 7, 1024) 的 A 和形状为 (1, 16, 7, 7, 1024) 的 B。我使用keras.layers.add([A, B]) 添加这些张量。我希望有一个形状为 (None, 16, 7, 7, 1024) 的张量,但我得到了 (1, 16, 7, 7, 1024) == > 请注意,批量大小现在变为 1。 如何得到我想要的结果(None)?

代码:

_h_state = np.zeros((16, 7, 7, 1024))
h_state = Input(tensor=tf.constant(_h_state, dtype=tf.float32), name='input_h_state')
enc = encoder.output

enc_x = Conv3D(filters=256, kernel_size=(1, 1, 1), strides=(1, 1, 1), name='enc_conv')(enc)
h_state_expanded = Lambda(lambda x: K.expand_dims(x, 0))(h_state)
h_state_x = Conv3D(filters=256, kernel_size=(1, 1, 1), strides=(1, 1, 1), name='h_state_conv')(h_state_expanded)
x = layers.add([enc_x, h_state_x])
x = Activation('tanh')(x)
.
.
.

剧情:

【问题讨论】:

  • 这应该可以正常工作。您确定您的原始批量大小大于 1?
  • B 的原始输入是 (16, 7, 7, 1024),我添加了额外的维度,以便可以对其执行 Conv3D。之后我想用 A 执行加法。我想保持结果的第一维为无
  • 另一个信息,B 的原始输入是没有批量大小的常量值
  • @donto 你能分享可重现的代码吗?
  • @rvinas 问题已更新

标签: python tensorflow keras add


【解决方案1】:

当您打印x.shape 时,输出为(None, 16, 7, 7, 1024),但有趣的是plot_modelmodel.summary 都显示“未广播”的第一个维度。

我相信你是对的 - 在这种特殊情况下,keras.layers._Merge.compute_output_shape 方法可能无法正确处理第一维的广播。这可能应该通过拉取请求来解决。

与此同时,您可以改用:

x = Lambda(lambda x: x[0] + x[1])([enc_x, h_state_x])

它给出了预期的输出形状。

【讨论】:

  • 是的,当我打印x.shape 时,第一维是None,但plot_model() 告诉不同。供您参考,我使用的是 Windows 10、tensorflow-gpu 1.12.0、Keras 2.2.4。此外,您的解决方案完美无缺!谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 2019-03-18
  • 2020-09-08
相关资源
最近更新 更多