現在、Tf-Slim ライブラリで事前トレーニング済みの VGG モデルを使用しています。私の動機は、このネットワークの特定の画像に対して敵対的な例を生成することです。タスクの概要は次のとおりです。
x= tf.placeholder(shape=(None, 32, 32,3), dtype=tf.float32)
for i in range(2):
logits= vgg.vgg_16(x, is_training=False, spatial_squeeze=False, fc_conv_padding='SAME')
x = x + learning_rate*cal_gradient_of_logits_wrt_x(logits)
ただし、2 回目の反復に入って logits= vgg.vgg16(....) の実行を開始するとすぐに、次のエラーが発生します。
Variable vgg_16/conv1/conv1_1/weights already exists, disallowed. Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope?
このエラーは、2 回目の繰り返しでグラフが複製されたために発生したことは明らかです。tf-slim モデルはスコープで使用しないためreuse=True
、このエラーがスローされます (2 回目の繰り返しで、グラフに vgg レイヤーを追加するように再度要求するため、既に存在します)。
どういうわけかこのエラーを回避することは可能ですか? VGG モデルのグラフを一度作成すれば、ロジットを計算する必要があるときはいつでもそれを使用できるはずです。
これが可能な理由は、ケラスの例です。ケラスでは、モデルを一度定義するだけで済みます。
model= vgg.VGG16(*args, *kwargs)
後で、さまざまなテンソルの計算ロジットを追加できます。
logits_1= model(x1)
logits_2= model(x2)
これらの両方の計算で、同じモデル パラメータが使用されます。つまり、そのようなエラーは表示されません。tensorflow モデルで同じ機能を実現する方法はありますか?