DOORS DX

ベストなDXへの入り口が
見つかるメディア

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

公開日
2020.10.30
更新日
2024.03.14
TensorFlowを遊び倒す! 2-2. Variables: Creation, Initializing, Saving, and Restoring

※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」の紹介を予定しています。


このページをシェアする

株式会社ブレインパッドについて

2004年の創業以来、「データ活用の促進を通じて持続可能な未来をつくる」をミッションに掲げ、データの可能性をまっすぐに信じてきたブレインパッドは、データ活用を核としたDX実践経験により、あらゆる社会課題や業界、企業の課題解決に貢献してきました。 そのため、「DXの核心はデータ活用」にあり、日々蓄積されるデータをうまく活用し、データドリブン経営に舵を切ることであると私達は考えています。

メールマガジン

Mail Magazine