Tensorflow 1.x の Session をゆるく理解

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に代入している流れなのでしょうか。
(若干怪しい….)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です