2016-12-31 51 views
0

我是TensorFlow的新手,我正在尝试编写一个算法来对CIFAR-10数据集中的图像进行分类。我收到此错误:tf.nn.softmax_cross_entropy_with_logits()错误:logits和标签必须大小相同

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

这里是我的代码:

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) 

我敢肯定,这意味着在48行(如上图所示)predictiony是不一样的形状,但我不明白TensorFlow足够知道如何解决它。我甚至不知道在哪里设置了y,我从教程中获得了大部分代码,并将其用于应用于不同的数据集。我该如何解决这个错误?

回答

2

tf.nn.softmax_cross_entropy_with_logits(logits, labels) op预计它的参数logitslabels是具有相同形状的张量。此外,参数logitslabels应为二维张量(矩阵),行数为batch_size,列数为num_classes

从错误信息和logits,我猜batch_size为10000大小,num_classes是10从labels的大小,我猜你的标签编码为整数,其中的列表该整数表示相应输入示例的类的索引。 (我会想到这是一个tf.int32值,而不是tf.float32,因为它似乎是在你的程序,但也许有一些自动转换回事。)

在TensorFlow,你可以使用tf.nn.sparse_softmax_cross_entropy_with_logits()计算交叉熵这种形式的数据。在你的程序中,你可以通过更换cost计算这样做:

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

注意,tf.squeeze()运算是需要y转换成长度batch_size(向量以是tf.nn.sparse_softmax_cross_entropy_with_logits()有效的参数

+0

我接着说:tf.squeeze()'和我仍然得到同样的错误 –

+0

你怎么也SWI tch to'tf.nn.sparse_softmax_cross_entropy_with_logits()'? – mrry

+0

没有看到,谢谢。现在我得到'TypeError:DataType float32 attr'Tlabels'不在允许值列表中:int32,int64'我认为这与你所谈论的有关。我可以将'y = tf.placeholder('float')'改成'y = tf.placeholder('int')'吗? –

1

这里有一些更新代码来支持TensorFlow 1.0版:

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()) 
相关问题