복붙노트

[PYTHON] Tensorflow Slim : TypeError : 예상되는 int32, 대신 '_Message'유형의 Tensors가있는 목록이 있습니다.

PYTHON

Tensorflow Slim : TypeError : 예상되는 int32, 대신 '_Message'유형의 Tensors가있는 목록이 있습니다.

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에게 새로운 사람이라면 도움이 될 것입니다.

해결법

  1. ==============================

    1.나는 1.0 버전을 사용할 때 같은 문제가 발생하고 이전 버전으로 롤백하지 않아도 작동 할 수 있습니다.

    나는 1.0 버전을 사용할 때 같은 문제가 발생하고 이전 버전으로 롤백하지 않아도 작동 할 수 있습니다.

    문제는 API의 변경으로 인해 발생합니다. 그 토론은 내가 솔루션을 찾는데 도움이되었다 : Google group> TensorFlow의 최근 API 변경 사항

    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)
    

    노트 :

    문제없이 모델을 사용할 수있었습니다. 그러나 나는 아직도 pretrained 무게를 적재하고 싶을 때 과실을 얻었다. 검사 점 파일을 만든 이후 슬림 한 모듈에 몇 가지 변경 사항이있는 것으로 보입니다. 코드에 의해 생성 된 그래프와 검사 점 파일에있는 그래프가 다릅니다.

    노트 2:

    모든 conv2d 레이어에 추가하여 inception_resnet_v2의 프리 트레인 가중치를 사용할 수있었습니다. biases_initializer = None

  2. ==============================

    2.인수의 이름을 명시 적으로 쓰면 문제가 해결됩니다.

    인수의 이름을 명시 적으로 쓰면 문제가 해결됩니다.

    대신에

    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])
    
  3. ==============================

    3.나는 일을했을 때 같은 오류가 발생했습니다.

    나는 일을했을 때 같은 오류가 발생했습니다.

    나는 그것을 발견했다.

    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)입니다.

    코드는 concat 출력 [0] ~ 출력 [9] => 새로운 모양 (640,64)을 얻고 자합니다.

    그러나 "tf.concat"API는 이것을 허용하지 않을 수도 있습니다.

    (train_labels same to this)

    그래서 나는에 쓰다.

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

    그것은 달릴 수있다!

  4. ==============================

    4.나는 대부분의 사람들이 틀린 방식으로 대답하는 것을 발견했다. tf.concat의 변경으로 인한 것입니다. 그것은 다음과 같은 방식으로 작동합니다.

    나는 대부분의 사람들이 틀린 방식으로 대답하는 것을 발견했다. 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], axis = 3,)

    키워드 인수를 전달하는 동안 다른 인수 앞에 있어야한다는 것을 기억하십시오.

  5. from https://stackoverflow.com/questions/41813665/tensorflow-slim-typeerror-expected-int32-got-list-containing-tensors-of-type by cc-by-sa and MIT license