我试图将一组向量与相应的矩阵相乘,并希望在结尾处对得到的向量求和。作为一个笨拙的例子,我们假设我们有20个矢量和矩阵分别为10x1和150x1:
import numpy as np
np_b=[ np.random.rand(10) for i in range(20)]
np_A=[ np.random.rand(150,10) for i in range(20)]
#first we multiply each vector with it's corresponding matrix
np_allMuls=np.array([np.dot(np_A[i],np_b[i]) for i in range(20)] )
#then we sum all of the vectors to get the 150 dimensional sum vector
np_allSum=np.sum( np_allMuls,axis=0 )
到目前为止,我已经得到张量流0.10:
import tensorflow as tf
tf_b = tf.placeholder("float", [None,10])
tf_A= tf.placeholder("float", [None,150,10])
#the following gives me ValueError: Shape (?, 150, 10) must have rank 2
tf_allMuls=tf.matmul(tf_A,tf_b)
但是这个符号乘法给出了错误“ValueError:Shape(?,150,10)必须具有等级2”。
有谁知道为什么我收到这样的错误消息?我怎样才能正确获得tf_allMuls?
答案 0 :(得分:1)
来自tf.matmul的文档:
输入必须是矩阵(或等级> 2的张量,代表 批次的矩阵,具有匹配的内部尺寸,可能在之后 转置。
考虑到您使用None
作为占位符的第一个参数,第二个选项与您相关,即“批量矩阵”。但是你的tf_b
是一批向量,而不是矩阵,所以两个矩阵的等级不一样,这就是你得到错误的原因。您应该使用:
tf_b = tf.placeholder("float", [None, 10, 1])
tf_A = tf.placeholder("float", [None, 150, 10])
tf_allMuls = tf.matmul(tf_A, tf_b)
因此似乎matmul
无法广播(可能会检查此post)并且我同意您收到的错误消息有点误导。
这是一个简单的例子:
tf_b = tf.placeholder("float", [None, 3, 1])
tf_A = tf.placeholder("float", [None, 3, 3])
tf_allMuls = tf.matmul(tf_A, tf_b)
with tf.Session() as sess:
b = np.array([1, 2, 3])[np.newaxis, :, np.newaxis]
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])[np.newaxis, ...]
muls = sess.run(tf_allMuls, feed_dict={tf_b: b, tf_A: A})
print muls
打印
[[[ 14.]
[ 32.]
[ 50.]]]
另请注意,tf.matmul
的参数顺序很重要,就像您习惯于实际矩阵乘法一样。所以虽然这个
tf_b = tf.placeholder("float", [None, 1, 3])
tf_A = tf.placeholder("float", [None, 3, 3])
tf_allMuls = tf.matmul(tf_A, tf_b)
不工作,以下会(当然,它不是计算相同的东西,但它不会引发错误):
tf_b = tf.placeholder("float", [None, 1, 3])
tf_A = tf.placeholder("float", [None, 3, 3])
tf_allMuls = tf.matmul(tf_b, tf_A)