tensorflow的tf.in_top_k()错误

本文探讨了在使用TensorFlow进行图像识别时遇到的一个常见错误:InTopK操作中的目标越界问题。通过分析错误来源及调整标签数据,解决了分类任务中的训练障碍。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我在TensorFlow图像识别学习中,遇到的困难!!!


错误:

Traceback (most recent call last):
  File "as1_train.py", line 199, in <module>
    main()
  File "as1_train.py", line 174, in main
    run_training()
  File "as1_train.py", line 68, in run_training
    summary_str = sess.run(summary_op)
  File "/home/mrzhang/anaconda2/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 895, in run
    run_metadata_ptr)
  File "/home/mrzhang/anaconda2/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1124, in _run
    feed_dict_tensor, options, run_metadata)
  File "/home/mrzhang/anaconda2/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1321, in _do_run
    options, run_metadata)
  File "/home/mrzhang/anaconda2/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1340, in _do_call
    raise type(e)(node_def, op, message)
tensorflow.python.framework.errors_impl.InvalidArgumentError: targets[20] is out of range
[[Node: accuracy/InTopK = InTopK[T=DT_INT32, k=1, _device="/job:localhost/replica:0/task:0/cpu:0"](softmax_linear/softmax_linear_1/_5333, Reshape_1/_5335)]]


Caused by op u'accuracy/InTopK', defined at:
  File "as1_train.py", line 199, in <module>
    main()
  File "as1_train.py", line 174, in main
    run_training()
  File "as1_train.py", line 40, in run_training
    train_acc = as1_model.evaluation(train_logits,label_batch)
  File "/home/mrzhang/xin/py3/test/as1_model.py", line 135, in evaluation
    correct = tf.nn.in_top_k(logits, labels, 1)
  File "/home/mrzhang/anaconda2/lib/python2.7/site-packages/tensorflow/python/ops/gen_nn_ops.py", line 1466, in in_top_k
    targets=targets, k=k, name=name)
  File "/home/mrzhang/anaconda2/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 767, in apply_op
    op_def=op_def)
  File "/home/mrzhang/anaconda2/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2630, in create_op
    original_op=self._default_original_op, op_def=op_def)
  File "/home/mrzhang/anaconda2/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1204, in __init__
    self._traceback = self._graph._extract_stack()  # pylint: disable=protected-access


InvalidArgumentError (see above for traceback): targets[20] is out of range
[[Node: accuracy/InTopK = InTopK[T=DT_INT32, k=1, _device="/job:localhost/replica:0/task:0/cpu:0"](softmax_linear/softmax_linear_1/_5333, Reshape_1/_5335)]]



找了好久,终于找到错误原因,不过并没有解决!!

可以参考:https://stackoverflow.com/questions/38881918/tensorflow-tf-nn-in-top-k-targets-out-of-range-error

上面大意是:比如我分类8类,如果我的标签labels是(1,2,3,4,6,7,8,9),就会出现上面的错误;必须改成(1,2,3,4,5,6,7,8);然而我遇到的问题是必须从0开始,即标签必须是(0,1,2,3,4,5,6,7)。然后可以训练了。


为什么会出现这个错误?还没有找到原因,原文中说:it`s an issue

有兴趣的可以去找找原因!!!












def conv2d(input_, output_dim, k_h=5, k_w=5, d_h=2, d_w=2, stddev=0.02, # 标准差0.02 #卷积核大小和步长 name="conv2d", padding='REFLECT'): with tf.variable_scope(name): # reflect padding反射填充 if padding == 'REFLECT': in_height, in_width = input_.get_shape().as_list()[1:3] #从形状元组中获取索引为 1 和 2 的维度大小,即高度和宽度。 if (in_height % d_h == 0): pad_along_height = max(k_h - d_h, 0) else: pad_along_height = max(k_h - (in_height % d_h), 0) if (in_width % d_w == 0): pad_along_width = max(k_w - d_w, 0) else: pad_along_width = max(k_w - (in_width % d_w), 0) #算出宽度和高度可填充像素数 pad_top = pad_along_height // 2 pad_bottom = pad_along_height - pad_top pad_left = pad_along_width // 2 pad_right = pad_along_width - pad_left #可填充像素上下分配 input_ = tf.pad(input_, [[0, 0], [pad_top, pad_bottom], [pad_left, pad_right], [0, 0]], "REFLECT")#按上述参数进行反射填充 padding = 'VALID' #不进行额外填充 w = tf.get_variable('w', [k_h, k_w, input_.get_shape()[-1], output_dim], #卷积核高度宽度,输入通道数,输出通道数 initializer=tf.truncated_normal_initializer(stddev=stddev))#使用了截断正态分布初始化器(truncated normal initializer) conv = tf.nn.conv2d(input_, w, strides=[1, d_h, d_w, 1], padding=padding) #进行二维卷积操作 biases = tf.get_variable('biases', [output_dim], initializer=tf.constant_initializer(0.0)) #创建一个可训练变量,初始化偏执为0.0 # conv = tf.reshape(tf.nn.bias_add(conv, biases), conv.get_shape()) conv = tf.nn.bias_add(conv, biases) return conv在这个卷积层定义中加入膨胀卷积
最新发布
03-19
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值