Tensorflow 難しいですね。
Tensorflow 2.x がリリースされています。(現在は、2020年3月)
チュートリアル、記事など参考にしたいものが、Tensorflow 1.x のときに作られたものも多く、しばらく混乱しておりました。
Tensorflow 2.x の使い方から学んでも良いのかもしれませんが、
Tensorflow 1.x の歴史を学ぶことで、Tensorflowの考え方も理解できるかもしれません。
と、言うことで
Tensorflow 2.x では廃止されたTensorflow 1.x で使われていた Session について残しておきたいと思います。
Tensorflow 1.x → Tensorflow 2.x へのUPDATEの詳しい変更点は下記を参考に頂けたらと思います。
ここで、不必要になった、Session。
これは、Tensorflow 1.x の概念を象徴する機能だったかなと思います。
Tensorflowは、下記 2段階のプロセスを辿ることで、より高速で強力な処理を可能にしてます。
( 1 ) 計算グラフ(フロー)を作成
( 2 ) 計算グラフの実行
詳細については下記を参考。
第1回 TensorFlowとは? 入門連載始動! データフローグラフ、事例、学び方
https://www.atmarkit.co.jp/ait/articles/1804/18/news142.html
で、ここでSessionが果たしていた機能は、
( 1 ) 計算グラフ(フロー)を作成 → ( 2 ) 計算グラフの実行
という実行をしますよ。という合図です。
(細かいことは置いておいて….)
この Session()が無ければ、作成した計算グラフを実行に移すことができません。
それでは、実際に
Sessionの使い方を見ていきましょう。
定数の処理を、Sessionを使って見ていきます。
基本的な流れは
( 1 ) 計算グラフ(フロー)を作成
( 2 ) 計算グラフの実行
# 必要なライブラリをインストール
import numpy as np
import tensorflow as tf
# 定数を定義
const1 = tf.constant(10)
const2 = tf.constant(20)
const3 = const1 + const2
print(const1)
print(const2)
print(const3)
下記の結果がprintされます。
Const_x, add_x の項目を確認してみると、どちらも、値が 0 となってます。
(xの部分は連番で数字が加算されていく)
Tensor(“Const_0:0”, shape=(), dtype=int32)
Tensor(“Const_1:0”, shape=(), dtype=int32)
Tensor(“add_0:0”, shape=(), dtype=int32)
これは、値が定数( const )に代入されていない状態を意味してます。
ここまでの処理は
( 1 ) 計算グラフ(フロー)を作成 したに留まります。
本記事のメインテーマである、Sessionを使って
( 2 ) 計算グラフの実行 を進めていきます。
sessionの使い方は
Sessionを定義して、run()で実行です。
with tf.Session() as sess:
result1 = sess.run(const1)
print(result1)
10
run()で実行したことによって、何が起きたのでしょうか。
result2も追加してみましょう。
with tf.Session() as sess:
result1 = sess.run(const1)
result2 = sess.run(const2)
print(result1)
print(result2)
10
20
( 1 ) 計算グラフ(フロー)で、作成した計算グラフの定数が代入されています。
Sessionを定義して、run()することによって
計算グラフで、定義したものが実行されました。
(それまでは、型があるのみという、感じ。)
with tf.Session() as sess:
result1 = sess.run(const1)
result2 = sess.run(const2)
result3 = sess.run(const3)
print(result1)
print(result2)
print(result3)
10
20
30
const3 = const1 + const2
で定義した、グラフも実行されました。
さらに、const1 , const2 が既に実行されているので、下記も可能です。
with tf.Session() as sess:
result1 = sess.run(const1)
result2 = sess.run(const2)
result3 = sess.run(const3)
result4 = sess.run(const1 + const2)
print(result1)
print(result2)
print(result3)
print(result4)
10
20
30
30
ちなみに、これまでの処理をリセットした状態で、下記を実行してみましょう。
with tf.Session() as sess:
#runせずに、const2をprint
print(const2)
#runした後に、const2をprint
result2 = sess.run(const2)
print(const2)
#runした後に、result2をprint
print(result2)
#runせずに、const2をprint
Tensor(“Const_1:0”, shape=(), dtype=int32)
#runした後に、const2をprint
Tensor(“Const_1:0”, shape=(), dtype=int32)
#runした後に、result2をprint
20
という結果となりました。
runによって、session 外部の const2に代入されたのではなく、
sessionの中で、constに代入している流れなのでしょうか。
(若干怪しい….)