web-dev-qa-db-fra.com

Tensorflow Slim: TypeError: int32 prévu, liste contenant les tenseurs de type '_Message' à la place

Je suis le this tutoriel pour apprendre TensorFlow Slim, mais après avoir exécuté le code suivant pour 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]))

Il semble que je reçois cet ensemble d'erreurs:

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.

C'est étrange car tout ce code provient de leur guide officiel. Je suis nouveau à TF et toute aide serait appréciée.

28
Deepankar Arya

J'ai eu le même problème avec la version 1.0 publiée et je pouvais le faire fonctionner sans avoir à revenir sur une version précédente.

Le problème est causé par le changement de l’API. Cette discussion m'a aidé à trouver la solution: Groupe Google> Modifications récentes de l'API dans TensorFlow

Il vous suffit de mettre à jour toute la ligne avec tf.concat

par exemple 

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

devrait être changé en 

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

Remarque:

J'ai pu utiliser les modèles sans problème. Mais il me restait encore une erreur après avoir voulu charger le poids pré-entraîné ..__ Il semble que le module slim ait été modifié plusieurs fois depuis la création du fichier de point de contrôle. Le graphe créé par le code et celui présent dans le fichier de point de contrôle étaient différents.

Note 2:

J'ai pu utiliser les poids de pré-entraînement pour inception_resnet_v2 en ajoutant à tous les calques conv2d biases_initializer=None

69
rAyyy

écrire explicitement le nom des arguments résout le problème.

au lieu de 

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

utilisation

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

J'ai eu la même erreur quand j'ai fait le travail.

Je l'ai trouvé

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

La sortie est shape=(10, 64, 64).

Le code veut que les sorties concat [0] aux sorties [9] => aient une nouvelle forme (640,64).

Mais l'API "tf.concat" peut ne pas permettre cela.

(train_labels idem à this)

Alors j'écris à 

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

Il peut courir!

0
陳立麟