Keras分割数据集训练(加载上次模型用新数据集继续训练)及常见ValueError

  • 基本逻辑就是保存上个数据集训练好的模型,然后再load_model()加载,用新数据集训练
  • 易错点
    • 比如第一次训练得到模型a.model,下次利用load_model()加载该模型,对新数据集进行训练,如果不加处理的话很可能报错:
      ValueError: Error when checking target: expected input_6 to have shape (13966,) but got array with shape (11640,)
      我这里是因为 :
      模型训练时的数据集中,poi_loc数据项的类型是(13966,2)
      而新加入的数据集中poi_loc数据项的类型是(11640,2)
      将新旧数据集该项类型统一后就可以正常load_model()了。
      具体如何统一就具体问题具体分析了,我的方法是调整每个数据集中poi_loc的数据条数直到类型一致就解决了。(手动二分hhh)
# 加载上次的模型
        if os.path.exists(self.model_name):
            self.model = load_model(self.model_name,custom_objects={'acc_top1':self.acc_top1,'acc_top5':self.acc_top5,'acc_top10':self.acc_top10,'acc_top20':self.acc_top20})
        else:
            self.model = Model(inputs=[x1, x2, x1_t, x2_t, x1_d, x2_d, y_t1, y_t2, user], outputs=output)
            self.model.compile(
                loss='categorical_crossentropy',
                optimizer=adam(
                    lr=self.lr),
                metrics=[
                    self.acc_top1,
                    self.acc_top5,
                    self.acc_top10,
                    self.acc_top20])

# 停止条件
        self.early_stopping = EarlyStopping(monitor='val_loss', patience=self.earlystop)
# 断点保存模型(不需要也可以model.save(),再load_model())
        self.checkpoint = ModelCheckpoint(self.model_name, monitor='val_loss', verbose=0, save_best_only=True,save_weights_only=False, mode='min')
            

你可能感兴趣的:(python,机器学习)