tf.variable, tf.get_variable, tf.variable_scope, tf.name_scope の類似点と相違点を理解する。
以前、tf.variable_scopeとtf.name_scopeについての記事を転載しましたが、今日は、あまり、要領がよくないというか、やっぱり、英語とかかなり面倒そうですね。変数、tf.get_variable、tf.variable_scope、tf.name_scope、この4つの違いと繋がりについて。
1. tf.variableとtf.get_variable
tensorflowは、変数をその名前で生成したり取得したりする機構を提供する。この機構により、変数は引数として渡す代わりに、異なる関数内でその名前によって直接使用することができる。
TensorFlowで変数を変数名で取得する仕組みは、主にtf.get_variableとtf.variable_scopeによって実装されています。
もちろん、変数はtf.varivaleで作成することも可能です。
変数作成にtf.get_variableを使用した場合、基本的にtf.get_variableと同等になります。
.
# The following two definitions are equivalent
v = tf.get_variable('v', shape=[1], initializer=tf.constant_initializer(1.0))
v = tf.Variable(tf.constant(1.0, shape=[1], name='v')
tf.get_varialbeとtf.Variableの最大の違いは、以下の点です。 Variableの変数名はname='v'で与えられるオプションのものである。しかし、tf.get_variableは変数名を指定する必要があります。 .
2. tf.get_variableとtf.variable_scopeについて
前述の通り、TensorFlowにおいて変数名で変数を取得する仕組みは、主にtf.get_variableとtf.variable_scopeによって実装されています。
ここで、みんなが大嫌いな再利用問題について説明します。
.
ひとつだけ覚えておいてほしいのは、reuseがFalseまたはNone(これもデフォルト)の場合、同じtf.variable_scopeにある変数は同じ名前を持つことができません。reuseがTrueの場合、tf.variable_scopeはすでに作られた変数だけを取得できます。
これをコードで見てみましょう。
The case where an error is reported when #reuse=False.
with tf.variable_scope('foo'):
v = tf.get_variable('v',[1],initializer=tf.constant_initializer(1.0))
with tf.variable_scope('foo'):
v1 = tf.get_variable('v',[1])
この場合、エラーが報告されます。Varscopeでreuse=Trueを設定したのでしょうか?
その理由は、同じ変数が名前空間fooに作成されたからです。もし、fooの下にname='v'の変数v1を作りたい場合は、reuseをTureに設定すればOKです。上のコードの2番目の部分を次のように修正します。
with tf.variable_scope('foo', reuse=True):
v1 = tf.get_variable('v',[1])
print(v1.name) # results in foo/v
reuse が True に設定されている場合、tf.variable_scope は既に作成された変数のみをフェッチできます。このとき、名前空間 bar に name='v' で変数 v3 を作成すると、エラーになります。Variable bar/v dose not exist, diallowed. VarScope?
with tf.variable_scope('bar', reuse=True):
v3 = tf.get_variable('v',[1])
一言で言えば reuse=Falseのとき、tf.variable_scopeは変数を作成し、reuse=Trueのとき、tf.variable_scopeは変数を取得します。 .
3. tf.variable_scopeとtf.name_scopeの併用
tf.variable_scopeに加えて、tf.name_scope関数も名前空間管理機能を提供します。この2つの関数はほとんどの場合同等で、唯一の違いはtf.get_variable関数を使用する場合です。
tf.get_variable 関数は、tf.name_scope の影響を受けません。
.
この文の意味を正確に理解するために、コードを見てみましょう。
まず、tf.variable_scopeです。
with tf.variable_scope('foo'):
a = tf.get_variable('bar',[1])
print(a.name)# results in foo/bar:0
tf.name_scopeをもう一度見てみる。
with tf.name_scope('a'):
a=tf.Variable([1])
print(a.name)# results in a/Variable:0
b=tf.get_variable('b',[1])
print(b.name)#result is b:0
この結果から、はっきりとわかるのは tf.get_variable は a/b:0 ではなく b:0 となる変数を作成します。これは、tf.get_variableがtf.name_scope関数の下に束縛されていないことを意味します。 .
関連
-
[解決済み】ImportError: 名前 'abs' をインポートすることができません。
-
[解決済み] tensorflowの名前スコープと変数スコープの違いは何ですか?
-
[解決済み] なぜtf.name_scope()を使うのか?
-
[解決済み] Anaconda環境からTensorFlowをアンインストールする
-
[解決済み] Tensorflowにおけるglobal_stepの意味とは?
-
[解決済み] tf.nn.reluの "relu "とは何の略ですか?
-
[Untitled] AttributeError: module 'tensorflow' has no attribute 'placeholder' error resolved.
-
tensorflow(6) mnist.train.next_batch() 関数解析
-
tf.convert_to_tensorを使用したときの値のエラーの解決方法
-
Tensorflow reports error Attempting to use uninitialized value ***/conv2d/kernel Solve
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Tensorflow: tf.expand_dimsはいつ使う?
-
Tensorflow protobufのバージョンエラー対策 (AttributeError: 'module' オブジェクトに 'Default' 属性がない)
-
[解決済み] tf.global_variables_initializerは何のためにあるのですか?
-
デバイスから 18.41M (19300352 bytes) の割り当てに失敗しました。CUDA_ERROR_OUT_OF_MEMORY
-
tensorflow 2.0, ニューラルネットワークス: Sinusoidal Fitting, AttributeError: モジュール 'tensorflow' has no attribute 'placeholder' エラー
-
AttributeError: モジュール 'tensorflow' には 'placeholder' という属性がないことを解決する。
-
AttributeError: モジュール 'tensorflow'に属性 'placeholder' がない問題
-
Python tensorflow ModuleNotFoundError: tensorflow.contrib'という名前のモジュールはありません。
-
pycharm using TensorFlow, keras error: modulenotfounderror: no module named tensorflow
-
テンソルフロー学習ノート(II): テンソル変換