【问题标题】:Modified tensorflow MNIST tutorial code:Error: logits and labels must be same size修改后的tensorflow MNIST教程代码:Error: logits and labels must be the same size
【发布时间】:2017-11-08 17:52:48
【问题描述】:
<!-- language:python--> 
import tensorflow as tf
import numpy as np
from tensorflow.python.ops import rnn, rnn_cell
from tensorflow.contrib.data import Dataset, Iterator

a = [[0.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0], 
               [0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0],
               [1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0], 
               [1.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0]]
b =    [[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],
               [0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0],
               [0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0],
               [0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0]]

hm_epochs = 3
n_classes = 4
batch_size = 4
chunk_size = 8
n_chunks = 4
rnn_size = 128

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

def next_batch(a,b,batchSize):
    return [a for _ in range(batchSize)], [b for _ in range(batchSize)]


def recurrent_neural_network(x):
    layer = {'weights':tf.Variable(tf.random_normal([rnn_size,n_classes])),
         'biases':tf.Variable(tf.random_normal([n_classes]))}

    x = tf.transpose(x)
    x = tf.reshape(x, [-1, chunk_size])
    x = tf.split(x, n_chunks)

   lstm_cell = rnn_cell.BasicLSTMCell(rnn_size,state_is_tuple=True)

   outputs, states = rnn.static_rnn(lstm_cell, x, dtype=tf.float32)

   output = tf.matmul(outputs[-1],layer['weights']) + layer['biases']

   return output

def train_neural_network(x):

   prediction = recurrent_neural_network(x)
   cost = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(logits = 
prediction,labels=y) )
   optimizer = tf.train.AdamOptimizer().minimize(cost)


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

        for epoch in range(hm_epochs):
            epoch_loss = 0.0

            for _ in range((1)):

                epoch_x, epoch_y= 
next_batch(b,a,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:val_signalGen.reshape((-1, 
n_chunks, chunk_size)), y:val_states}))

train_neural_network(x)

我是学习 tensorflow 的初学者。我修改了 MNIST 教程 (https://pythonprogramming.net/rnn-tensorflow-python-machine-learning-tutorial/) 中的代码,将 MNIST 数据集替换为简单的数组。

但是,我运行修改后的代码后,出现如下错误:

  Caused by op 'SoftmaxCrossEntropyWithLogits', defined at:
 File ".\stackOverflowAsk.py", line 78, in <module>
   train_neural_network(x)
 File ".\stackOverflowAsk.py", line 53, in train_neural_network
   cost = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(logits = 
prediction,labels=y) )
  File "C:\Users\yongx\AppData\Local\Programs\Python\Python35\lib\site-
packages\tensorflow\python\ops\nn_ops.py", line 1594, in 
softmax_cross_entropy_with_logits
    precise_logits, labels, name=name)
  File "C:\Users\yongx\AppData\Local\Programs\Python\Python35\lib\site-
packages\tensorflow\python\ops\gen_nn_ops.py", line 2380, in _ 
softmax_cross_entropy_with_logits
    features=features, labels=labels, name=name)
  File "C:\Users\yongx\AppData\Local\Programs\Python\Python35\lib\site-
packages\tensorflow\python\framework\op_def_library.py", line 767, in 
apply_op
   op_def=op_def)
  File "C:\Users\yongx\AppData\Local\Programs\Python\Python35\lib\site-
 packages\tensorflow\python\framework\ops.py", line 2506, in create_op
    original_op=self._default_original_op, op_def=op_def)
  File "C:\Users\yongx\AppData\Local\Programs\Python\Python35\lib\site-
 packages\tensorflow\python\framework\ops.py", line 1269, in __init__
    self._traceback = _extract_stack()
    InvalidArgumentError (see above for traceback): logits and labels must 
be 
same size: logits_size=[4,4] labels_size=[16,8]
         [[Node: SoftmaxCrossEntropyWithLogits = 
SoftmaxCrossEntropyWithLogits[T=DT_FLOAT, 
_device="/job:localhost/replica:0/task:0/gpu:0"](Reshape_1, Reshape_2)]]
         [[Node: Mean/_15 = _Recv[client_terminated=false, 
recv_device="/job:localhost/replica:0/task:0/cpu:0", 
send_device="/job:localhost/replica:0/task:0/gpu:0", 
send_device_incarnation=1, tensor_name="edge_962_Mean", 
tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

我检查了源自数组“a”的“标签”的形状是 (4x4),但为什么结果是 16x8?

感谢所有建议。谢谢。

【问题讨论】:

  • 您能否包含指出哪条线路崩溃的回溯部分?此外,您可以添加“”,它会使您的代码变得漂亮。
  • @TheAtomicOption,注意.. 我添加了回溯日志。我是菜鸟,不知道如何以 ... 的方式放置代码
  • 你得到了重要的部分,“”(不带引号)可以在帖子的任何地方,它表示stackoverflow的CSS来为你的代码着色。也适用于其他语言。当它在代码块之外时,它不会显示,但仍会影响颜色。 :)
  • 有两件事看起来有点奇怪。你没有定义你的 y 占位符是什么形状,所以它一定会在路上的某个地方弄糊涂。你可能想明确地给它一个形状。而且你似乎在倒退训练,你有def next_batch(a,b,batchSize)epoch_x, epoch_y=next_batch(b,a,batch_size)

标签: python tensorflow deep-learning lstm


【解决方案1】:

在您使用 ab 变量之前,错误就发生了。在回溯中,您可以看到它发生在哪里:

Caused by op 'SoftmaxCrossEntropyWithLogits', defined at: 
File ".\stackOverflowAsk.py", line 78, in <module> train_neural_network(x) 
File ".\stackOverflowAsk.py", line 53, in train_neural_network    
    cost = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(logits = prediction, labels = y))

所以你可以看到你的标签实际上来自y——它被初始化为y = tf.placeholder('float')并且从未改变——而不是来自a,因为你永远不会到达你所在的代码点开始使用a。至于为什么y 被视为[16,8],我不确定,因为the docs say the default is Nonethe actual codea wrapper for a binary。但既然你知道你需要的形状,我会尝试使用:y = tf.placeholder('float', shape=(4, 4)) 来明确形状。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    相关资源
    最近更新 更多