web-dev-qa-db-fra.com

Tensorflow à Keras: erreur de définition du graphique d'importation sur le modèle Keras

J'ai un code Tensorflow pour classer les images que je veux convertir en code Keras. Mais j’ai des problèmes avec l’API de niveau supérieur qui n’a pas tous les codes que je désire. Le problème sur lequel je suis resté est le suivant: 

#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')

ce code donne l'erreur: 

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__'

Est-ce que quelqu'un pourrait m'aider avec ce graphique?

5
Anna Jeanine

Obtenir le graphique

Vous pouvez obtenir le graphique de Keras avec: 

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

Vous pouvez probablement le transmettre à import_graph_def, mais je suppose que c'est déjà le graphe par défaut de Tensorflow, car dans le lien ci-dessous, le créateur de Keras dit qu'il n'y a qu'un seul graphe. 

Plus dans: https://github.com/keras-team/keras/issues/3223

Suggestion de travail

Je ne sais pas ce que vous essayez d’atteindre, mais si l’idée est d’utiliser Keras régulièrement, vous n’aurez probablement jamais besoin de saisir le graphique.

Dans Keras, une fois que vous avez créé votre modèle avec net = tf.keras.applications.VGG16(), vous commenciez à utiliser les méthodes Keras de ce modèle, telles que:

#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)    

L'accès aux poids et aux couches se ferait par:

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

Si vous essayez d'importer tensorflow formé dans keras, vous devez d'abord considérer que la dénomination de la variable de chaque modèle de keras correspond aux variables du modèle de tensorflows. Pour montrer cela, j'ai créé un modèle simple avec une seule entrée et une seule sortie sans couche masquée. Pour traiter le problème de nommage, j'ai créé le modèle en utilisant les couches de keras et l'ai utilisé pour entraîner le modèle.

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)

Ajustez maintenant le réseau avec le jeu de données factice, puis enregistrez le modèle en utilisant 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")

Vous pouvez maintenant créer le même modèle en utilisant des keras et charger des poids en utilisant tensorflow comme suit. 

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")

Vous pouvez maintenant utiliser votre modèle pour prédire ou ce que vous voulez.

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