Python Keras AttributeError:&x27;非类型';对象没有属性';结束于';in-load_模型

Python Keras AttributeError:&x27;非类型';对象没有属性';结束于';in-load_模型,python,tensorflow,keras,Python,Tensorflow,Keras,我正在处理一个课程作业,我必须在keras中保存和加载模型。我创建模型、训练模型和保存模型的代码是 def get_new_model(输入_形状): """ 此功能应根据上述规范构建一个顺序模型。确保 通过在第一层中提供输入_shape参数初始化权重,该参数由 函数参数。 您的函数还应该使用Adam Optimizer稀疏分类交叉编译模型 熵损失函数和单一精度度量。 """ 模型=顺序([ Conv2D(16,内核大小=(3,3),激活='relu',填充='Same',名称='conv_1'

我正在处理一个课程作业,我必须在keras中保存和加载模型。我创建模型、训练模型和保存模型的代码是

def get_new_model(输入_形状):
"""
此功能应根据上述规范构建一个顺序模型。确保
通过在第一层中提供输入_shape参数初始化权重,该参数由
函数参数。
您的函数还应该使用Adam Optimizer稀疏分类交叉编译模型
熵损失函数和单一精度度量。
"""
模型=顺序([
Conv2D(16,内核大小=(3,3),激活='relu',填充='Same',名称='conv_1',输入形状=输入形状),
Conv2D(8,内核大小=(3,3),activation='relu',padding='Same',name='conv_2'),
MaxPooling2D(pool_size=(8,8),name='pool_1'),
tf.keras.layers.flatte(name='flatte'),
密集型(32,激活class='relu',名称class='Dense_1'),
密集型(10,激活class='softmax',名称class='Dense_2')
])
compile(优化器='adam',loss='sparse\u categorical\u crossentropy',metrics=['acc'])
回归模型
模型=获取新模型(x列车[0]。形状)
def get_checkpoint_every_epoch():
"""
此函数应返回一个ModelCheckpoint对象,该对象:
-仅在每个历元结束时保存权重
-保存到当前工作目录中名为“checkpoints\u every\u epoch”的目录中
-在该目录中生成文件名,如“checkpoint_XXX”,其中
XXX是格式化为三位数字的历元编号,例如001、002、003等。
"""
路径='checkpoints\u every_epoch/checkpoint{epoch:02d}'
检查点=模型检查点(filepath=路径,save\u weights\u only=True,save\u freq='epoch')
返回检查点
def get_checkpoint_best_only():
"""
此函数应返回一个ModelCheckpoint对象,该对象:
-仅保存生成最高验证(测试)精度的权重
-保存到当前工作目录中名为“checkpoints\u best\u only”的目录中
-生成名为“checkpoints\u best\u only/checkpoint”的文件
"""
路径='checkpoints\u best\u only/checkpoint'
检查点=模型检查点(filepath=path,save\u best\u only=True,save\u weights\u only=True,monitor='val\u acc')
返回检查点
def get_early_stopping():
"""
此函数应返回一个EarlyStopping回调,当
在过去三个时期内,验证(测试)准确性没有提高。
提示:使用带有正确“监视器”和“耐心”的EarlyStopping回调
"""
返回提前停止(监视器='val_acc',耐心=3)
checkpoint\u every\u epoch=get\u checkpoint\u every\u epoch()
checkpoint\u best\u only=获取\u checkpoint\u best\u only()
早停=早停()
回调=[checkpoint\u every\u epoch,checkpoint\u best\u only,early\u stopping]
model.fit(x_序列,y_序列,epochs=50,validation_数据=(x_测试,y_测试),回调=回调)
在这里,我将每个历元的权重保存在
checkpoints\u every\u epoch/checkpoint\u{epoch:02d}
中,并将最佳权重保存在
checkpoints\u best\u only/checkpoint中。现在,当我想加载这两个时,使用以下代码

def get_model_last_epoch(model):
"""
此函数应创建您先前创建的CNN的新实例,
加载上一个训练时段的权重,并返回此模型。
"""
filepath=tf.train.latest\u checkpoint('checkpoint\u every\u epoch')
模型加载权重(文件路径)
回归模型
def get_model_best_epoch(model):
"""
此函数应创建您先前创建的CNN的新实例load
在权重上导致最高的验证精度,并返回此模型。
"""
filepath=tf.train.latest\u checkpoint('checkpoint\u best\u only')
模型加载权重(文件路径)
回归模型
model_last_epoch=get_model_last_epoch(get_new_model(x_train[0].shape))
model_best_epoch=get_model_best_epoch(get_new_model(x_train[0].shape))
打印('具有上一历元权重的模型:')
获取测试精度(模型最后一个历元、x测试、y测试)
打印(“”)
打印('具有最佳历元权重的模型:')
获得测试精度(模型最佳历元、x测试、y测试)
我得到一个错误,它是

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-18-b6d169507ca4> in <module>
      3 # Verify that the second has a higher validation (testing) accuarcy.
      4 
----> 5 model_last_epoch = get_model_last_epoch(get_new_model(x_train[0].shape))
      6 model_best_epoch = get_model_best_epoch(get_new_model(x_train[0].shape))
      7 print('Model with last epoch weights:')

<ipython-input-15-6f7ff0c732b4> in get_model_last_epoch(model)
     10     """
     11     filepath = tf.train.latest_checkpoint('checkpoint_every_epoch')
---> 12     model.load_weights(filepath)
     13     return model
     14 

/opt/conda/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/training.py in load_weights(self, filepath, by_name)
    179         raise ValueError('Load weights is not yet supported with TPUStrategy '
    180                          'with steps_per_run greater than 1.')
--> 181     return super(Model, self).load_weights(filepath, by_name)
    182 
    183   @trackable.no_automatic_dependency_tracking

/opt/conda/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/network.py in load_weights(self, filepath, by_name)
   1137             format.
   1138     """
-> 1139     if _is_hdf5_filepath(filepath):
   1140       save_format = 'h5'
   1141     else:

/opt/conda/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/network.py in _is_hdf5_filepath(filepath)
   1447 
   1448 def _is_hdf5_filepath(filepath):
-> 1449   return (filepath.endswith('.h5') or filepath.endswith('.keras') or
   1450           filepath.endswith('.hdf5'))
   1451 

AttributeError: 'NoneType' object has no attribute 'endswith'

我明白了。文件路径名中有错误。我花了很多时间才弄明白。所以正确的函数是

def get_model_last_epoch(model):
"""
此函数应创建您先前创建的CNN的新实例,
加载上一个训练时段的权重,并返回此模型。
"""
模型.装载重量(tf.列车.最新检查点(“每个检查点”)
回归模型
def get_model_best_epoch(model):
"""
此函数应创建您先前创建的CNN的新实例load
在权重上导致最高的验证精度,并返回此模型。
"""
#filepath=tf.train.latest\u checkpoint('checkpoints\u best\u only')
型号、装载重量(tf、列车、最新检查点(“仅检查点、最佳检查点”))
回归模型

而且它不会给出错误,因为
tf.train.latest\u checkpoint
中的文件名是正确的

您是否尝试检查
get\u new\u model(x\u train[0].shape)
等于什么?这是你期望的吗?事实上,先检查一下你从
tf.train.latest\u checkpoint('checkpoint\u every\u epoch')
得到的结果。我从
get\u new\u model(x\u train[0].shape]得到了我期望的结果。
这是用于保存的同一个模型。
tf.train.latest\u checkpoint(“checkpoints\u every\u epoch”
返回文件名,即
checkpoints\u every\u epoch/checkpoint\u 23