集成学习
在监督学习算法中,我们希望训练得到的模型是一个各方面都稳定表现良好的模型,但是实际情况中却往往得到的是在某方面有偏好的模型。集成学习则可以通过多个学习器相结合,来获得比单一学习器更优越的泛化性能。
集成学习是指通过构建并结合多个学习器来完成学习任务的分类系统,根据个体学习器是否为同一类可以分为同质集成和异质集成。
一般集成学习会通过重采样获得一定数量的样本,然后训练多个弱学习器(分类精度稍大于50%),采用投票法,即“少数服从多数”原则来选择分类结果,当少数学习器出现错误时,也可以通过多数学习器来纠正结果。
目前根据个体学习器的生成方式,集成学习可以分为两大类:
1)个体学习器之间存在较强的依赖性,必须串行生成的序列化方法:boosting类算法;
2)个体学习器之间不存在强依赖关系,可以并行生成学习器:bagging和随机森林
深度学习中的集成学习
snapshot ensembling(快照集成学习)
在训练两个相同的神经网络时,采用 weight snapshot 策略,并在训练结束后创建一个具有相同结构、带不同权重的集成模型。
实验证明这种方式得到的集成模型可以提高最终的测试性能,而且这也是一种非常简单的方法,你只需每次训练一个模型,大大减少计算的时间成本。
这种方法很适合这次的实操,shvn的数据集比较庞大,但是大多数人只能用cpu进行训练。而且模型比较简单。所以需要一个能够更加方便且高效的集成学习方式来使训练更加的有效率,预测的更加准确。
————————————————————————————————————————
05.30
运行baseline遇到的错误:
UnidentifiedImageError Traceback (most recent call last)
<ipython-input-18-86fde20dfa30> in <module>()
2 model.load_state_dict(torch.load('/content/drive/My Drive/model.pt'))
3
----> 4 test_predict_label = predict(test_loader, model, 1)
5 print(test_predict_label.shape)
6
原因:test_path路径不正确,没有load进去图片
05.31
- 根据baseline训练epoch==50时
得到的结果
初步判断可能有以下几个原因:
- epoch训练次数不足
- resnet中有几次下采样处理,使小目标在特征图的尺寸基本上只有个位数的像素大小,导致设计的目标检测分类器对小目标的分类效果差。
- 训练数据质量不高
于是打算调整一下模型:
- 用yolov3来进行训练
- 将json文件中的数据添加到label.txt等文档中
(原本还以为要把json文件转成xml,结果发现不用,只要将图片信息导入label.txt等文件中就行)
import os
import random
import json
import glob
trainval_percent = 0.2
train_percent = 0.8
train_path = glob.glob(r'C:\Users\Mzk\Desktop\tianchi\mchar_train\*.png')
train_path.sort()
txtsavepath = r'C:\Users\Mzk\Desktop\tianchi'
anno = json.load(open(r'C:\Users\Mzk\Desktop\tianchi\mchar_train.json'))
num = len(anno)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
ftrainval = open(r'C:\Users\Mzk\Desktop\tianchi\ImageSets/trainval.txt', 'w')
ftest = open(r'C:\Users\Mzk\Desktop\tianchi\ImageSets/test.txt', 'w')
ftrain = open(r'C:\Users\Mzk\Desktop\tianchi\ImageSets/train.txt', 'w')
fval = open(r'C:\Users\Mzk\Desktop\tianchi\ImageSets/val.txt', 'w')
for x in range(len(train_path)):
name = train_path[x][-10:] + '\n'
if x in trainval:
ftrainval.write(name)
if x in train:
ftest.write(name)
else:
fval.write(name)
else:
ftrain.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
生成4个文件
生成的训练集和验证集的比是8:2
06.01
-
使用kmeans聚类计算数据集的anchor boxes
(应该是会变小,因为图片分辨率不大,为了更好地训练需要将anchor boxes调小,有助于模型快速收敛) -
字符切割