テンソルflow固定部分パラメータトレーニングは、部分パラメータの例のみを訓練します。
2601 ワード
tenssorflowを使ってモデルを訓練する場合、検証セットによってモデルがフィットしたかどうかを判断する必要があります。訓練を中止する必要がありますか?
1.まず思いついたのは、tf.placceholder()で異なるデータをロードして計算することです。例えば、
2.しかし、処理のデータ量が大きい場合、tf.placceholderを使ってデータをロードすると、訓練の進捗がひどく遅くなりますので、tfracordsファイルでデータを読みます。
このとき、inference()関数に異なる値を入力して計算することが容易に考えられます。
3.トレーニング、検証をtf.placceholderで制御する。
以上のこのtenssorflowの固定部分のパラメーターの訓練、ただ部分のパラメーターの実例だけを訓練して小さい編纂がみんなのすべての内容に分かち合うので、みんなに1つの参考をあげることができることを望んで、みんながよけいに私達を支持することをも望みます。
1.まず思いついたのは、tf.placceholder()で異なるデータをロードして計算することです。例えば、
def inference(input_):
"""
this is where you put your graph.
the following is just an example.
"""
conv1 = tf.layers.conv2d(input_)
conv2 = tf.layers.conv2d(conv1)
return conv2
input_ = tf.placeholder()
output = inference(input_)
...
calculate_loss_op = ...
train_op = ...
...
with tf.Session() as sess:
sess.run([loss, train_op], feed_dict={input_: train_data})
if validation == True:
sess.run([loss], feed_dict={input_: validate_date})
この方法はとても簡単で、直接的に分かります。2.しかし、処理のデータ量が大きい場合、tf.placceholderを使ってデータをロードすると、訓練の進捗がひどく遅くなりますので、tfracordsファイルでデータを読みます。
このとき、inference()関数に異なる値を入力して計算することが容易に考えられます。
train_batch, label_batch = decode_train()
val_train_batch, val_label_batch = decode_validation()
train_result = inference(train_batch)
...
loss = ..
train_op = ...
...
if validation == True:
val_result = inference(val_train_batch)
val_loss = ..
with tf.Session() as sess:
sess.run([loss, train_op])
if validation == True:
sess.run([val_result, val_loss])
このような方法は、直接inference()を呼び出して、検証データを前方伝播計算することができるように見えるが、実際には、元の図に多くの新しい結点を追加し、これらの結点のパラメータは再初期化が必要であり、つまり、検証するときは訓練の重みを使用するのではない。3.トレーニング、検証をtf.placceholderで制御する。
def inference(input_):
...
...
...
return inference_result
train_batch, label_batch = decode_train()
val_batch, val_label = decode_validation()
is_training = tf.placeholder(tf.bool, shape=())
x = tf.cond(is_training, lambda: train_batch, lambda: val_batch)
y = tf.cond(is_training, lambda: train_label, lambda: val_label)
logits = inference(x)
loss = cal_loss(logits, y)
train_op = optimize(loss)
with tf.Session() as sess:
loss, _ = sess.run([loss, train_op], feed_dict={is_training: True})
if validation == True:
loss = sess.run(loss, feed_dict={is_training: False})
このような方法を用いると、大きな図の中に分岐条件を作成することができ、これによりplacholderを制御することによって検証を行うかどうかを制御することができる。以上のこのtenssorflowの固定部分のパラメーターの訓練、ただ部分のパラメーターの実例だけを訓練して小さい編纂がみんなのすべての内容に分かち合うので、みんなに1つの参考をあげることができることを望んで、みんながよけいに私達を支持することをも望みます。