2017-09-05 34 views
0

私はTensorflowでKerasを使用しています。 Kerasレイヤーにはメソッドget_weights()と属性weightsがあります。私の理解では、「重み」は重みのテンソル流のテンソルを出力し、「get_weights()」は重みテンソルを評価し、数値を配列として出力します。しかし、実際には2つの異なる値を示しています。ここに複製するコードがあります。Kerasウェイトとget_weights()は異なる値を表示します

from keras.applications.vgg19 import VGG19 
import tensorflow as tf 

vgg19 = VGG19(weights='imagenet', include_top=False) 

vgg19.get_layer('block5_conv1').get_weights()[0][0,0,0,0] 
#result is 0.0028906602, this is actually the pretrained weight 

sess = tf.Session() 

sess.run(tf.global_variables_initializer()) 
#I have to run the initializer here. Otherwise, the next line will give me an error 
sess.run(vgg19.get_layer('block5_conv1').weights[0][0,0,0,0]) 
#The result here is -0.017039195 for me. It seems to be a random number each time. 

マイKerasのバージョンは2.0.6です。私のTensorflowは1.3.0です。ありがとうございました!

+0

私はkerasを使用した場合、直接tensorflowを使用しようとしているすべてのコストで避けます。ケラスがあなたにすべてを与えたら、ケラスから何かをするほうが良いのです。テンソルフローに直接バイパスすると、それが行える可能性があることが決してわからないからです。私は 'get_weights()'と 'set_weights()'のみを使用しており、うまくいきました。 –

+0

乱数のように見えますが、tf.global_variables_initializer()を呼び出すと、基本的にすべてのウェイトをデフォルトのランダム初期化に再初期化していると思います。 –

答えて

1

get_weights()というメソッドは、実際には、属性weightsによって与えられたTensorflowテンソルの値を評価しています。私がget_weights()sess.run(weight)の間で異なる値を得たのは、2つの異なるセッションの変数を参照していたからです。 vgg19 = VGG19(weights='imagenet', include_top=False)を実行したとき、Kerasは既にTensorflowセッションを作成し、そのセッションで事前に訓練された値で重みを初期化しました。次に、sess = tf.Session()を実行して、sessという別のTensorflowセッションを作成しました。このセッションでは、重みはまだ初期化されていません。そして、私がsess.run(tf.global_variables_initializer())を実行したときに、このセッションの重みに乱数が割り当てられました。したがって、キーは、TensorflowとKerasを使用しているときに同じセッションで作業していることを確認することです。次のコードは、get_weights()sess.run(weight)が同じ値を示していることを示しています。

import tensorflow as tf 
from keras import backend as K 
from keras.applications.vgg19 import VGG19 

sess = tf.Session() 
K.set_session(sess) 

vgg19 = VGG19(weights='imagenet', include_top=False) 

vgg19.get_layer('block5_conv1').get_weights()[0][0,0,0,0] 
#result is 0.0028906602, this is actually the pretrained weight 

sess.run(vgg19.get_layer('block5_conv1').weights[0][0,0,0,0]) 
#The result here is also 0.0028906602 
+0

あなたの最初のSOの質問を掲示し、あなた自身もそれに答えるのはうまくいっています。 – desertnaut

関連する問題