2016-10-16 18 views
1

私の質問は、事前に訓練されたVgg16モデルからロードされた定数テンソルをtf.Variableテンソルに変換する方法はありますか?動機は、Conv4_3レイヤのカーネルに関して特定の損失の勾配を計算する必要があるということですが、カーネルはtf.Constantタイプに設定されており、tf.Optimizer.compute_gradientsメソッドでは受け入れられませんでした。私が試してみました何Tensorflow:あらかじめ訓練されたVggモデルから変数に定数テンソルを変換する

F = vgg.graph.get_tensor_by_name('pretrained_vgg16/conv4_3/filter:0') 
G = optimizer.compute_gradients(losses, var_list=[F]) 

# TypeError: Argument is not a tf.Variable: Tensor("pretrained_vgg16/conv4_3/filter:0", shape=(3, 3, 512, 512), dtype=float32) 

は、元のカーネルに設定した初期値を持つ変数の型テンソルにカーネルを更新するためにtf.assignメソッドを使用することですが、それはだから、どのようTypeError: Input 'ref' of 'Assign' Op requires l-value input

F = tf.assign(F, tf.Variable(F, trainable=False)) 

います私はそれを達成することはできますか?事前に多くの感謝!

アップデート:私はPretrained Vgg16 Tensorflow modelに応じpretrainedモデルをダウンロードして、私がして、モデルをロード:上記のすべてのコードがvggという名前のクラスで定義されている

with open('vgg16.tfmodel', mode='rb') as f: 
    fileContent = f.read() 

graph_def = tf.GraphDef() 
graph_def.ParseFromString(fileContent) 

# Map input tensor 
inputs = tf.placeholder("float", [1, 224, 224, 3], name='inputs') 
tf.import_graph_def(graph_def, input_map={ "images": inputs }, name='pretrained_vgg16') 

graph = tf.get_default_graph() 

+0

事前トレーニングされたモデルをロードする方法を教えてください。多分conv4_3のコードを投稿すると役に立つでしょう。 –

+0

はい、もちろん、私は投稿を更新しました。しかし、私は実際にはconv4_3レイヤーを実装していませんでしたが、 'vgg16.tfmodel'ファイルが付属しています。 – Xer

答えて

3

訓練済みのモデルから変数を取得しなかった理由は、this answerで説明できます。簡単に言うと、tf.import_graph_defは変数のないグラフの構造を復元するだけです。

これを解決するには、事前に訓練されたモデルと同じ変数名を使用して、モデルを自分で作成する必要があります。次に、事前に訓練されたモデルを読み込み、すべての変数に特定のパラメータを割り当てます。

this vgg modelをお勧めします。

+0

ブリリアント!ありがとうございました! Da。 – Xer

関連する問題