2016-12-31 6 views
0

Ich bin neu bei TensorFlow und versuche, einen Algorithmus zu schreiben, um Bilder im CIFAR-10-Datensatz zu klassifizieren. Ich erhalte diese Fehlermeldung:tf.nn.softmax_cross_entropy_with_logits() Fehler: Logs und Labels müssen die gleiche Größe haben

InvalidArgumentError (see above for traceback): logits and labels must be same size: logits_size=[10000,10] labels_size=[1,10000] 
    [[Node: SoftmaxCrossEntropyWithLogits = SoftmaxCrossEntropyWithLogits[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](Reshape, Reshape_1)]] 

Hier mein Code:

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

n_nodes_hl1 = 500 
n_nodes_hl2 = 500 
n_nodes_hl3 = 500 

n_classes = 10 
batch_size = 100 
image_size = 32*32*3 # because 3 channels 

x = tf.placeholder('float', shape=(None, image_size)) 
y = tf.placeholder('float') 

def neural_network_model(data): 
    hidden_1_layer = {'weights':tf.Variable(tf.random_normal([image_size, 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(I am new to TensorFlow and tf.random_normal([n_nodes_hl3, n_classes])), 'biases':tf.Variable(tf.random_normal([n_classes]))} 
    # input_data * weights + biases 
    l1 = tf.add(tf.matmul(data, hidden_1_layer['weights']), hidden_1_layer['biases']) 
    # activation function 
    l1 = tf.nn.relu(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.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(prediction, y))//THIS IS LINE 48 WHERE THE ERROR OCCURS 
    #learning rate = 0.001 
    optimizer = tf.train.AdamOptimizer().minimize(cost) 
    hm_epochs = 10 
    with tf.Session() as sess: 
     sess.run(tf.initialize_all_variables()) 
     for epoch in range(hm_epochs): 
      epoch_loss = 0 
      for i in range(5): 
       with open('data_batch_'+str(i+1),'rb') as f: 
        train_data = cPickle.load(f) 
       print train_data 
       print prediction.get_shape() 
       #print len(y) 
       _, c = sess.run([optimizer, cost], feed_dict={x:train_data['data'],y:train_data['labels']}) 
       epoch_loss += c 
      print 'Epoch ' + str(epoch) + ' completed out of ' + str(hm_epochs) + ' loss: ' + str(epoch_loss) 
     correct = tf.equal(tf.argmax(prediction,1), tf.argmax(y,1)) 
     accuracy = tf.reduce_mean(tf.cast(correct, 'float')) 
     with open('test_batch','rb') as f: 
      test_data = cPickle.load(f) 
      accuracy = accuracy.eval({x:test_data['data'],y:test_data['labels']}) 
     print 'Accuracy: ' + str(accuracy) 

train_neural_network(x) 

Ich bin mir ziemlich sicher, dass dies bedeutet, dass in der Leitung 48 (siehe oben) prediction und y ist nicht die gleiche Form, aber Ich verstehe TensorFlow nicht gut genug, um zu wissen, wie ich es beheben kann. Ich verstehe nicht einmal wirklich, wo y gesetzt wird, ich habe den Großteil dieses Codes aus einem Tutorial und fiedelte damit, um es auf einen anderen Datensatz anzuwenden. Wie kann ich diesen Fehler beheben?

Antwort

2

Die tf.nn.softmax_cross_entropy_with_logits(logits, labels) op erwartet ihre logits und labels Argumente als Tensoren mit der gleichen Form. Außerdem sollten die Argumente logits und labels 2-D-Tensoren (Matrizen) mit batch_size Zeilen und num_classes Spalten sein.

Von der Fehlermeldung und die Größe der logits, vermute ich, dass batch_size 10000 ist, und num_classes ist 10. Von der Größe von labels, vermute ich, dass Ihre Etikett als eine Liste von ganzen Zahlen kodiert werden, wo Die ganze Zahl repräsentiert den Index der Klasse für das entsprechende Eingabebeispiel. (Ich habe erwartet, dass dies ein tf.int32 Wert zu sein, anstatt tf.float32, wie es in Ihrem Programm zu sein scheint, aber vielleicht gibt es einige automatische Konvertierung geht.)

In TensorFlow, können Sie die tf.nn.sparse_softmax_cross_entropy_with_logits() verwenden zu berechnen Kreuz-Entropie auf Daten in dieser Form. In Ihrem Programm, können Sie dies tun, indem anstelle der cost Berechnung mit.

cost = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
    prediction, tf.squeeze(y))) 

Beachten Sie, dass die tf.squeeze() op benötigt wird y in einen Vektor der Länge batch_size (zu konvertieren, um ein gültiges Argument zu tf.nn.sparse_softmax_cross_entropy_with_logits() sein

+0

ich habe 'tf.squeeze()' und noch immer bin der gleiche Fehler –

+0

Haben Sie auch swi tch an 'tf.nn.sparse_softmax_cross_entropy_with_logits()'? – mrry

+0

Habe das nicht gesehen, danke. Jetzt bekomme ich 'TypeError: DataType float32 für attr 'Tlabels' nicht in der Liste der erlaubten Werte: int32, int64 'Ich denke, das hängt damit zusammen, worüber du geredet hast. Kann ich einfach 'y = tf.placeholder ('float')' in 'y = tf.placeholder ('int')' '? –

1

Hier sind einige Aktualisierungen der Code TensorFlow Version 1.0 zu unterstützen:

def train_neural_network(x): <br> 
&emsp;prediction = neural_network_model(x) <br> 
&emsp;# OLD VERSION: <br> 
&emsp;cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(prediction,y)) <br> 
&emsp;# NEW:<br> 
&emsp;cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=y))<br> 
&emsp;optimizer = tf.train.AdamOptimizer().minimize(cost) <br> 
&emsp;hm_epochs = 10 <br> 
&emsp;with tf.Session() as sess: <br> 
&emsp;&emsp;#OLD: #sess.run(tf.initialize_all_variables()) <br> 
&emsp;&emsp;#NEW:<br> 
&emsp;&emsp;sess.run(tf.global_variables_initializer()) 
Verwandte Themen