MatMul在TensorFlow中发布

时间:2017-09-21 12:13:54

标签: python tensorflow neural-network

我试图在TensorFlow中使用4D-numpy数组数据实现多层感知器 我在MatMul函数上遇到了这个问题。 我希望有人可以帮助我,非常感谢你。

ValueError: Shape must be rank 2 but is rank 4 for 'MatMul' (op: 'MatMul') with input shapes: [1500,2,10000,5], [1500,1500].

我的代码是:

# Network Parameters
n_hidden_1 = 1500 # 1st layer number of neurons
n_hidden_2 = 1500 # 2nd layer number of neurons
n_input = 1500 
n_classes = 1500

# tf Graph input
X = tf.placeholder("float", [1500,2,10000,5])
Y = tf.placeholder("float", [1500,1])

# Store layers weight & bias
weights = {
    'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),
    'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
    'out': tf.Variable(tf.random_normal([n_hidden_2, n_classes]))
}
biases = {
    'b1': tf.Variable(tf.random_normal([n_hidden_1])),
    'b2': tf.Variable(tf.random_normal([n_hidden_2])),
    'out': tf.Variable(tf.random_normal([n_classes]))
}


# Create model
def multilayer_perceptron(x):

    layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1'])

    layer_2 = tf.add(tf.matmul(layer_1, weights['h2']), biases['b2'])

    out_layer = tf.matmul(layer_2, weights['out']) + biases['out']
    return out_layer

    # Construct model
    logits = multilayer_perceptron(X)

第二个错误是:

ValueError: Dimension 1 in both shapes must be equal, but are 1500 and 1 for 'cost/SoftmaxCrossEntropyWithLogits' (op: 'SoftmaxCrossEntropyWithLogits') with input shapes: [1500,1500], [1500,1].

代码是:

p_keep_input = tf.placeholder("float", name="p_keep_input")
p_keep_hidden = tf.placeholder("float", name="p_keep_hidden")
py_x = model(X, w_h, w_h2, w_o, p_keep_input, p_keep_hidden)

with tf.name_scope("cost"):
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=py_x, labels=Y))
    train_op = tf.train.RMSPropOptimizer(0.001, 0.9).minimize(cost)

1 个答案:

答案 0 :(得分:1)

对于密集图层,通常首先将输入数据重新整形为每个样本一行,因此[nSamples, nFeatures]矩阵(具有2个维度,而不是4个),因为您不会使用该结构。只有这样才能使MatMul正确发生(它现在是两个2D矩阵的乘法)。

我想这里nSamples = n_inputs = 1500nFeatures = 2*10000*5。在这种情况下,请注意h1需要成形[nFeatures, n_hidden_1]

n_features = 2*10000*5
weights = {
    'h1': tf.Variable(tf.random_normal([n_features, n_hidden_1])),
    'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
    'out': tf.Variable(tf.random_normal([n_hidden_2, n_classes]))
}

...

def multilayer_perceptron(x):
    x_reshaped = tf.reshape(x, [None, n_features])
    layer_1 = tf.add(tf.matmul(x_reshaped, weights['h1']), biases['b1'])

顺便说一句,为了便于调试,你应该使用不同的n_inputs,n_hidden,n_classes(你可能没有选择n_classes但你可以改变其他的),这样你就可以更容易地理解整形错误(而在这里,当你看到1500的形状时,你不会立刻知道它的来源,所以它更令人困惑,甚至可能是因为不好的原因并且以后会引起麻烦。)

回答第二个问题(编辑):

tf.nn.softmax_cross_entropy_with_logits期望同一[n_samples,n_classes]形状的logits和标签,标签是一样的热编码就像logits一样(除了它们通常只包含一个1和0) 。如果Y是形状[n_samples,1],那么我希望它只包含每个样本的类索引。在这种情况下,你应该使用sparse_softmax_cross_entropy_with_logits代替,而Y应该仅仅是形状[n_samples] ,而不是[n_samples, 1]