我有一个非常简单的例子:
import tensorflow as tf
import pdb
number_features = tf.random_uniform((4096,22))
probs = number_features
probs_L = probs[:,:3]
probs_S1 = probs[:,3:12]
probs_S2 = probs[:,12:22]
confidence_no_digits = probs_L[:,0]
confidence_single_digit = probs_L[:,1] * probs_S1
with tf.Session() as sess:
result = sess.run([confidence_single_digit])
但这给出了:
ValueError:尺寸必须相等,但输入形状为[4096],[4096,9]的“ mul”(操作数:“ Mul”)必须为4096和9。
为什么我不能将元素大小为[4096]的向量与大小为[4096,9]的矩阵相乘。为什么广播在这里不起作用?
答案 0 :(得分:1)
张量流中的广播遵循与NumPy broadcasting相同的模式。当对两个数组进行运算时,它会从最后一个维度开始逐个元素地比较它们的形状,然后一直到第一个维度。在以下情况下,两个维度兼容:
在这种情况下,根据上述规则,从最后一个尺寸开始,尺寸4096(第一个数组的最后一个尺寸)和9(第二个数组的最后一个尺寸)不兼容,因此会出现错误。
为了对其进行修复以获得所需的广播效果,可以将第一个数组转换为兼容的形状:
confidence_single_digit = tf.expand_dims(probs_L[:,1],1) * probs_S1
因此形状分别为(4096,1)和(4096,9)。
答案 1 :(得分:0)
如果我没记错的话,*
符号表示逐元素相乘,而您想要矩阵相乘。您应该使用TF的矩阵乘法函数matmul。
尝试:
confidence_single_digit = tf.matmul(probs_L[:,1], probs_S1)
更新:如果您要逐元素乘法,请使用常规的multiplication函数。这个问题可以是seen。
尝试:
confidence_single_digit = tf.multiply(probs_L[:,1], probs_S1)
注意:我以前从未使用过TensorFlow。这可能是寻找错误的起点。
答案 2 :(得分:0)
您以此得到预期的结果吗?
confidence_single_digit = tf.expand_dims(probs_L[:,1],1) * probs_S1
现在形状就是这些了。</ p>
<bound method Tensor.get_shape of <tf.Tensor 'ExpandDims_1:0'
shape=(4096, 1) dtype=float32>>
<bound method Tensor.get_shape of <tf.Tensor 'strided_slice_2:0'
shape=(4096, 9) dtype=float32>>