为什么我得到这个ValueError?

时间:2017-05-12 16:26:31

标签: python error-handling tensorflow

所以这是我的完整理解代码: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。

1 个答案:

答案 0 :(得分:1)

我们知道MatMul操作是经典的矩阵乘法运算,所以如果我们想要将M1M2两个矩阵相乘,形状AxB和{分别为{1}},当我们想要乘法时,我们应该有相同的形状BxC

B会生成一个形状为M1 x M2的矩阵R

因此,在您的情况下,您尝试将两个矩阵与形状AxC4x1相乘,因此它会抛出形状问题的错误,您应该转置第一个张量,然后您有:

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)

看到形状,然后你可以修改你的形状和输入。

祝你好运。