2016-09-11 86 views
0

如果我有一個形狀爲[batch_size, height, width, depth]的圖層的輸出和另一個形狀爲[depth]的張量,我怎樣才能將第一張量乘以第二張量,使得沿着方向的每個切片乘以第二張量中的對應值。也就是說,如果第二張是[4, 5, 6],那麼乘法是:沿任意軸相乘?

tensor1[:, :, :, 0] * 4 
tensor1[:, :, :, 1] * 5 
tensor1[:, :, :, 2] * 6 

此外,有沒有一個名字爲這種乘法的,我不知道搜索?謝謝!

回答

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]}) 

看起來有點古怪,但它似乎爲我工作的罰款。我使用過二維張量,但你可以將其擴展到你的案例。

2

這很簡單。只需乘以兩張張。例如:

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)) 
+1

只是爲了確保正確的座標軸用於乘法運算,您可以將'depth'重塑爲'[1,1,1,3]'。 (你也可以使用'tf.expand_dims()') –

+0

是的,我同意。在我的例子中,廣播是隱含的,所以可能類似'depth = tf.reshape(tf.constant([4,5,6],dtype = tf.float32),shape = [1,1,1,3])'會更清楚。 – rvinas

1

要回答你的第二個問題,「是有這種乘法的,我不知道要搜索的名字嗎?」,這是與廣播逐元素相乘。廣播是指隱式地複製張量元素以使其與元素式操作中使用的第二張量兼容的操作。許多Tensorflow操作使用Numpy使用的相同廣播方法,這些方法將進一步描述here