2017-07-06 463 views
2

我是tensorflow的新手,我关注senddex的教程。我不断收到错误 -ValueError:尺寸必须相同,但是对于'MatMul_1'(op:'MatMul'),其输入形状为[784]和500 [],[784],[500,500]

ValueError: Dimensions must be equal, but are 784 and 500 for 
'MatMul_1' (op: 'MatMul') with input shapes: [?,784], [500,500]. 

,我认为这是导致该问题的是该片段 -

l1 = tf.add(tf.matmul(data, hidden_1_layer['weights']), 
hidden_1_layer['biases']) 
l1 = tf.nn.relu(l1) 

l2 = tf.add(tf.matmul(data, hidden_2_layer['weights']), 
hidden_2_layer['biases']) 
l2 = tf.nn.relu(l2) 

l3 = tf.add(tf.matmul(data, hidden_3_layer['weights']), 
hidden_3_layer['biases']) 
l3 = tf.nn.relu(l3) 

output = tf.add(tf.matmul(l3, output_layer['weights']), 
output_layer['biases']) 

return output 

虽然我是一个菜鸟,可能是错误的。我的整个代码是 -

mnist = input_data.read_data_sets("/tmp/ data/", one_hot=True) 

n_nodes_hl1 = 500 
n_nodes_hl2 = 500 
n_nodes_hl3 = 500 

n_classes = 10 
batch_size = 100 

x = tf.placeholder('float', [None, 784]) 
y = tf.placeholder('float') 


def neural_network_model(data): 
hidden_1_layer = {'weights': tf.Variable(tf.random_normal([784, 
n_nodes_hl1])), 
        'biases': 
tf.Variable(tf.random_normal([n_nodes_hl1]))} 

hidden_2_layer = {'weights': 
tf.Variable(tf.random_normal([n_nodes_hl1, n_nodes_hl2])), 
        'biases': 
tf.Variable(tf.random_normal([n_nodes_hl2]))} 

hidden_3_layer = {'weights': 
tf.Variable(tf.random_normal([n_nodes_hl2, n_nodes_hl3])), 
        'biases': 
tf.Variable(tf.random_normal([n_nodes_hl3]))} 

output_layer = {'weights': tf.Variable(tf.random_normal([n_nodes_hl3, 
n_classes])), 
       'biases': tf.Variable(tf.random_normal([n_classes]))} 

l1 = tf.add(tf.matmul(data, hidden_1_layer['weights']), 
hidden_1_layer['biases']) 
l1 = tf.nn.relu(l1) 

l2 = tf.add(tf.matmul(data, hidden_2_layer['weights']), 
hidden_2_layer['biases']) 
l2 = tf.nn.relu(l2) 

l3 = tf.add(tf.matmul(data, hidden_3_layer['weights']), 
hidden_3_layer['biases']) 
l3 = tf.nn.relu(l3) 

output = tf.add(tf.matmul(l3, output_layer['weights']), 
output_layer['biases']) 

return output 


def train_neural_network(x): 
prediction = neural_network_model(x) 
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits 
(logits=prediction, labels=y)) 
optimizer = tf.train.AdamOptimizer().minimize(cost) 

hm_epochs = 10 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 

    for epoch in range(hm_epochs): 
     epoch_loss = 0 
     for _ in range(int(mnist.train.num_examples/batch_size)): 
      epoch_x, epoch_y = mnist.train.next_batch(batch_size) 
      _, c = sess.run([optimizer, cost], feed_dict={x: epoch_x, 
y: epoch_y}) 
      epoch_loss += c 
     print('Epoch', epoch, 'completed out of', hm_epochs, 'loss:', 
epoch_loss) 

    correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1)) 
    accuracy = tf.reduce_mean(tf.cast(correct, 'float')) 
    print('Accuracy:', accuracy.eval({x: mnist.test.images, y: 
mnist.test.labels})) 


train_neural_network(x) 

请帮忙。顺便说一下,我使用Python 3.6.1和Tensorflow 1.2在虚拟环境中运行Mac。我正在使用IDE Pycharm CE。如果有任何信息是有用的。

+0

请修复您的缩进,因为它是,我无法甚至运行代码尝试并复制错误 –

