【问题标题】:Tensorflow Slim: TypeError: Expected int32, got list containing Tensors of type '_Message' insteadTensorflow Slim:TypeError:预期 int32,得到的列表包含类型为“_Message”的张量
【发布时间】:2017-06-08 09:28:19
【问题描述】:

我正在关注 this 学习 TensorFlow Slim 的教程,但在运行以下 Inception 代码时:

import numpy as np
import os
import tensorflow as tf
import urllib2

from datasets import imagenet
from nets import inception
from preprocessing import inception_preprocessing

slim = tf.contrib.slim

batch_size = 3
image_size = inception.inception_v1.default_image_size
checkpoints_dir = '/tmp/checkpoints/'
with tf.Graph().as_default():
    url = 'https://upload.wikimedia.org/wikipedia/commons/7/70/EnglishCockerSpaniel_simon.jpg'
    image_string = urllib2.urlopen(url).read()
    image = tf.image.decode_jpeg(image_string, channels=3)
    processed_image = inception_preprocessing.preprocess_image(image, image_size, image_size, is_training=False)
    processed_images  = tf.expand_dims(processed_image, 0)

    # Create the model, use the default arg scope to configure the batch norm parameters.
    with slim.arg_scope(inception.inception_v1_arg_scope()):
        logits, _ = inception.inception_v1(processed_images, num_classes=1001, is_training=False)
    probabilities = tf.nn.softmax(logits)

    init_fn = slim.assign_from_checkpoint_fn(
        os.path.join(checkpoints_dir, 'inception_v1.ckpt'),
        slim.get_model_variables('InceptionV1'))

    with tf.Session() as sess:
        init_fn(sess)
        np_image, probabilities = sess.run([image, probabilities])
        probabilities = probabilities[0, 0:]
        sorted_inds = [i[0] for i in sorted(enumerate(-probabilities), key=lambda x:x[1])]

    plt.figure()
    plt.imshow(np_image.astype(np.uint8))
    plt.axis('off')
    plt.show()

    names = imagenet.create_readable_names_for_imagenet_labels()
    for i in range(5):
        index = sorted_inds[i]
        print('Probability %0.2f%% => [%s]' % (probabilities[index], names[index]))

我似乎遇到了这组错误:

Traceback (most recent call last):
  File "DA_test_pred.py", line 24, in <module>
    logits, _ = inception.inception_v1(processed_images, num_classes=1001, is_training=False)
  File "/home/deepankar1994/Desktop/MTP/TensorFlowEx/TFSlim/models/slim/nets/inception_v1.py", line 290, in inception_v1
    net, end_points = inception_v1_base(inputs, scope=scope)
  File "/home/deepankar1994/Desktop/MTP/TensorFlowEx/TFSlim/models/slim/nets/inception_v1.py", line 96, in inception_v1_base
    net = tf.concat(3, [branch_0, branch_1, branch_2, branch_3])
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/array_ops.py", line 1053, in concat
    dtype=dtypes.int32).get_shape(
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 651, in convert_to_tensor
    as_ref=False)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 716, in internal_convert_to_tensor
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/constant_op.py", line 176, in _constant_tensor_conversion_function
    return constant(v, dtype=dtype, name=name)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/constant_op.py", line 165, in constant
    tensor_util.make_tensor_proto(value, dtype=dtype, shape=shape, verify_shape=verify_shape))
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_util.py", line 367, in make_tensor_proto
    _AssertCompatible(values, dtype)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_util.py", line 302, in _AssertCompatible
    (dtype.name, repr(mismatch), type(mismatch).__name__))
TypeError: Expected int32, got list containing Tensors of type '_Message' instead.

这很奇怪,因为所有这些代码都来自他们的官方指南。我是 TF 的新手,如有任何帮助,我们将不胜感激。

【问题讨论】:

  • 回滚到 TF 版本 0.11 似乎摆脱了错误。

标签: python machine-learning tensorflow computer-vision deep-learning


