首页 文章

将Keras模型导出到TensorFlow时,'Sequential'对象没有属性'_is_graph_network'

提问于
浏览
7

我正在尝试将Keras模型导出到TensorFlow .

Keras版本2.1.4 TF版本1.3.0 Numpy版本1.13.3

这是模型:

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

这是导出代码:

from tensorflow.python import keras
estimator_model = keras.estimator.model_to_estimator(keras_model=model)

这是错误:

INFO:tensorflow:使用提供的Keras模型 . 信息:tensorflow:使用默认配置 . 警告:tensorflow:使用临时文件夹作为模型目录:/home/dsxuser/.tmp/tmpbgYQQa INFO:tensorflow:使用config:{'save_checkpoints_secs':600,' session_config':无,'_ keep_checkpoint_max':5,'_ task_type': 'worker','_ global_id_in_cluster':0,'_ is_chief':是的,'_ cluster_spec':,'_ evaluation_master':'','_ save_checkpoints_steps':无,'_ keep_checkpoint_every_n_hours':10000,'_ service':无,'_ num_ps_replicas': 0,'_ tf_random_seed':无,'_ master':'','_ num_worker_replicas':1,'_ task_id':0,'_ log_step_count_steps':100,'_ model_dir':'/ home / dsxuser / .tmp / tmpbgYQQa',' _save_summary_steps':100}来自tensorflow.python import keras的()1中的AttributeErrorTraceback(最近一次调用last)----> 2 estimator_model = keras.estimator.model_to_estimator(keras_model = model)/ opt / conda / envs / DSX-Python27 model_to_estimator中的/lib/python2.7/site-packages/tensorflow/python/keras/_impl/keras/estimator.pyc(keras_model,keras_model_path,custom_objects,model_dir,config)476 477 ker as_weights = keras_model.get_weights() - > 478 if keras_model._is_graph_network:479#TODO(yifeif):将checkpoint初始化移至scaffold.init_fn 480 _save_first_checkpoint(keras_model,AttributeError:'Sequential'对象没有属性'_is_graph_network'

有任何想法吗?

2 回答

  • 0

    你需要这个 from tensorflow.python.keras import Sequential 你应该使用在tensorflow中实现的keras api而不是直接使用keras api .

  • 2

    我也有同样的问题 . 我正在导入keras如下 from tensorflow import keras from keras.models import Sequential model = Sequential()

    等等它在这一行上失败了: estimator_model = keras.estimator.model_to_estimator(keras_model=kerasModel())

    错误:

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

    我正在使用tensorflow 1.7

    我通过明确指定模型的层来找到解决方案:

    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
    

    即通过加入keras.layers . 在上面的每一行中 . 以前我依赖进口:

    #from keras.models import Sequential 
    #from keras.layers import Dense, Dropout, Flatten 
    #from keras.layers import Conv2D, MaxPooling2D
    

    正如你所看到的,我现在已经注释掉了 . 请注意,我也放了keras.models . 在Sequential()前面也可能是必要的 . 看看这是否适合你 .

相关问题