Tensorflow Slim:TypeError:预期为 int32,得到包含类型为“_Message"的张量的列表 [英] Tensorflow Slim: TypeError: Expected int32, got list containing Tensors of type '_Message' instead
问题描述
我正在关注 this 学习 TensorFlow Slim 的教程,但是为 Inception 运行以下代码后:
I am following this tutorial for learning TensorFlow Slim but upon running the following code for 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]))
我似乎遇到了这组错误:
I seem to be getting this set of errors:
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 的新手,任何帮助将不胜感激.
This is strange because all of this code is from their official guide. I am new to TF and any help would be appreciated.
推荐答案
我在使用 1.0 发布的时候遇到了同样的问题,我可以让它工作而无需回滚到以前的版本.
I got the same problem when using the 1.0 released and I could make it work without having to roll back on a previous version.
问题是由于api的变化引起的.该讨论帮助我找到了解决方案:Google group>TensorFlow 中最近的 API 变化
The problem is caused by change in the api. That discussion helped me to find the solution: Google group > Recent API Changes in TensorFlow
你只需要用 tf.concat 更新所有行
You just have to update all the line with 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)
注意:
我可以毫无问题地使用这些模型.但是当我想加载预训练的重量时,我仍然遇到错误.自从他们制作检查点文件以来,slim 模块似乎发生了一些变化.代码创建的图形和检查点文件中的图形不同.
I was able to use the models without problem. But I still got error afterward when wanting to load the pretrained weight. Seems that the slim module got several changed since they made the checkpoint file. The graph created by the code and the one present in the checkpoint file were different.
注2:
通过添加到所有 conv2d 层,我能够使用 inception_resnet_v2 的预训练权重 biases_initializer=None
I was able to use the pretrain weights for inception_resnet_v2 by adding to all conv2d layer biases_initializer=None
这篇关于Tensorflow Slim:TypeError:预期为 int32,得到包含类型为“_Message"的张量的列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!