Tensorflow Slim: TypeError: Se esperaba int32, se obtuvo una lista que contiene Tensors de tipo ‘_Message’ en su lugar

Sigo este tutorial para aprender TensorFlow Slim pero al ejecutar el siguiente código para 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 = 'http://sofes.miximages.com/python/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])) 

Parece que estoy recibiendo este conjunto de errores:

 Traceback (most recent call last): File "DA_test_pred.py", line 24, in  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. 

Esto es extraño porque todo este código es de su guía oficial. Soy nuevo en TF y cualquier ayuda sería apreciada.

Tuve el mismo problema cuando usé la versión 1.0 y pude hacer que funcionara sin tener que retroceder en una versión anterior.

El problema es causado por el cambio en la api. Esa discusión me ayudó a encontrar la solución: Grupo de Google> Cambios recientes en la API en TensorFlow

Solo tienes que actualizar toda la línea con tf.concat.

por ejemplo

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

debe ser cambiado a

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

Nota:

Pude usar los modelos sin problema. Pero aún tengo un error después al querer cargar el peso pre-entrenado. Parece que el módulo delgado cambió varias veces desde que crearon el archivo de punto de control. La gráfica creada por el código y la presente en el archivo de punto de control fueron diferentes.

Nota 2:

Pude usar los pesos de pretrenos para inception_resnet_v2 agregando a todos los diodos de capa biases_initializer=None

Escribir explícitamente el nombre de los argumentos resuelve el problema.

en lugar de

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

utilizar

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

Obtuve el mismo error cuando hice el trabajo.

encontre eso

 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 salida es shape=(10, 64, 64) .

El código quiere concat salidas [0] a salidas [9] => obtener una nueva forma (640,64).

Pero la API “tf.concat” puede no permitir hacer esto.

(train_labels lo mismo para esto)

Así que escribo a

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

¡Puede funcionar!

Encontré a la mayoría de las personas respondiendo de manera incorrecta. Es solo debido al cambio en el tf.concat. Funciona de la siguiente manera.

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

usa lo siguiente

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

Recuerde que al pasar los argumentos de palabras clave debe estar antes que los otros