2017-06-22 21 views
4

訓練を受けたモデル(AdadeltaOptimizerで最適化)をロードし、SGD(GradientDescentOptimizer)でトレーニングを続けます。モデルはtensorlayer APIを保存およびロードされます:モデルの保存テンソルフロー事前訓練モデルで異なるオプティマイザを使用

import tensorlayer as tl 
tl.files.save_npz(network.all_params, 
        name=model_dir + "model-%d.npz" % global_step) 

負荷モデル:

load_params = tl.files.load_npz(path=resume_dir + '/', name=model_name) 
tl.files.assign_params(sess, load_params, network) 

私はadadeltaでトレーニングを続ける場合は、トレーニング損失(クロスエントロピー)(通常見えますロードされたモデルとして近い値で開始します)。ただし、オプティマイザをSGDに変更すると、トレーニング損失は新しく初期化されたモデルほど大きくなります。

model-xxx.npzファイルをtl.files.save_npzから見ました。すべてのモデルパラメータをndarrayとして保存するだけです。オプティマイザや学習率がどのように関係しているかわかりません。

答えて

1

のアダムオプティマイザに入る損失関数/クロスエントロピーの変数にテンソルをインポートする必要があります。さて、代わりにSGDオプティマイザを使用してください。この場合

saver = tf.train.import_meta_graph('filename.meta') 
saver.restore(sess,tf.train.latest_checkpoint('./')) 
graph = tf.get_default_graph() 
cross_entropy = graph.get_tensor_by_name("entropy:0") #Tensor to import 

optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy) 

あなたpretrainに変更を加えることができない場合、私はそのような

tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv), name = 'entropy') 

として、名前entropyと私のpretrainモデルを訓練する前にクロスエントロピーテンソルをタグ付けしていますモデルでは、モデル内のテンソルのリストを(インポート後に)から取得し、必要なTensorを推論することができます。私はTensorlayerの経験がないので、このガイドはより多くの理解を提供することです。 Tensorlayer-Layersを見ることができます、彼らはあなたのテンソルを取得する方法を説明する必要があります。 TensorlayerはTensorflowの上に構築されているので、ほとんどの機能はまだ利用可能です。

+0

答えをありがとう。しかし、なぜ私はテンソルをインポートしなければならないのか混乱しています。これは以前はAdam Optimizerで損失を計算していました。オプティマイザに関係なく、同じモデルパラメータであれば、損失は同じであると思われます。 –

+0

私は私の答えに変更を加えました、これがより明確であることを望みます。そのため、AdamからSGDへオプティマイザのタイプを変更するだけです。 –

0

チェックポイントファイルに保存するパラメータを指定できます。 save_list

save_npz([save_list, name, sess]) 

オプティマイザ・パラメータ、これなし学習率やその他のオプティマイザのパラメータが含まれていないだけで、ネットワークパラメータを指定しています。

あなたがそのように、save_listにそれを追加する必要があります(あなたがモデルを復元するときとまったく同じ学習率を使用するために)現在の学習率を保存したい場合:

save_npz(network.all_params.extend([learning_rate]) 

(Iをall_paramsは、私は私の推測が正しいことを推測する、配列であること。

あなたはオプティマイザを変更したいので、私はあなただけオプティマイザパラメータではなく、オプティマイザが作成する任意の他の変数としてlearning_rateを保存示唆suppoose。 そのようにして、オプティマイザを変更することができます(チェックポイントに他の変数を入れた場合)、復元しようとするグラフは保存された値を格納する変数を見つけられず、その変数を変更できなくなります。

+0

私は 'network.all_params'だけを保存しましたが、adadeltaが作成する他の変数はありません。学習率も節約できませんでしたが、モデルを復元した後にSGDの初期学習率を割り当てました。 –