DataWhale 零基础入门语义分割-地表建筑物识别-Task5
文章目录
模型训练与验证
本章将从构建验证集、模型训练和验证、模型保存与加载和模型调参几个部分讲解,在部分小节中将会结合Pytorch 代码进行讲解。 一个成熟合格所需要具备的功能是: • 在训练集上进行训练,并在验证集上进行验证; • 模型可以保存最优的权重,并读取权重; • 记录下训练集和验证集的精度,便于调参。一、验证集构造
在训练自己的模型的时候需要注意的就是欠拟合和过拟合:
欠拟合:自己的模型在训练集上面的拟合效果就是较差的;
过拟合:自己的模型在训练集上面的效果很好,但是在测试集上面的性能就是直线下降,这个时候就是模型训练过拟合,导致模型的泛化能力较差;
从图中可以看出,随着模型复杂的上升,模型在训练上面的误差是在下降的,但是在某个节点过后,模型在测试集上面的误差上升,也就是模型的复杂度过高导致模型记住了训练集中很多细枝末节不是很重要的规律,那么构建一个训练集防止模型出现这种现象是十分有必要的。
验证集的划分方式:
1、留出法(Hold-out)
对于数据直接划分成训练集和验证集,这样的划分方式十分简单,同时也有效。缺点就是验证集只有一份,模型在训练的过程中也会出现在验证上面过拟合的情况。
适用场景:数据量较大的情况。
2、交叉验证法(Cross validation)
图中将整个数据集化分成了K份,取其中的一份数据作为验证集,那么剩下的k-1份数据作为训练集。那么k个子集可以轮流充当验证集,最终模型的验证的精度是k份验证集的结果平均得到的。
适用场景:这样得到的验证精度是可靠的,但是训练次数会随着划分的子集的个数增加而增加,从而导致效率下降时间过长,所以不适用于数据量大的场景。
3、自助采样法(Bootstrap)
通过有放回的采样方式得到新的训练集和验证集,每次的训练集和验证集都是有区别的。
适用场景:这种划分方式一般适用于数据量较小的情况。
二、模型训练和验证
1.验证集的划分
valid_idx, train_idx = [], []
for i in range(len(dataset)):
if i % 7 == 0:
valid_idx.append(i)
else:
# elif i % 7 == 1:
train_idx.append(i)
train_ds = D.Subset(dataset, train_idx)
valid_ds = D.Subset(dataset, valid_idx)
# define training and validation data loaders
loader = D.DataLoader(
train_ds, batch_size=BATCH_SIZE, shuffle=True, num_workers=0)
vloader = D.DataLoader(
valid_ds, batch_size=BATCH_SIZE, shuffle=False, num_workers=0)
使用的方法是留出法,直接将编号是7的倍数的数据划分到验证集中,由于训练集的数量是十分充足的,这样做的是可行的。
2、模型的获取
def get_model():
model = torchvision.models