+0

我会在'neural_network_model'的每一行之间的'print(l1.get_shape()。as_list())'中加入以试图找出问题所在。 – finbarr

回答

3

问题是,您正在参考data而不是l1。取而代之的

l2 = tf.add(tf.matmul(data, hidden_2_layer['weights']), 
         hidden_2_layer['biases']) 

你的代码应该阅读

l2 = tf.add(tf.matmul(l1, hidden_2_layer['weights']), 
         hidden_2_layer['biases']) 

,并同上,用于l3。取而代之的

l3 = tf.add(tf.matmul(data, hidden_3_layer['weights']), 
         hidden_3_layer['biases']) 

你应该有

l3 = tf.add(tf.matmul(l2, hidden_3_layer['weights']), 
         hidden_3_layer['biases']) 

下面的代码运行,没有错误我:

import tensorflow as tf 
from tensorflow.examples.tutorials.mnist import input_data 

mnist = input_data.read_data_sets("/tmp/data/", one_hot=True) 

n_nodes_hl1 = 500 
n_nodes_hl2 = 500 
n_nodes_hl3 = 500 

n_classes = 10 
batch_size = 100 

x = tf.placeholder('float', [None, 784]) 
y = tf.placeholder('float') 

def print_shape(obj): 
    print(obj.get_shape().as_list()) 

def neural_network_model(data): 
    hidden_1_layer = {'weights': tf.Variable(tf.random_normal([784, 
                   n_nodes_hl1])), 
         'biases': 
         tf.Variable(tf.random_normal([n_nodes_hl1]))} 

    hidden_2_layer = {'weights': 
         tf.Variable(tf.random_normal([n_nodes_hl1, n_nodes_hl2])), 
         'biases': 
         tf.Variable(tf.random_normal([n_nodes_hl2]))} 

    hidden_3_layer = {'weights': 
         tf.Variable(tf.random_normal([n_nodes_hl2, n_nodes_hl3])), 
         'biases': 
         tf.Variable(tf.random_normal([n_nodes_hl3]))} 

    output_layer = {'weights': tf.Variable(tf.random_normal([n_nodes_hl3, 
                  n_classes])), 
        'biases': tf.Variable(tf.random_normal([n_classes]))} 
    print_shape(data) 
    l1 = tf.add(tf.matmul(data, hidden_1_layer['weights']), 
       hidden_1_layer['biases']) 
    print_shape(l1) 
    l1 = tf.nn.relu(l1) 
    print_shape(l1) 
    l2 = tf.add(tf.matmul(l1, hidden_2_layer['weights']), 
       hidden_2_layer['biases']) 
    l2 = tf.nn.relu(l2) 

    l3 = tf.add(tf.matmul(l2, hidden_3_layer['weights']), 
       hidden_3_layer['biases']) 
    l3 = tf.nn.relu(l3) 

    output = tf.add(tf.matmul(l3, output_layer['weights']), 
        output_layer['biases']) 

    return output 


def train_neural_network(x): 
    prediction = neural_network_model(x) 
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits 
          (logits=prediction, labels=y)) 
    optimizer = tf.train.AdamOptimizer().minimize(cost) 

    hm_epochs = 10 

    with tf.Session() as sess: 
     sess.run(tf.global_variables_initializer()) 

     for epoch in range(hm_epochs): 
      epoch_loss = 0 
      for _ in range(int(mnist.train.num_examples/batch_size)): 
       epoch_x, epoch_y = mnist.train.next_batch(batch_size) 
       _, c = sess.run([optimizer, cost], feed_dict={x: epoch_x, 
                   y: epoch_y}) 
       epoch_loss += c 
      print('Epoch', epoch, 'completed out of', hm_epochs, 'loss:', 
        epoch_loss) 

     correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1)) 
     accuracy = tf.reduce_mean(tf.cast(correct, 'float')) 
     print('Accuracy:', accuracy.eval({x: mnist.test.images, y: 
              mnist.test.labels})) 


train_neural_network(x) 
+1

它完美的工作,谢谢。 –

+0

不用担心:)如果你喜欢我的回答,你能接受吗? – finbarr

+1

对不起,忘记了。 :) –

相关问题