やりたいことの概要
学習済みのVGG16モデルで、上位層を新しい層に置換して転移学習を行いたい。その際にどのように変数の初期化を行えばよいのかわからない。
環境
- Ubuntu 18.04
- Python 3.6.8
- Tensorflow 1.12.0
質問の詳細
VGG16の訓練済みモデルを.pb
ファイルとして手に入れました。ここにはモデルの構造と重みが両方含まれています。
python
1with tf.gfile.GFile('vgg16.pb', 'rb') as f: 2 graph_def = tf.GraphDef() 3 graph_def.ParseFromString(f.read()) 4 _ = tf.import_graph_def(graph_def, name="")
を使ってモデルを読み込んで、動作確認はすることができました。
ここからさらに、VGGの上位層をいくつか取り除き、新しく畳み込み層を付け加えようと思っています。層を付け加えるだけであれば
python
1block5_conv3 = tf.get_default_graph().get_tensor_by_name('block5_conv3/Relu:0')
で残したVGGの最上位層を取ってきて、それに新しく層を付け加えていくということでできるのですが、訓練時の変数を初期化において、新たに付け加えた層の変数のみ初期化をする必要があり、その方法がわかりません。global_variables_initializer()
だとVGGの変数も初期化されてしまうので、どうしたら良いでしょうか。
python
1block5_conv3 = tf.get_default_graph().get_tensor_by_name( 2 'block5_conv3/Relu:0' 3 ) 4vgg_stop = tf.stop_gradient(block5_conv3) # ここ以下の層は凍結 5 6convA_1 = tf.layers.conv2d( 7 inputs=block5_conv3, 8 filters=1024, 9 kernel_size=3, 10 padding='SAME', 11 activation=tf.nn.relu, 12 name="convA_1" 13 ) 14convA_2 = tf.layers.conv2d( 15 inputs=convA_1, 16 filters=1024, 17 kernel_size=3, 18 padding='SAME', 19 activation=tf.nn.relu 20 ) 21convA_3 = tf.layers.conv2d( 22 inputs=convA_2, 23 filters=self.class_num, 24 kernel_size=1, 25 padding='SAME', 26 activation=tf.nn.relu 27 ) 28global_ave_pool_A = tf.reduce_mean(convA_3, axis=[1, 2]) 29 30X = tf.get_default_graph().get_tensor_by_name('input_1:0') 31init = tf.global_variables_initializer() 32with tf.Session() as sess: 33 init.run() # VGGまで初期化されてしまう 34 res = sess.run(global_ave_pool_A, feed_dict={X: "(1,224,224,3)の配列"})
よろしくお願いします。
あなたの回答
tips
プレビュー