2017-09-05 1 views
0

Ich benutze Keras mit Tensorflow. Ein Keras Layer hat eine Methode "get_weights()" und ein Attribut "weights". Mein Verständnis ist, dass "Gewichte" die Tensorflow-Tensoren der Gewichte ausgibt und "get_weights()" die Gewichtstensoren auswertet und die Werte als numme Arrays ausgibt. Die beiden zeigen mir jedoch tatsächlich andere Werte. Hier ist der zu replizierende Code.Keras Gewichte und get_weights() zeigen verschiedene Werte

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. 

Meine Keras Version ist 2.0.6. Mein Tensorflow ist 1.3.0. Vielen Dank!

+0

ich vermeiden um jeden Preis versuchen, direkt tensorflow zu verwenden, wenn keras verwenden. Wenn Keras dir alles gibt, ist es besser, Dinge von Keras zu machen, weil wir nie wissen, was es möglicherweise tun kann, die fehlen werden, wenn du es direkt in Tensorflow umgehst. Ich benutze nur 'get_weights()' und 'set_weights()', und es hat gut funktioniert. –

+0

Es sieht aus wie eine Zufallszahl, weil es eine Zufallszahl ist, ich denke, wenn Sie tf.global_variables_initializer() aufrufen, initialisieren Sie im Grunde alle Gewichtungen auf die standardmäßige zufällige Initialisierung. –

Antwort

1

Die Methode get_weights() bewertet tatsächlich nur die Werte des Tensorflow-Tensors, die durch das Attribut weights gegeben sind. Der Grund, dass ich verschiedene Werte zwischen get_weights() und sess.run(weight) bekam, ist, dass ich auf die Variablen in zwei verschiedenen Sitzungen bezog. Als ich vgg19 = VGG19(weights='imagenet', include_top=False) lief, hat Keras bereits eine Tensorflow-Sitzung erstellt und die Gewichte mit vortrainierten Werten in dieser Sitzung initialisiert. Dann habe ich eine weitere Tensorflow-Sitzung mit dem Namen sess erstellt, indem ich sess = tf.Session() ausgeführt habe. In dieser Sitzung sind die Gewichtungen noch nicht initialisiert. Dann, als ich sess.run(tf.global_variables_initializer()) lief, wurden Zufallszahlen den Gewichten in dieser Sitzung zugewiesen. Der Schlüssel ist also sicherzustellen, dass Sie mit derselben Sitzung arbeiten, wenn Sie Tensorflow und Keras verwenden. Der folgende Code zeigt, dass get_weights() und sess.run(weight) denselben Wert ergeben.

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

Gute Arbeit, wenn du deine erste SO-Frage postest und auch selbst antwortest (du solltest es auch akzeptieren - nichts falsch daran) – desertnaut

Verwandte Themen