TensorFlowを遊び倒す! 2-2. Variables: Creation, Initializing, Saving, and Restoring

本記事は、当社オウンドメディア「Doors」に移転しました。

約5秒後に自動的にリダイレクトします。


※TensorFlowとは2015年11月9日にオープンソース化されたGoogleの機械学習ライブラリです。
 本ブログでは、実際のTensorFlowの使い方を連載方式でご紹介しています。


皆様こんにちは。

テクノロジー&ソフトウェア開発本部の佐藤貴海です。
本ブログでは、「Variables: Creation, Initializing, Saving, and Restoring」をご紹介します。

https://www.tensorflow.org/versions/master/how_tos/variables/index.html

「Variables: Creation, Initializing, Saving, and Restoring」というタイトルからもわかるとおり、この章では、TensorFlow上での変数の取り扱いについて解説しています。

ただし、元のチュートリアルもそうであるように、特に詳細な解説というわけではなく簡単な機能の紹介となります。

まずは「ふんふん」と軽い気持ちで読んでいただき、後のチュートリアルで出てきた時に改めて解説させていただこうと思います。

今回、以下の2点を中心に解説をします。

  • tf.Variable
  • tf.train.Saver

変数の作成

tf.Variableで変数を作成することができます。

# Create two variables.
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
                      name="weights")
biases = tf.Variable(tf.zeros([200]), name="biases")

これは前回のブログまででやったことをそのまま実行しています。ただし、初期化するのを忘れずに。

変数の初期化

TensorFlowでは、初期化を明示的に実行しないと変数が確保されません。

これは、GPUへのメモリ転送などのオーバーヘッドを避けるためだと思われます。

# Add an op to initialize the variables.
init_op = tf.initialize_all_variables()

# Later, when launching the model
with tf.Session() as sess:
  # Run the init operation.
  sess.run(init_op)

  (以下略)

こちらも以前やった通りです。

他変数を用いた変数の初期化

tf.initialize_all_variablesは全変数を初期化(確保)してしまうので、一部変数の初期値だけ必要な場合には適しません。

ある変数の初期値だけ必要な場合は、initialized_value()を使う方が良さそうです。

# 普通の変数宣言
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
                      name="weights")
# weightsと同じ値をもつ変数を宣言
w2 = tf.Variable(weights.initialized_value(), name="w2")

# weightsの2倍の値をもつ変数を宣言
w_twice = tf.Variable(weights.initialized_value() * 2.0, name="w_twice")

高度な初期化

tf.initialize_all_variables()で、変数のリストを渡して初期化することもできます。

変数の保存と復元

tf.train.Saver()を使用して、変数の保存(シリアライズ)と復元ができます。

今回の例では、あまりすごさが伝わりづらいかも知れませんが、この機能により各エポックでのモデルの保存や復元ができるようになるため、モデルの評価を後々に非常にやりやすくなります。

詳しくは「4-1. Convolutional Neural Networks」でご紹介させていただく予定です。

変数の保存

# 変数を用意して
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
...
# 初期化して
init_op = tf.initialize_all_variables()

# Saverを用意して
saver = tf.train.Saver()
with tf.Session() as sess:
  sess.run(init_op)

  # Saver.saveで保存
  save_path = saver.save(sess, "/tmp/model.ckpt")
  print("Model saved in file: %s" % save_path)
変数の復元
# 変数を用意して
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
...
# 初期化して
init_op = tf.initialize_all_variables()

# Saverを用意して
saver = tf.train.Saver()

with tf.Session() as sess:
  sess.run(init_op)

  # Saver.restoreで保存
  saver.restore(sess, "/tmp/model.ckpt")
保存・復元する変数の選択と名前の変更

tf.train.Saverにリストか辞書を渡すと、保存・復元する変数の選択ができます。

また、辞書の場合は、シリアライズされている名前と異なった名称で保存・復元することができます。

# シリアライズされた中のmy_v2変数をv2として復元する
saver = tf.train.Saver({"my_v2": v2})


この機能により、過去に3層目まで学習したモデルに、新しく層を追加したい時など、モデルの再利用がしやすくなっています。


次回は「3-1. TensorFlow Mechanics 101」を公開予定です。次回のブログも、今回と同様に簡単な機能の紹介として、学習結果の確認ができる「TensorBoard」の紹介を予定しています。



こうした先進的な取り組みをぜひ自分でもやってみたいという方を、
ブレインパッドでは募集しています。
興味・関心のある方は、ぜひご応募ください!
http://www.brainpad.co.jp/recruit/stylea.htmlwww.brainpad.co.jp