Tensorflowプリトレーニングモデルを読み込み、使用する:inception_v 3を例に
7996 ワード
Tensorflowを使用して読み取りとfinetuneを行うと、公式に与えられたinception_を読み取ることがわかります.v 3予備訓練モデルでは常に様々なエラーが発生し、正しい読み取り方法と様々なエラー方法を記録します.キーコードは以下の通りです.
その中の..............................本文に関係のないコードはいくつか省略されている.
エラー1
理由:事前トレーニングモデルのカテゴリ数class_num=1000、ここに入力されたclass_num=5で、完全なモデルを読み込むと当然エラーが発生します.解決策:カテゴリ数を含むLogitsレイヤとAuxLogitsレイヤを読み込まないことを選択します.
エラー2 Tensor name“xxxx”not found in checkpoint files
ここのTensor nameはすべてのinceptionです.v 3の変数の名前、このような情況の各種の原因と解決策は:1.図を作成する時arg_を使わないscopeは、次のように作成されます.
ソリューション:arg_をここに追加scope、中で呼び出されたのはライブラリに付属のinceptionです.v3_arg_scope
2.checkpointの読み込み時にすべての変数が初期化されていない、すなわち実行されていない
これにより、Momentumを使用するときの各層のMomentumパラメータなど、checkpointに存在しない変数が初期化されません.
3.
RMSPropを使用する場合:
解決策は簡単ですignore_missing_vars=True
注意:Trueに設定するには、前の手順が完了した後にする必要があります.そうしないと、変数名がすべてエラーになると、checkpointのすべての変数が無視され、パラメータが読み込まれません.
以上が私が出会った問題で、役に立つことを望んでいます.
import tensorflow as tf
import tensorflow.contrib.slim as slim
from tensorflow.contrib.slim.python.slim.nets import inception_v3
.....................................................
#
with slim.arg_scope(inception_v3.inception_v3_arg_scope()):
logits, end_points = inception_v3.inception_v3(imgs, num_classes=class_num, is_training=is_training_pl)
....................................................
with tf.Session() as sess:
# ,
init = tf.global_variables_initializer()
sess.run(init)
#
print('Loading model check point from {:s}'.format(Pretrained_model_dir))
# exclusions Logits, 1000, 1000 , ,
exclusions = ['InceptionV3/Logits',
'InceptionV3/AuxLogits']
# , exclusions
inception_except_logits = slim.get_variables_to_restore(exclude=exclusions)
# checkpoint
init_fn = slim.assign_from_checkpoint_fn(Pretrained_model_dir, inception_except_logits,ignore_missing_vars=True)
#
init_fn(sess)
print('Loaded.')
その中の..............................本文に関係のないコードはいくつか省略されている.
エラー1
InvalidArgumentError (see above for traceback): Assign requires shapes of both tensors to match. lhs shape= [5] rhs shape= [1001]
[[Node: save_1/Assign_8 = Assign[T=DT_FLOAT, _class=["loc:@InceptionV3/AuxLogits/Conv2d_2b_1x1/biases"], use_locking=true, validate_shape=true, _device="/job:localhost/replica:0/task:0/device:GPU:0"](InceptionV3/AuxLogits/Conv2d_2b_1x1/biases, save_1/RestoreV2_8/_2319)]]
理由:事前トレーニングモデルのカテゴリ数class_num=1000、ここに入力されたclass_num=5で、完全なモデルを読み込むと当然エラーが発生します.解決策:カテゴリ数を含むLogitsレイヤとAuxLogitsレイヤを読み込まないことを選択します.
exclusions = ['InceptionV3/Logits','InceptionV3/AuxLogits']
inception_except_logits = slim.get_variables_to_restore(exclude=exclusions)
エラー2 Tensor name“xxxx”not found in checkpoint files
NotFoundError (see above for traceback): Tensor name "InceptionV3/Mixed_6c/Branch_2/Conv2d_0b_7x1/biases" not found in checkpoint files E:\DeepLearning\TensorFlow\Inception\inception_v3_2016_08_28\inception_v3.ckpt
[[Node: save_1/RestoreV2_180 = RestoreV2[dtypes=[DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_save_1/Const_0_0, save_1/RestoreV2_180/tensor_names, save_1/RestoreV2_180/shape_and_slices)]]
[[Node: save_1/RestoreV2_277/_109 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device_incarnation=1, tensor_name="edge_854_save_1/RestoreV2_277", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"]()]]
ここのTensor nameはすべてのinceptionです.v 3の変数の名前、このような情況の各種の原因と解決策は:1.図を作成する時arg_を使わないscopeは、次のように作成されます.
logits, end_points = inception_v3.inception_v3(imgs, num_classes=class_num, is_training=is_training_pl)
ソリューション:arg_をここに追加scope、中で呼び出されたのはライブラリに付属のinceptionです.v3_arg_scope
with slim.arg_scope(inception_v3.inception_v3_arg_scope()):
logits, end_points = inception_v3.inception_v3(imgs, num_classes=class_num, is_training=is_training_pl)
2.checkpointの読み込み時にすべての変数が初期化されていない、すなわち実行されていない
init = tf.global_variables_initializer()
sess.run(init)
これにより、Momentumを使用するときの各層のMomentumパラメータなど、checkpointに存在しない変数が初期化されません.
3.
slim.assign_from_checkpoint_fn()
関数を使用する場合、デフォルトのignore_のため、ignore_missing_vars=True
属性は追加されません.missing_vars=Falseなので、SGD以外のoptimizerを使用する場合(Momentum、RMSPropなど)には、MomentumまたはRMSPropのパラメータがcheckpointで見つからないことを示すメッセージが表示されます.たとえば、Momentumを使用する場合:NotFoundError (see above for traceback): Tensor name "InceptionV3/Mixed_6e/Branch_2/Conv2d_0c_1x7/BatchNorm/beta/Momentum" not found in checkpoint files E:\DeepLearning\TensorFlow\Inception\inception_v3_2016_08_28\inception_v3.ckpt
[[Node: save_1/RestoreV2_397 = RestoreV2[dtypes=[DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_save_1/Const_0_0, save_1/RestoreV2_397/tensor_names, save_1/RestoreV2_397/shape_and_slices)]]
[[Node: save_1/RestoreV2_122/_2185 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device_incarnation=1, tensor_name="edge_2096_save_1/RestoreV2_122", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"]()]]
RMSPropを使用する場合:
NotFoundError (see above for traceback): Tensor name "InceptionV3/Mixed_6b/Branch_1/Conv2d_0b_1x7/BatchNorm/beta/RMSProp" not found in checkpoint files E:\DeepLearning\TensorFlow\Inception\inception_v3_2016_08_28\inception_v3.ckpt
[[Node: save_1/RestoreV2_257 = RestoreV2[dtypes=[DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_save_1/Const_0_0, save_1/RestoreV2_257/tensor_names, save_1/RestoreV2_257/shape_and_slices)]]
[[Node: save_1/Assign_463/_3950 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device_incarnation=1, tensor_name="edge_3478_save_1/Assign_463", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"]()]]
解決策は簡単ですignore_missing_vars=True
init_fn = slim.assign_from_checkpoint_fn(Pretrained_model_dir, inception_except_logits,ignore_missing_vars=True)
注意:Trueに設定するには、前の手順が完了した後にする必要があります.そうしないと、変数名がすべてエラーになると、checkpointのすべての変数が無視され、パラメータが読み込まれません.
以上が私が出会った問題で、役に立つことを望んでいます.