参考サイト: tensorflow
# -*- coding: utf-8 -*-
import tensorflow as tf
with tf. name_scope("myscope1"):
var1 = tf.Variable (123, name="var1" )# var1の名前で変数のテンソルを生成
var2 = tf.Variable ([12,34], name="var1" )
var3 = tf.Variable ([[1,2],[3,4]], name="var1" )
var4 = tf.get_variable("var1", initializer=543)
#var5 = tf.get_variable("var1") # これがあると、重複エラー
op1 = tf.assign(var2,var1 * [1,2]) # リストの掛け算がないと、ランクが異なるのでエラー
print(var1.name) # 結果:myscope1/var1:0
print(var2.name) # 結果:myscope1/var1_1:0
print(var3.name) # 結果:myscope1/var1_2:0
print(var4.name) # 結果:var1:0
print(op1.name) # 結果:myscope1/Assign:0
上記実行結果から name_scope があると、上記で get_variable 以外で作ったものの名前に影響する。
Variableの引数宣言を示します。
tf.Variable(initial_value=None, trainable=True,collections=None, catching_device=None, name=None,variable_def=None, dtype=None, expected_shape=None,import_scope=None)これらは、 name=で同じ名前で作る、勝手に番号(myscope1/var1_1, myscope1/var1_2)が付いていきます。
get_variable(name, shape=None, dtype=tf.float32, initializer=None, regularizer=None, trainable=True, collections=None)get_variableに名前空間を与えるには、次のvariable_scopeとセットで使う必要があります。
import tensorflow as tf
with tf.variable_scope("myscope1"):
var1 = tf.Variable (123, name="var1" )
var2 = tf.Variable ([12,34], name="var1" )
var3 = tf.Variable ([[1,2],[3,4]], name="var1" )
var4 = tf.get_variable("var1", initializer=543)
#var5 = tf.get_variable("var1") # これがあると、重複エラー
op1 = tf.assign(var2,var1 * [1,2]) # リストの掛け算がないと、ランクが異なるのでエラー
print(var1.name) # 結果:myscope1/var1:0
print(var2.name) # 結果:myscope1/var1_1:0
print(var3.name) # 結果:myscope1/var1_2:0
print(var4.name) # 結果:myscope1/var1_3:0
print(op1.name) # 結果:myscope1/Assign:0
import tensorflow as tf
with tf.variable_scope("myscope1"):
var1 = tf.get_variable("var1", initializer=543)
with tf.variable_scope("myscope2"): #(名前空間が違うので、同じ名前でも違う変数になる。)
var_1 = tf.get_variable("var1", initializer=123)
with tf.variable_scope("myscope1"):
tf.get_variable_scope().reuse_variables()
var1A = tf.get_variable("var1", dtype=tf.int32) # 共有変数:同じ識別子を使っての変数再割当は,上記のメソッドを用います.
op = tf.assign(var1A, 222)
'''' 上記のtf.variable_scopeは、次のように書くこともできます。
with tf.variable_scope("myscope1", reuse=True):
var1A = tf.get_variable("var1", dtype=tf.int32) # 共有変数:同じ識別子を使っての変数再割当は,上記のメソッドを用います.
op = tf.assign(var1A, 222)
''''
print(var1.name) # 結果:myscope1/var1:0
print(var_1.name) # 結果:myscope2/var1:0
print(var1A.name) # 結果:myscope1/var1:0
with tf.Session() as sess: # セッション
sess.run(tf.global_variables_initializer())# 変数を使う場合、セッションでこの初期化処理が必要です。
print( sess.run(var1) ) # 結果:543 # 共有変数
print( sess.run(var_1)) # 結果:123 (名前空間が違う)
print( sess.run(var1A)) # 結果:543 # 共有変数
print( sess.run(op) ) # 結果:222
import write_graph
import tensorflow as tf
# 引数からテンソル定数を生成してテンソルを返す関数を定義
# a * a + b に相当するオペレーションを返す。
def a_X_a_plus_b(a, b):
_a = tf.constant(a, name = "a") # aの値で、"a"の名前でTensorを作る
print("_a.name", _a.name) # Tensorの名前の確認
_b = tf.constant(b)
_op = tf.square(_a) # 2乗にする。
print("_r.name", _op.name) # Tensorの名前の確認
_op = tf.add(_op, _b) # 上記にbを加算
print("_r.name", _op.name) # Tensorの名前の確認
return _op;
sess = tf.Session()
a=5
b=1
c = sess.run(a_X_a_plus_b(a, b))
#_a.name a:0
#_r.name Square:0
#_r.name Add:0
print("a_X_a_plus_b(5,1)=",c, "が結果で、型:" , type(c) )
#a_X_a_plus_b(5,1)= 26 が結果で、型: <class 'numpy.int32'>
a=[1,2,3,4,5,6]
c = sess.run(a_X_a_plus_b(a, b))
#_a.name a_1:0
#_r.name Square_1:0
#_r.name Add_1:0
print("a_X_a_plus_b(",a,",",b,")=",c)
#a_X_a_plus_b( [1, 2, 3, 4, 5, 6] , 1 )= [ 2 5 10 17 26 37]
b=[1,2,3,4,5,6]
c = sess.run(a_X_a_plus_b(a, b))
#_a.name a_2:0
#_r.name Square_2:0
#_r.name Add_2:0
print("a_X_a_plus_b(",a,",",b,")=",c)
#a_X_a_plus_b( [1, 2, 3, 4, 5, 6] , [1, 2, 3, 4, 5, 6] )= [ 2 6 12 20 30 42]
sess.close();
import write_graph
この計算グラフを以下に示します。
import tensorflow as tf
with tf.variable_scope("myscope1"): # 共有変数var1を、外部であらかじめ作成する。
varA = tf.get_variable("var1", initializer=0)
# a * a + b に相当するオペレーションを返す。(aを共有変数var1にセット、bは定数にセット)
def a_X_a_plus_b(a, b):
with tf.variable_scope("myscope1", reuse=True):
varA = tf.get_variable("var1",dtype=tf.int32) # 共有変数var1を参照する。
#
#_a = tf.constant(a, name = "a") # この定数の代わりに変数を使う試み
_a = tf.assign(varA, a, name="a") # 共有変数var1に仮引数aを設定して使う。
_b = tf.constant(b)
_op = tf.square(_a) # 2乗にする。
_op = tf.add(_op, _b) # 上記にbを加算
return _op;
sess = tf.Session()
sess.run(tf.global_variables_initializer())# 変数を使う場合、セッションでこの初期化処理が必要です。
c = sess.run(a_X_a_plus_b(5, 1))
print("a_X_a_plus_b(5,1)=",c, "が結果" )#a_X_a_plus_b(5,1)= 26 が結果
c = sess.run(a_X_a_plus_b(2, 3))
print("a_X_a_plus_b(2,3)=",c, "が結果" )#a_X_a_plus_b(2,3)= 7 が結果
c = sess.run(a_X_a_plus_b(2, [1,2,3,4,5,6]))
print(c, "が結果")#[ 5 6 7 8 9 10] が結果
なお、sess.run(a_X_a_plus_b( [1,2,3,4,5,6] , 2))のように、第1引数にリストを使うと次の実行エラーです。
import tensorflow as tf
with tf.variable_scope("myscope1"): # 共有変数var1を、外部であらかじめ作成する。
varA_init = tf.constant_initializer( [0])
varA = tf.get_variable("var1", shape=[6], initializer=varA_init )
# a * a + b に相当するオペレーションを返す。(aを共有変数var1にセット、bは定数にセット)
def a_X_a_plus_b(a, b):
with tf.variable_scope("myscope1", reuse=True):
varA = tf.get_variable("var1", shape=[6]) # 共有変数var1を参照する。
#
#_a = tf.constant(a, name = "a") # この定数の代わりに変数を使う試み
_a = tf.assign(varA, a, name="a") # 共有変数var1に仮引数aを設定して使う。
_b = tf.constant(b , dtype=tf.float32)
_op = tf.square(_a) # 2乗にする。
_op = tf.add(_op, _b) # 上記にbを加算
return _op;
sess = tf.Session()
sess.run(tf.global_variables_initializer())# 変数を使う場合、セッションでこの初期化処理が必要です。
c=sess.run(a_X_a_plus_b( [1,2,3,4,5,6] , 2))
print(c, "が結果") # [ 3. 6. 11. 18. 27. 38.] が結果
c = sess.run(a_X_a_plus_b([1,2,3,4,5,6], [1,2,3,4,5,6]))
print(c, "が結果") # [ 2. 6. 12. 20. 30. 42.] が結果
#c = sess.run(a_X_a_plus_b(2, [1,2,3,4,5,6]))を行うと、次の実行エラー
# ValueError: Shapes must be equal rank, but are 1 and 0 for 'a_2' (op: 'Assign') with input shapes: [6], [].
これで、第1引数に6要素のリストを指定できるようになったが、6要素のリスト以外を与えると実行エラーとなります。
# -*- coding: utf-8 -*-
import tensorflow as tf
# a * a + b に相当するオペレーションを返す。(aを共有変数var1にセット、bは定数にセット)
def a_X_a_plus_b():
_a = tf.placeholder(tf.int32, name='a')
_b = tf.placeholder(tf.int32, name='b')
_op = tf.square(_a) # 2乗にする。
_op = tf.add(_op, _b) # 上記にbを加算
return _a, _b, _op;
with tf.Session() as sess:
_a, _b, op = a_X_a_plus_b();
v = sess.run(op , feed_dict={_a: 5, _b: 1})
print(v) # 実行結果:26
v = sess.run(op , feed_dict={_a: [1,2,3,4,5,6], _b: 1})
print(v) # 実行結果:[ 2 5 10 17 26 37]
v = sess.run(op , feed_dict={_a: [1,2,3,4,5,6], _b: [1,2,3,4,5,6]})
print(v) # 実行結果:[ 2 6 12 20 30 42]
import write_graph
この計算グラフを以下に示します。この仕様において、最も効率的に動作する適切なコードと言えます。