J'essaie d'exporter un modèle Keras vers TensorFlow.
Keras Version 2.1.4TF Version 1.3.0 Numpy Version 1.13.3
Voici le modèle:
img_width, img_height = 150, 150
batch_size = 32
samples_per_Epoch = 1000
validation_steps = 300
nb_filters1 = 32
nb_filters2 = 64
conv1_size = 3
conv2_size = 2
pool_size = 2
classes_num = 3
lr = 0.0004
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(img_width, img_height, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten()) # this converts our 3D feature maps to 1D feature vectors
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Dense(classes_num, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer=optimizers.RMSprop(lr=lr),
metrics=['accuracy'])
C'est le code d'exportation:
from tensorflow.python import keras
estimator_model = keras.estimator.model_to_estimator(keras_model=model)
C'est l'erreur:
INFO: tensorflow: Utilisation du modèle Keras fourni. INFO: tensorflow: Utilisation de configuration par défaut. AVERTISSEMENT: tensorflow: Utilisation du dossier temporaire comme modèle répertoire: /home/dsxuser/.tmp/tmpbgYQQa INFO: tensorflow: utilisation de config: {'_save_checkpoints_secs': 600, '_session_config': aucun, '_keep_checkpoint_max': 5, '_task_type': 'worker', '_global_id_in_cluster': 0, '_is_chief': True, '_cluster_spec': , '_evaluation_master': '', '_save_checkpoints_steps': Aucune, '_keep_checkpoint_every_n_hours': 10000, '_service': Aucune, '_num_ps_replicas': 0, '_tf_random_seed': Aucun, '_master': '', '_num_worker_replicas': 1, '_task_id': 0, '_log_step_count_steps': 100, '_model_dir': '/home/dsxuser/.tmp/tmpbgYQQaa,____. '_save_summary_steps': 100}
AttributeErrorTraceback (l'appel le plus récent en dernier) dans () 1 de tensorflow.python import keras ----> 2 estimator_model = keras.estimator.model_to_estimator (keras_model = modèle)
/opt/conda/envs/DSX-Python27/lib/python2.7/site-packages/tensorflow/python/keras/_impl/keras/estimator.pyc dans model_to_estimator (keras_model, keras_model_path, custom_objects, model_dir, config) 476 477 keras_weights = keras_model.get_weights () -> 478 si keras_model._is_graph_network: 479 # TODO (yifeif): déplace l'initialisation du point de contrôle vers scaffold.init_fn 480 _save_first_checkpoint (keras_model,
AttributeError: l'objet 'séquentiel' n'a pas d'attribut '_is_graph_network'
Des idées?
Vous avez besoin de cela from tensorflow.python.keras import Sequential
Vous devriez utiliser keras api implémenté dans tensorflow au lieu d’utiliser keras api directement.
J'ai le même problème. J'importe les keras comme suit
from tensorflow import keras
from keras.models import Sequential
model = Sequential()
etc. alors il échoue sur cette ligne:
estimator_model = keras.estimator.model_to_estimator(keras_model=kerasModel())
erreur:
/usr/local/lib/python2.7/dist-packages/tensorflow/python/keras/_impl/keras/estimator.pyc in model_to_estimator(keras_model, keras_model_path, custom_objects, model_dir, config)
476
477 keras_weights = keras_model.get_weights()
--> 478 if keras_model._is_graph_network:
479 # TODO(yifeif): move checkpoint initialization to scaffold.init_fn
480 _save_first_checkpoint(keras_model,
AttributeError: 'Sequential' object has no attribute '_is_graph_network'
J'utilise tensorflow 1.7
J'ai trouvé une solution en spécifiant explicitement les couches de mon modèle:
def kerasModel():
# Define the model
model = keras.models.Sequential()
#model = Sequential()
# input: 100x100 images with 3 channels -> (100, 100, 3) tensors.
# this applies 32 convolution filters of size 3x3 each.
model.add(keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3), name="data2d"))
model.add(keras.layers.Conv2D(32, (3, 3), activation='relu'))
model.add(keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(keras.layers.Dropout(0.25))
model.add(keras.layers.Conv2D(64, (3, 3), activation='relu'))
model.add(keras.layers.Conv2D(64, (3, 3), activation='relu'))
model.add(keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(keras.layers.Dropout(0.25))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(256, activation='relu'))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(10, activation='softmax', name='labels'))
# Compile the model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
c'est-à-dire en mettant keras.layers. dans chacune des lignes ci-dessus. Auparavant, je m'appuyais sur les importations:
#from keras.models import Sequential
#from keras.layers import Dense, Dropout, Flatten
#from keras.layers import Conv2D, MaxPooling2D
comme vous pouvez le voir, je viens de le commenter. Notez que j'ai aussi mis keras.models. devant Sequential (), ce qui peut également être nécessaire. Voyez si cela fonctionne pour vous.