2017-07-05 11 views
0

Ich bin neu bei Tensorflow und ich befolge ein Tutorial von Sentdex. Egal wie viele Syntaxprobleme ich behebe, ich bekomme immer den gleichen Fehler.Wie änderst du den Rang von tf.random_normal als Form

ValueError: Shape must be rank 1 but is rank 0 for 
'random_normal_7/RandomStandardNormal' (op: 'RandomStandardNormal') 
with input shapes: [] 

Ich glaube, das Problem ist hier, aber ich habe keine Ahnung, wie es zu beheben ist.

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))} 

Mein ganzer Code ist

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 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.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) 
+0

Haben Sie 'tf.Variable (tf.random_normal ([n_classes])' in Ihren output_layer-Vorlieben versucht? Es scheint, dass die Klammern in Ihrem Code fehlen – Taako

Antwort

0

Das erste Argument für tf.random_normal() (die shape) ein eindimensionaler Tensor oder eine Liste von ganzen Zahlen sein muß, jede Dimension des statistischen Tensor darstellt Länge. Angenommen, n_classes ist eine Ganzzahl, sollte der Fehler behoben werden, indem tf.random_normal(n_classes) durch tf.random_normal([n_classes]) ersetzt wird.

+0

Das hat den Fehler definitiv behoben. Aber ein neuer ist aufgetaucht. Anstatt eines Problems mit dem Rang, bekomme ich einen mit Dimensionen. Der Fehler ist "ValueError: Dimensionen müssen gleich sein, aber sind 784 und 500 für 'MatMul_1' (op: 'MatMul') mit Eingabeformen: [?, 784], [500,500]. " –

+0

Ich denke, das Problem ist, dass man diese Zeile:' l2 = tf.add (tf.matmul (data, hidden_2_layer ['weights']) '', du multiplizierst 'data' mit der Gewichte von Schicht 2, aber stattdessen sollten Sie "l1" mit den Gewichten von Schicht 2 multiplizieren (die Definition von Schicht 3 hat denselben Fehler). – mrry

+0

Ich glaube nicht, dass das das Problem ist. Stattdessen ersetzte ich die Schichten " , "zwischen den Gewichten und Verzerrungen mit einem Pluszeichen. Der gigantische Traceback ist Klage wurde gelöst. Nun bekomme ich einen Typfehler: l1 = tf.add (tf.matmul (data, hidden_1_layer ['gewichte']) + hidden_1_layer ['biases']) TypeError: add() fehlt 1 benötigtes Positionsargument: 'y " –

Verwandte Themen