it-swarm.com.de

Tensorflow nach Keras: Fehler beim Import des Diagrammdiagramms in das Keras-Modell

Ich habe einen Tensorflow-Code zum Klassifizieren von Bildern, die ich in Keras-Code konvertieren möchte. Ich habe jedoch Probleme mit der übergeordneten API, die nicht alle Codes enthält, die ich möchte. Das Problem, an dem ich festgeblieben bin, ist: 

#net = get_vgg_model() <- got tf.VGG16 model
net = tf.keras.applications.VGG16()


g1 = tf.Graph()
with tf.Session(graph=g1, config=config) as sess, g1.device('/cpu:0'):
    tf.import_graph_def(net['graph_def'], name='vgg')

dieser Code gibt den Fehler aus: 

Traceback (most recent call last):
  File "app.py", line 16, in <module>
    from modules.xvision import Xvision
    File "/app/modules/xvision.py", line 84, in <module>
       tf.import_graph_def(net['graph_def'], name='vgg')
   TypeError: 'Model' object has no attribute '__getitem__'

Könnte mir jemand mit dieser Grafik helfen?

5
Anna Jeanine

Das Diagramm erhalten

Sie können das Diagramm von Keras erhalten mit: 

import keras.backend as K
K.get_session().graph

Sie können es wahrscheinlich an import_graph_def übergeben, aber ich vermute, es ist bereits der Standardgraph von Tensorflow. 

Mehr in: https://github.com/keras-team/keras/issues/3223

Arbeitsvorschlag

Ich weiß nicht, was Sie erreichen wollen, aber wenn Keras regelmäßig verwendet wird, brauchen Sie wahrscheinlich nie die Grafik zu greifen.

Sobald Sie in Keras Ihr Modell mit net = tf.keras.applications.VGG16() erstellt haben, würden Sie Keras-Methoden aus diesem Modell verwenden, z.

#compile for training
net.compile(optimizer=someKerasOptimizer, loss=someKerasLoss, metrics=[m1,m2])

#training
net.fit(trainingInputs, trainingTargets, epochs=..., batch_size=..., ...)    
net.fit_generator(someGeneratorThatLoadsBatches, steps_per_Epoch=...., ....)

#predicting
net.predict(inputs)
net.predict_generator(someGeneratorThatLoadsInputImages, steps=howManyBatches)    

Der Zugriff auf Gewichte und Ebenen würde folgendermaßen erfolgen:

layer = net.layers[index]
layer = net.get_layer('layer_name')

weights = layer.get_weights()
layer.set_weights(someWeightsList)

allWeights = net.get_weights()
net.set_weights(listWithAllWeights)
6
Daniel Möller

Wenn Sie den trainierten Tensorflow in Keras importieren möchten, müssen Sie berücksichtigen, dass die Benennung der Variablen jedes Keras-Modells mit den Variablen des Tensorflow-Modells übereinstimmt. Um dies zu zeigen, habe ich ein einfaches Modell mit Einzeleingabe und Einzelausgabe ohne verborgene Ebene erstellt. Um Probleme mit der Benennung zu lösen, habe ich das Modell mit Keras-Layern erstellt und zum Trainieren des Modells verwendet.

inputs = tf.keras.layers.Input(shape=(1,), name="inputs")
outputs = tf.keras.layers.Dense(1, activation="linear", name="outputs")(inputs)
model = tf.keras.models.Model(inputs=inputs, outputs=outputs)

Passen Sie nun das Netzwerk mit Dummy-Datasets an und speichern Sie das Modell mit Tensorflow

model.compile(loss="mse", optimizer=tf.keras.optimizers.Adam(1e-1))
x = np.random.randn(1000) * 1000
y = x * .5 + 3
model.fit(x, y, epochs=20, batch_size=32)

with tf.keras.backend.get_session() as sess:
    saver = tf.train.Saver()
    meta_graph_def = tf.train.export_meta_graph(filename='./model.meta')
    save_path = saver.save(sess, "./model.ckpt")

Jetzt können Sie dasselbe Modell mit Keras und Lastgewichten mit Tensorflow wie folgt erstellen. 

inputs = tf.keras.layers.Input(shape=(1,), name="inputs")
outputs = tf.keras.layers.Dense(1, activation="linear", name="outputs")(inputs)
model = tf.keras.models.Model(inputs=inputs, outputs=outputs)

sess = tf.keras.backend.get_session()
saver = tf.train.Saver()
saver.restore(sess, "./model.ckpt")

Jetzt können Sie Ihr Modell zum Vorhersagen verwenden oder was immer Sie möchten.

print(model.predict([10, 2,4,5,6]))
# [[8.000007 ]
# [4.0000067]
# [5.0000067]
# [5.5000067]
# [6.0000067]]
1
Mitiku