【解决方案1】:

我发现大多数人的回答都是错误的。这只是由于 tf.concat 的变化。 它以下列方式工作。

net = tf.concat(3, [branch_0, branch_1, branch_2, branch_3])

使用下面的

net = tf.concat(values=[branch_0, branch_1, branch_2, branch_3],axis=3,)

记住,传递关键字参数时应该在其他参数之前。

【讨论】:

    【解决方案2】:

    我在使用 1.0 版本时遇到了同样的问题,我可以让它工作而不必回滚到以前的版本。

    这个问题是由于 api 的变化引起的。那次讨论帮助我找到了解决方案:Google group > Recent API Changes in TensorFlow

    你只需要用 tf.concat 更新所有的行

    例如

    net = tf.concat(3, [branch_0, branch_1, branch_2, branch_3])
    

    应该改为

    net = tf.concat([branch_0, branch_1, branch_2, branch_3], 3)
    

    注意:

    我能够毫无问题地使用这些模型。但是之后我想加载预训练的重量时仍然出错。 自从他们制作了检查点文件以来,似乎 slim 模块发生了一些变化。代码创建的图形与检查点文件中存在的图形不同。

    注2:

    我能够通过添加到所有 conv2d 层 biases_initializer=None 来使用 inception_resnet_v2 的预训练权重

    【讨论】:

    • 我认为这应该颠倒过来?不? tf.concat(concat_dim, values, name='concat')
    • 在 tensorflow r1.0 上它发生了变化,我将编辑我的帖子以准确地确定我使用的版本。
    【解决方案3】:

    明确写出参数的名称可以解决问题。

    而不是

    net = tf.concat(3, [branch_0, branch_1, branch_2, branch_3])
    

    使用

    net = tf.concat(axis=3, values=[branch_0, branch_1, branch_2, branch_3])
    

    【讨论】:

      【解决方案4】:

      我在做这项工作时遇到了同样的错误。

      我发现了

      logits = tf.nn.xw_plus_b(tf.concat(outputs, 0), w, b)
      loss = tf.reduce_mean(
        tf.nn.softmax_cross_entropy_with_logits(
          labels=tf.concat(train_labels, 0), logits=logits))
      

      输出是shape=(10, 64, 64)

      代码希望将输出[0] 连接到输出[9] => 获得一个新形状(640,64)。

      但“tf.concat”API 可能不允许这样做。

      (train_labels 与此相同)

      所以我写信给

      A = tf.concat(0,[outputs[0],outputs[1]])
      A = tf.concat(0,[A,outputs[2]])
      A = tf.concat(0,[A,outputs[3]])
      A = tf.concat(0,[A,outputs[4]])
      A = tf.concat(0,[A,outputs[5]])
      A = tf.concat(0,[A,outputs[6]])
      A = tf.concat(0,[A,outputs[7]])
      A = tf.concat(0,[A,outputs[8]])
      A = tf.concat(0,[A,outputs[9]])
      B = tf.concat(0,[train_labels[0],train_labels[1]])
      B = tf.concat(0,[B,train_labels[2]])
      B = tf.concat(0,[B,train_labels[3]])
      B = tf.concat(0,[B,train_labels[4]])
      B = tf.concat(0,[B,train_labels[5]])
      B = tf.concat(0,[B,train_labels[6]])
      B = tf.concat(0,[B,train_labels[7]])
      B = tf.concat(0,[B,train_labels[8]])
      B = tf.concat(0,[B,train_labels[9]])
      
      logits = tf.nn.xw_plus_b(tf.concat(0, A), w, b)
      loss = tf.reduce_mean(
        tf.nn.softmax_cross_entropy_with_logits(
          labels=tf.concat(0, B), logits=logits))
      

      它可以运行!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-29
        • 2018-05-08
        • 1970-01-01
        • 2017-12-14
        • 1970-01-01
        • 2020-11-21
        • 2020-10-17
        相关资源
        最近更新 更多