wake-up-neo.com

Tensorflow Slim: TypeError: Erwartetes int32, Liste stattdessen mit Tensoren vom Typ '_Message'

Ich folge this Tutorial zum Erlernen von TensorFlow Slim, aber nach dem Ausführen des folgenden Codes für 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]))

Ich scheine diese Fehler zu bekommen:

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.

Dies ist merkwürdig, da der gesamte Code von ihrem offiziellen Leitfaden stammt. Ich bin neu bei TF und jede Hilfe wäre dankbar.

28
Deepankar Arya

Ich hatte das gleiche Problem, als ich die 1.0-Version benutzte, und konnte es funktionieren lassen, ohne auf eine vorherige Version zurückgreifen zu müssen.

Das Problem wird durch eine Änderung der API verursacht. Diese Diskussion half mir bei der Suche nach der Lösung: Google-Gruppe> Letzte API-Änderungen in TensorFlow

Sie müssen nur die gesamte Zeile mit tf.concat aktualisieren

zum Beispiel 

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

sollte in geändert werden 

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

Hinweis:

Ich konnte die Modelle ohne Probleme verwenden. Aber ich habe immer noch einen Fehler erhalten, als ich das vorab trainierte Gewicht laden wollte. Das Slim-Modul hat mehrere Änderungen erfahren, seit sie die Checkpoint-Datei erstellt haben. Der durch den Code erstellte Graph und der in der Checkpoint-Datei enthaltene waren unterschiedlich.

Anmerkung 2:

Ich konnte die Gewichte vor dem Zug für inception_resnet_v2 verwenden, indem ich allen conv2d-Layer biases_initializer=None hinzufügte.

69
rAyyy

durch explizites Schreiben des Namens der Argumente wird das Problem gelöst.

anstatt 

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

benutzen

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

Ich habe den gleichen Fehler bekommen, als ich die Arbeit gemacht habe.

Ich habe das gefunden

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

Die Ausgabe ist shape=(10, 64, 64).

Der Code möchte concat-Ausgänge [0] an Ausgänge [9] => erhalten eine neue Form (640,64).

Die API "tf.concat" lässt dies jedoch möglicherweise nicht zu.

(train_labels dasselbe)

Also schreibe ich an 

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

Es kann rennen!

0
陳立麟

Ich fand die meisten Leute, die falsch antworteten. Es liegt nur an der Änderung in der tf.concat. Es funktioniert folgendermaßen.

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

verwenden Sie Folgendes

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

Denken Sie daran, dass beim Übergeben des Schlüsselworts die Argumente vor den anderen stehen sollten.

0
nabin