Tensorflow学習(6)モデルの保存と復元(saver)
9787 ワード
後で検証またはテストを行うために、訓練されたモデルパラメータを保存します.tfに提供されるモデルはtfである.train.Saver()モジュール.モデルを保存するには、まずSaverオブジェクトを作成します.
このオブジェクトを作成するときに、パラメータmax_があります.to_keepでは、モデルを保存する個数を設定するためによく使用されます.デフォルトは5です.すなわちmax_to_keep=5で、最近の5つのモデルを保存します.世代を訓練するたびにモデルを保存したい場合はmax_to_keepはNoneまたは0に設定されます.たとえば、次のようにします.
しかし、これはハードディスク(HDD)を多く消費する以外に、実際にはあまり役に立たないので、お勧めしません.
もちろん、最後の世代のモデルだけを保存したい場合はmax_to_keepは1に設定すればよい.saverオブジェクトを作成すると、次のようなトレーニング済みのモデルを保存できます.
2番目のパラメータは保存されたパスと名前を設定し、3番目のパラメータはトレーニングの回数を接尾辞としてモデル名に追加します.実験では,最後の世代は検証精度が最も高い世代ではない可能性があるので,最後の世代をデフォルトで保存するのではなく,検証精度が最も高い世代を保存したい場合は,中間変数と判断文を加えればよい.
検証精度が最も高い3世代を保存し、毎回の検証精度も保存したい場合は、txtファイルを生成して保存できます.
モデルの復元にはrestore()関数が使用され、2つのパラメータrestore(sess,save_path)、save_pathとは、保存されたモデルパスを指します.tfを使用できます.train.latest_checkpoint()を使用して、最後に保存したモデルを自動的に取得します.次のようになります.
プログラムの後半のコードは次のように変更できます.
ソース全体
saver=tf.train.Saver()
このオブジェクトを作成するときに、パラメータmax_があります.to_keepでは、モデルを保存する個数を設定するためによく使用されます.デフォルトは5です.すなわちmax_to_keep=5で、最近の5つのモデルを保存します.世代を訓練するたびにモデルを保存したい場合はmax_to_keepはNoneまたは0に設定されます.たとえば、次のようにします.
saver=tf.train.Saver(max_to_keep=0)
しかし、これはハードディスク(HDD)を多く消費する以外に、実際にはあまり役に立たないので、お勧めしません.
もちろん、最後の世代のモデルだけを保存したい場合はmax_to_keepは1に設定すればよい.saverオブジェクトを作成すると、次のようなトレーニング済みのモデルを保存できます.
saver.save(sess,'ckpt/mnist.ckpt',global_step=step)
2番目のパラメータは保存されたパスと名前を設定し、3番目のパラメータはトレーニングの回数を接尾辞としてモデル名に追加します.実験では,最後の世代は検証精度が最も高い世代ではない可能性があるので,最後の世代をデフォルトで保存するのではなく,検証精度が最も高い世代を保存したい場合は,中間変数と判断文を加えればよい.
saver=tf.train.Saver(max_to_keep=1)
max_acc=0
for i in range(100)
batch_xs,batch_ys=mnist.train.next_batch(100)
sess.run(train_op,feed_dict={x: batch_xs,y_: batch_ys})
val_loss,val_acc=sess.run([loss,acc],feed_dict={x:mnist.test.images,y_:mnist.test.labels})
print('epoch:%d, val_loss:%f,val_acc:%f'%(i,val_loss,val_acc))
if val_acc>max_acc:
max_acc=val_acc
saver.save(sess,'ckpt/mnist.ckpt',global_step=i+1)
sess.close()
検証精度が最も高い3世代を保存し、毎回の検証精度も保存したい場合は、txtファイルを生成して保存できます.
saver=tf.train.Saver(max_to_keep=3)
max_acc=0
f=open('ckpt/acc.txt','w')
for i in range(100):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_op, feed_dict={x: batch_xs, y_: batch_ys})
val_loss,val_acc=sess.run([loss,acc], feed_dict={x: mnist.test.images, y_: mnist.test.labels})
print('epoch:%d, val_loss:%f, val_acc:%f'%(i,val_loss,val_acc))
f.write(str(i+1)+', val_acc: '+str(val_acc)+'
')
if val_acc>max_acc:
max_acc=val_acc
saver.save(sess,'ckpt/mnist.ckpt',global_step=i+1)
f.close()
sess.close()
モデルの復元にはrestore()関数が使用され、2つのパラメータrestore(sess,save_path)、save_pathとは、保存されたモデルパスを指します.tfを使用できます.train.latest_checkpoint()を使用して、最後に保存したモデルを自動的に取得します.次のようになります.
model_file=tf.train.latest_checkpoint('ckpt/')
saver.restore(sess,model_file)
プログラムの後半のコードは次のように変更できます.
sess=tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
is_train=False
saver=tf.train.Saver(max_to_keep=3)
#
if is_train:
max_acc=0
f=open('ckpt/acc.txt','w')
for i in range(100):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_op, feed_dict={x: batch_xs, y_: batch_ys})
val_loss,val_acc=sess.run([loss,acc], feed_dict={x: mnist.test.images, y_: mnist.test.labels})
print('epoch:%d, val_loss:%f, val_acc:%f'%(i,val_loss,val_acc))
f.write(str(i+1)+', val_acc: '+str(val_acc)+'
')
if val_acc>max_acc:
max_acc=val_acc
saver.save(sess,'ckpt/mnist.ckpt',global_step=i+1)
f.close()
#
else:
model_file=tf.train.latest_checkpoint('ckpt/')
saver.restore(sess,model_file)
val_loss,val_acc=sess.run([loss,acc], feed_dict={x: mnist.test.images, y_: mnist.test.labels})
print('val_loss:%f, val_acc:%f'%(val_loss,val_acc))
sess.close()
ソース全体
# -*- coding: utf-8 -*-
"""
Created on Sun Jun 4 10:29:48 2017
@author: Administrator
"""
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=False)
x = tf.placeholder(tf.float32, [None, 784])
y_=tf.placeholder(tf.int32,[None,])
dense1 = tf.layers.dense(inputs=x,
units=1024,
activation=tf.nn.relu,
kernel_initializer=tf.truncated_normal_initializer(stddev=0.01),
kernel_regularizer=tf.nn.l2_loss)
dense2= tf.layers.dense(inputs=dense1,
units=512,
activation=tf.nn.relu,
kernel_initializer=tf.truncated_normal_initializer(stddev=0.01),
kernel_regularizer=tf.nn.l2_loss)
logits= tf.layers.dense(inputs=dense2,
units=10,
activation=None,
kernel_initializer=tf.truncated_normal_initializer(stddev=0.01),
kernel_regularizer=tf.nn.l2_loss)
loss=tf.losses.sparse_softmax_cross_entropy(labels=y_,logits=logits)
train_op=tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)
correct_prediction = tf.equal(tf.cast(tf.argmax(logits,1),tf.int32), y_)
acc= tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
sess=tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
is_train=True
saver=tf.train.Saver(max_to_keep=3)
#
if is_train:
max_acc=0
f=open('ckpt/acc.txt','w')
for i in range(100):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_op, feed_dict={x: batch_xs, y_: batch_ys})
val_loss,val_acc=sess.run([loss,acc], feed_dict={x: mnist.test.images, y_: mnist.test.labels})
print('epoch:%d, val_loss:%f, val_acc:%f'%(i,val_loss,val_acc))
f.write(str(i+1)+', val_acc: '+str(val_acc)+'
')
if val_acc>max_acc:
max_acc=val_acc
saver.save(sess,'ckpt/mnist.ckpt',global_step=i+1)
f.close()
#
else:
model_file=tf.train.latest_checkpoint('ckpt/')
saver.restore(sess,model_file)
val_loss,val_acc=sess.run([loss,acc], feed_dict={x: mnist.test.images, y_: mnist.test.labels})
print('val_loss:%f, val_acc:%f'%(val_loss,val_acc))
sess.close()