增量训练,前一次训练能力丢失的问题。
Created by: 707503331
-
版本、环境信息: 1)PaddlePaddle版本:1.4.1 3)GPU:百度1小时的GPU算力卡 4)系统环境:Python3.5
-
模型信息 1)模型名称 Mobilenet V1 2)自定义数据集 3)使用算法名称 4)模型链接
-
复现信息:如为报错,请给出复现环境、复现步骤
-
问题描述:先训练数据集A,再增量训练数据集B,2个数据集没有交接; A训练完毕,做一次预测,打印出来的是是本次定义的标签; B训练完毕,用与A同样的预测数据,做一次训练,打印出来的都是B数据集的标签定义; 结论:A数据集训练的“标签”都丢失了,貌似被覆盖了。
以下是我的训练程序(摘自夜雨飘零的博客,改造了部分代码):
-- coding: utf-8 --
import os import shutil import mobilenet_v1 import paddle as paddle import reader import paddle.fluid as fluid
crop_size = 224 resize_size = 250 #checkpoint = 'MobileNet/119' checkpoint = None #训练总数 trainNumber = 100 #最后一次训练id lastTrainNo = trainNumber - 1 classDim = 4000
f = open("log.txt", "w")
定义输入层
image = fluid.layers.data(name='image', shape=[3, crop_size, crop_size], dtype='float32') label = fluid.layers.data(name='label', shape=[1], dtype='int64')
获取分类器,因为这次只爬取了6个类别的图片,所以分类器的类别大小为6
model = mobilenet_v1.net(image, classDim)
获取损失函数和准确率函数
cost = fluid.layers.cross_entropy(input=model, label=label) avg_cost = fluid.layers.mean(cost) acc = fluid.layers.accuracy(input=model, label=label)
获取训练和测试程序
test_program = fluid.default_main_program().clone(for_test=True)
定义优化方法
optimizer = fluid.optimizer.AdamOptimizer(learning_rate=1e-3, regularization=fluid.regularizer.L2DecayRegularizer(1e-4)) opts = optimizer.minimize(avg_cost)
获取自定义数据
train_reader = paddle.batch(reader=reader.train_reader('../data/data8509/train_list.txt', crop_size, resize_size), batch_size=32) test_reader = paddle.batch(reader=reader.test_reader('../data/data8509/test_list.txt', crop_size), batch_size=32)
定义一个使用GPU的执行器
place = fluid.CUDAPlace(0) #place = fluid.CPUPlace() exe = fluid.Executor(place)
进行参数初始化
exe.run(fluid.default_startup_program())
if checkpoint is not None: print('----加载历史训练数据---%s'%(checkpoint)) fluid.io.load_persistables(exe, checkpoint, main_program=fluid.default_startup_program())
定义输入数据维度
feeder = fluid.DataFeeder(place=place, feed_list=[image, label])
训练10次
for pass_id in range(trainNumber): # 进行训练 for batch_id, data in enumerate(train_reader()): train_cost, train_acc = exe.run(program=fluid.default_main_program(), feed=feeder.feed(data), fetch_list=[avg_cost, acc])
# 每100个batch打印一次信息
if batch_id % 100 == 0:
print('Pass:%d, Batch:%d, Cost:%0.5f, Accuracy:%0.5f' %
(pass_id, batch_id, train_cost[0], train_acc[0]),file=f)
# 进行测试
test_accs = []
test_costs = []
for batch_id, data in enumerate(test_reader()):
test_cost, test_acc = exe.run(program=test_program,
feed=feeder.feed(data),
fetch_list=[avg_cost, acc])
test_accs.append(test_acc[0])
test_costs.append(test_cost[0])
# 求测试结果的平均值
test_cost = (sum(test_costs) / len(test_costs))
test_acc = (sum(test_accs) / len(test_accs))
print('Test:%d, Cost:%0.5f, Accuracy:%0.5f' % (pass_id, test_cost, test_acc),file=f)
f.flush()
#保存模型后续增量训练
model_path = os.path.join('MobileNet',str(pass_id))
if not os.path.isdir(model_path):
os.makedirs(model_path)
fluid.io.save_persistables(exe, model_path, main_program=fluid.default_main_program())
if pass_id == lastTrainNo:
# 保存预测模型
save_path = 'infer_model'
# 删除旧的模型文件
shutil.rmtree(save_path, ignore_errors=True)
# 创建保持模型文件目录
os.makedirs(save_path)
# 保存预测模型
fluid.io.save_inference_model(save_path, feeded_var_names=[image.name], target_vars=[model], executor=exe)
f.close()