tensorflow - 如何将具有不同形状/尺寸的张量相乘?
问题描述
我有一个卷积自动编码器模型。虽然自动编码器通常专注于在不使用任何标签信息的情况下重建输入,但我想使用类标签在卷积之后执行类条件缩放/移位。我很好奇以这种方式使用标签是否有助于产生更好的重建。
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
可以在此处找到的文件,但根据文档,我认为它接受与输入大小相同的张量。我该如何解决这个问题?
解决方案
你不必循环。只需通过使两个张量广播兼容来执行以下操作,
out = layers.Multiply()([conv_0, tf.expand_dims(tf.expand_dims(scale,axis=1), axis=1)])
推荐阅读
- java - 与 Hazelcast 共享 Hibernate 5 二级缓存
- c# - Alglib 卡方分布示例
- javascript - 为什么我确实有以下类型错误:无法读取未定义的属性“长度”?(在反应中)
- android - 记住 LazyColumn 滚动位置 - Jetpack Compose
- webrtc - 特定对等方的 STUN 绑定(ICE 连接检查)失败
- neovim - 如何更改 coc.nvim 中 pylint 的路径?
- javascript - 尝试在 React Native 中更新数组对象
- ssis - 如果进程今天已经运行,如何禁用任务
- php - 以下代码未达到 else 语句
- java - 如何使用 jsoup 从网站获取视频或音频的 URL