首页 > 解决方案 > 如何将具有不同形状/尺寸的张量相乘?

问题描述

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

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可以在此处找到的文件,但根据文档,我认为它接受与输入大小相同的张量。我该如何解决这个问题?

标签: tensorflowkerasconv-neural-networkmatrix-multiplicationarray-broadcasting

解决方案


你不必循环。只需通过使两个张量广播兼容来执行以下操作,

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

推荐阅读