所以这是我的完整理解代码:https://hastebin.com/qigimomika.py
所以基本上我遇到以下几行问题:
一点背景:
def weight_variable(shape):
initial = tensorflow.truncated_normal(shape, stddev=0.01)
return tensorflow.Variable(initial)
def bias_variable(shape):
initial = tensorflow.constant(0.01, shape=shape)
return tensorflow.Variable(initial)
w_layer1 = weight_variable([4, 32])
b_layer1 = bias_variable([32])
input_layer = tensorflow.placeholder("float", [4])
产生错误的行:
h_layer1 = tensorflow.add(tensorflow.matmul(input_layer, w_layer1),b_layer1)
当我运行整个代码(上面的代码)时,它会产生以下ValueError
ValueError: Shape must be rank 2 but is rank 1 for 'MatMul' (op: 'MatMul')
with input shapes: [4], [4,32].
现在我的问题:会发生什么,我该如何避免这种情况?
感谢您的关注
编辑 :感谢Prune和Ali Abbasi。
我的解决方案:我将input_layer更改为:
input_layer = tensorflow.placeholder("float", [1, 4])
问题是我的第一个数组是张量流等级1([4])和我的第二个数组等级2([4,32])。所以我添加了这一行:
state = [state]
表示输入状态为:
output_layer.eval(feed_dict={input_layer : state})
状态最初是[1,2,3,4](等级1),现在是[[1,2,3,4]](等级2)。
感谢
EDIT2: 好的,自上次编辑后我改变了很多。我迷失了记录它们的变化。如果你想看到我的代码here,那就是。我知道他妈的很乱。现在,我很高兴,狗屎正在运作:“D。你将无法理解我的代码,这是一团糟,但我只是想记录当前的状态。一个很大的 谢谢 至 Ali Abbasi :D。
答案 0 :(得分:1)
我们知道MatMul
操作是经典的矩阵乘法运算,所以如果我们想要将M1
和M2
两个矩阵相乘,形状AxB
和{分别为{1}},当我们想要乘法时,我们应该有相同的形状BxC
:
B
会生成一个形状为M1 x M2
的矩阵R
。
因此,在您的情况下,您尝试将两个矩阵与形状AxC
和4x1
相乘,因此它会抛出形状问题的错误,您应该转置第一个张量,然后您有:
4x32
MatMul 1x4
会产生4x32
矩阵。
您的代码在这里:
1x32
像这样使用:
h_layer1 = tensorflow.add(tensorflow.matmul(input_layer, w_layer1),b_layer1)
有关更详细的答案,您可以在每个阶段打印张量的形状,如:
h_layer1 = tensorflow.add(tensorflow.matmul(tf.transpose(input_layer), w_layer1),b_layer1)
看到形状,然后你可以修改你的形状和输入。
祝你好运。