我想沿着动态维度(即批量大小)动态广播张量的乘法。我可以对批量大小进行硬编码,但是批量大小等于 1 的推断是不可能的。
img_placeholder = tf.placeholder(tf.float32, (None, 28, 28, 1), name='real_img')
random_part = tf.placeholder(tf.float32, (None), name='random_part')
在训练期间,我将为每个占位符提供相同大小的第一维度。我想要 result = random_part * img_placeholder
这样 result[0] = random_part[0] * img_placeholder[0]
。
目前只是将两端与大小为 BATCH_SIZE, 28, 28, BATCH_SIZE
的张量相乘。
如果广播无法按照我的意愿工作(因为存在动态尺寸大小),是否有可能以其他方式实现?
最佳答案
TensorFlow 使用与 numpy 相同的广播规则,因此在示例中,形状 (20) 首先在左侧扩展,单例尺寸变为 (1, 1, 1, 20),然后单例尺寸两侧匹配,形成形状 (20, 3, 3, 20)。
如果您希望将 (20) 视为批处理维度,则应将其 reshape 为具有相同的排名
>>> a=np.ones((5,))
>>> b=np.ones((5,28,28,1))
>>> (a*b).shape
(5, 28, 28, 5)
>>> b.shape
(5, 28, 28, 1)
>>> a.shape
(5,)
>>> a2 = np.reshape(a, [len(a), 1, 1, 1])
>>> a2.shape
(5, 1, 1, 1)
>>> (a2*b).shape
(5, 28, 28, 1)
关于tensorflow - 动态广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45494642/