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.
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.
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])
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!
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.