私は this TensorFlow Slimを学習するためのチュートリアルに従っていますが、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]))
私はこの一連のエラーを受け取っているようです:
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が初めてなので、どんな助けもありがたいです。
リリースされた1.0を使用したときに同じ問題が発生し、以前のバージョンにロールバックすることなく機能させることができました。
この問題は、APIの変更が原因です。その議論は解決策を見つけるのに役立ちました: Googleグループ> TensorFlowの最近のAPIの変更
すべての行を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)
注意:
問題なくモデルを使用できました。しかし、事前トレーニング済みのウェイトをロードしようとすると、まだエラーが発生しました。スリムモジュールは、チェックポイントファイルを作成してからいくつか変更されたようです。コードによって作成されたグラフとチェックポイントファイルに存在するグラフは異なっていました。
注2:
すべてのconv2dレイヤーにbiases_initializer=None
を追加することで、inception_resnet_v2のプリトレインウェイトを使用できました。
引数の名前を明示的に記述することで問題が解決します。
の代わりに
net = tf.concat(3, [branch_0, branch_1, branch_2, branch_3])
つかいます
net = tf.concat(axis=3, values=[branch_0, branch_1, branch_2, branch_3])
仕事をしたときに同じエラーが出ました。
見つけた
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))
出力はshape=(10, 64, 64)
です。
このコードは、concat outputs [0] to outputs [9] => get new shape(640,64)を必要とします。
ただし、「tf.concat」APIではこれができない場合があります。
(train_labelsはこれと同じです)
だから私はに書き込みます
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))
走れます!
ほとんどの人が間違った方法で答えていることがわかりました。 tf.concatの変更が原因です。次のように機能します。
net = tf.concat(3, [branch_0, branch_1, branch_2, branch_3])
以下を使用してください
net = tf.concat(values=[branch_0, branch_1, branch_2, branch_3],axis=3,)
キーワード引数を渡すときは、他の引数よりも前に配置する必要があることに注意してください。