如何将具有不同形状/尺寸的张量相乘?

时间:2020-09-30 00:36:40

标签: tensorflow keras conv-neural-network matrix-multiplication array-broadcasting

我有一个卷积自动编码器模型。尽管自动编码器通常专注于在不使用任何标签信息的情况下重建输入,但是我想使用类标签在卷积后执行类条件缩放/移位。我很好奇,如果以此方式使用标签可能有助于产生更好的重建效果。

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数组,我可以对range(32)中的i做类似conv_0[:, :, i] * scale[i]的操作。

我看过here可以找到的tf.keras.layers.Multiply,但是基于文档,我相信它采用与输入相同大小的张量。我该如何解决?

2 个答案:

答案 0 :(得分:1)

您不必循环。只需使两个张量与广播兼容,即可完成以下操作

out = layers.Multiply()([conv_0, tf.expand_dims(tf.expand_dims(scale,axis=1), axis=1)])

答案 1 :(得分:0)

我不知道我是否真的了解您要达到的目标,但是我进行了快速的numpy测试。我相信它也应该存在于张量流中:

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

在这种情况下,通过按比例在索引1中找到的元素2来检查通道级切片是否实际上按元素按比例缩放

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