如何将张量与不同的 shapes/dimensions 相乘?

How to multiply tensors with different shapes/dimensions?

我有一个卷积自动编码器模型。虽然自动编码器通常专注于在不使用任何标签信息的情况下重建输入,但我想使用 class 标签在卷积后执行 class 条件 scaling/shifting。我很好奇以这种方式使用标签是否有助于产生更好的重建。

num_filters = 32
input_img = layers.Input(shape=(28, 28, 1)) # input image
label = layers.Input(shape=(10,)) # label

# separate scale value for each of the filter dimensions
scale = layers.Dense(num_filters, activation=None)(label) 
# conv_0 produces something of shape (None,14,14,32)
conv_0 = layers.Conv2D(num_filters, (3, 3), strides=2, activation=None, padding='same')(input_img) 

# TODO: Need help here. Multiply conv_0 by scale along each of the filter dimensions. 
# This still outputs something of shape (None,14,14,32)
# Essentially each 14x14x1 has it's own scalar multiplier 

在上面的例子中,卷积层的输出是(14,14,32),尺度层的形状是(32,)。我希望卷积输出沿每个滤波器维度乘以相应的比例值。例如,如果这些是 numpy 数组,我可以做类似 conv_0[:, :, i] * scale[i] for i in range(32).

的事情

我查看了 tf.keras.layers.Multiply,可以在 here 中找到它,但根据文档,我认为它采用与输入相同大小的张量。我该如何解决这个问题?

我不知道我是否真的理解你想要实现的目标,但我做了一个快速的 numpy 测试。我相信它也应该适用于 tensorflow:

conv_0 = np.ones([14, 14, 32])
scale = np.array([ i + 1 for i in range(32)])
result = conv_0 * scale

检查 channel-wise 切片是否实际缩放 element-wise 在这种情况下,在比例中索引 1 处找到的元素为 2

conv_0_slice_1 = conv_0[:, :, 1]
result_slice_1 = result[:, :, 1] 

您不必循环播放。只需制作两个张量 broadcast-compatible、

即可执行以下操作
out = layers.Multiply()([conv_0, tf.expand_dims(tf.expand_dims(scale,axis=1), axis=1)])