web-dev-qa-db-fra.com

L'objet 'Sequential' n'a pas d'attribut '_is_graph_network' lors de l'exportation du modèle Keras vers TensorFlow

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?

7
Romeo Kienzler

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.

2
Guozhen

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. 

0
BobbyG