1. ホーム
  2. TensorFlow

tf.get_variable_scope() 共通の使用法

2022-02-16 20:26:59

我々は、tensorflowが一度グラフを構築すると、学習中にそれを変更することができないことを知っている。そして、一度入力がグラフに追加されると、データはパラメータのセットを通して流れ、そのパラメータのセットはその入力インターフェースから送り込まれたデータに対してのみ働くことができる。この時点で別のデータセット、つまりキューが与えられた場合、このキュー内のデータは前回の入力キューと同じルートを通るようにしたい、言い換えれば、次のような実装にしたい。

input_1 = tf.placeholder(...)
out_1 = model(input_1)
input_2 = tf.placeholder(...)
out_2 = model(input_2)


この場合、エラーになります。次のコードを見てみましょう。

import tensorflow as tf
import vgg

inputs_1 = tf.random_normal([10,224,224,3])
inputs_2 = tf.random_normal([10,224,224,3])
with tf.variable_scope('vgg_16') :
    net ,end_points = vgg.vgg_16(inputs_1,100,False)
    # tf.get_variable_scope().reuse_variables()
    net_, end_points_ = vgg.vgg_16(inputs_2,100,False)

with tf.Session() as sess:
    print("no error")

上記のコードが正しい場合、エラーなしで終了します。

しかし、エラーメッセージはこのようなものです。

ValueError: Variable vgg_16/vgg_16/conv1/conv1_1/weights already exists, disallowed. 
Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope?

すでに存在している変数だから、こうやってもう一度生成することはできないということです。実は、最初の入力が行って、最初の入力が送ったデータに対してのみ使用できる一連の変数を生成したからなのです。今度は2番目の入力が、1番目の入力に対応するパラメータを使いたいのですが、それは不可能です。そこで、このコメント行を追加することで解決します。

import tensorflow as tf
import vgg

inputs_1 = tf.random_normal([10,224,224,3])
inputs_2 = tf.random_normal([10,224,224,3])
with tf.variable_scope('vgg_16') :
    net ,end_points = vgg.vgg_16(inputs_1,100,False)
    tf.get_variable_scope().reuse_variables()
    net_, end_points_ = vgg.vgg_16(inputs_2,100,False)

with tf.Session() as sess:
    print("no error")

tf.get_variable_scope().reuse_variables() は現在の variable_scope の下で reuse = True に設定します、これはその名の通り、2つの入力が変数を共有できることを意味します。