构造验证集:
避免过拟合与欠拟合的发生。尤其是过拟合,
过拟合 的情况是数据集太少,差别不是太大
本次数据集已经分好,只要训练测试集。
训练集和验证集分开的,验证训练集的方法:
将训练集划分为K份,其中K-1份作为训练集,剩余的一份作为验证集,循环K训练。这种划分方式是所有的训练集都是验证集,最终模型验证精度是K份平均得到。这种方式的有点是验证集精度比较可靠稳定,训练K次得到K个多样性差异模型,CV验证缺点是需要训练K次,不适合数据量恒大情况。
解决过拟合和欠拟合的方法
1增加数据:比如通过数据扩增等方法增加数据
2降低模型复杂度。比如减少网络层数,减少神经元个数,减少树的深度
3加入正则化,给模型一定的正则约束
4集成学习方法
降低欠拟合的方法:
1添加新特征,
2增加模型负梯度
3减少正则化系数
模型训练与验证:
构造训练集和验证集
每轮进行训练和验证,并根据最优精度去验证
model = SVHN_Model1()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), 0.001)
best_loss = 1000.0
use_cuda = False
if use_cuda:
model = model.cuda()
for epoch in range(2):
train_loss = train(train_loader, model, criterion, optimizer, epoch)
val_loss = validate(val_loader, model, criterion)
val_label = [''.join(map(str, x)) for x in val_loader.dataset.img_label]
val_predict_label = predict(val_loader, model, 1)
val_predict_label = np.vstack([
val_predict_label[:, :11].argmax(1),
val_predict_label[:, 11:22].argmax(1),
val_predict_label[:, 22:33].argmax(1),
val_predict_label[:, 33:44].argmax(1),
val_predict_label[:, 44:55].argmax(1),
]).T
val_label_pred = []
for x in val_predict_label:
val_label_pred.append(''.join(map(str, x[x!=10])))
val_char_acc = np.mean(np.array(val_label_pred) == np.array(val_label))
print('Epoch: {0}, Train loss: {1} \t Val loss: {2}'.format(epoch, train_loss, val_loss))
print('Val Acc', val_char_acc)
# 记录下验证集精度
if val_loss < best_loss:
best_loss = val_loss
# print('Find better model in Epoch {0}, saving model.'.format(epoch))
torch.save(model.state_dict(), './model.pt')