沿任意轴进行乘法?

8
如果我有一个形状为[batch_size, height, width, depth]的层的输出和另一个形状为[depth]的张量,那么我该如何将第一个张量乘以第二个张量,以便沿着depth方向的每个切片都与第二个张量中相应的值相乘。也就是说,如果第二个张量是[4, 5, 6],则乘法如下:
tensor1[:, :, :, 0] * 4
tensor1[:, :, :, 1] * 5
tensor1[:, :, :, 2] * 6

此外,我不知道有没有一个名称来描述这种乘法运算,您能帮忙确认吗?谢谢!
3个回答

7

这很简单,只需将两个张量相乘即可。例如:

import tensorflow as tf

tensor = tf.Variable(tf.ones([2, 2, 2, 3]))
depth = tf.constant([4, 5, 6], dtype=tf.float32)
result = tensor * depth

sess = tf.Session()
sess.run(tf.initialize_all_variables())
print(sess.run(result))

2
为确保在乘法运算中使用正确的轴,您可以将“depth”重塑为[1, 1, 1, 3]。(您也可以使用tf.expand_dims() - Olivier Moindrot
1
是的,我同意。在我的示例中,广播是隐含的,因此可能类似于 depth = tf.reshape(tf.constant([4, 5, 6], dtype=tf.float32), shape=[1, 1, 1, 3]) 这样会更清晰。 - rvinas

0
回答你的第二个问题,“这种我不知道该搜索什么名字的乘法有没有名称?” 它是一种具有广播功能的逐元素乘法。广播是指隐式复制张量的元素,使其与用于逐元素操作的第二个张量兼容。许多Tensorflow操作使用与Numpy使用的相同的广播方法,这些方法在此处进一步描述。

0
我想到了以下内容:
a = tf.placeholder(tf.float32, shape = [5, 2])
b = tf.placeholder(tf.float32, shape = 2)

c = tf.concat(1, [tf.mul(x, y) for x, y in zip(tf.split(0, 2, b), tf.split(1, 2, a))])

sess = tf.Session()
print sess.run(c, feed_dict = {a: np.ones([5, 2]), b: [5, 6]})

看起来有点奇怪,但对我来说似乎运行良好。我使用了2D张量,但你肯定可以将其扩展到你的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接