零基础入门CV赛事-Task5 模型集成

非监督学习之k-means

K-means通常被称为劳埃德算法,这在数据聚类中是最经典的,也是相对容易理解的模型。算法执行的过程分为4个阶段。
1.首先,随机设K个特征空间内的点作为初始的聚类中心。
2.然后,对于根据每个数据的特征向量,从K个聚类中心中寻找距离最近的一个,并且把该数据标记为这个聚类中心。
3.接着,在所有的数据都被标记过聚类中心之后,根据这些数据新分配的类簇,通过取分配给每个先前质心的所有样本的平均值来创建新的质心重,新对K个聚类中心做计算。
4.最后,计算旧和新质心之间的差异,如果所有的数据点从属的聚类中心与上一次的分配的类簇没有变化,那么迭代就可以停止,否则回到步骤2继续循环。
K均值等于具有小的全对称协方差矩阵的期望最大化算法
sklearn.cluster.KMeans
class sklearn.cluster.KMeans(n_clusters=8, init=‘k-means++’, n_init=10, max_iter=300, tol=0.0001, precompute_distances=‘auto’, verbose=0, random_state=None, copy_x=True, n_jobs=1, algorithm=‘auto’)
“”"
:param n_clusters:要形成的聚类数以及生成的质心数
:param init:初始化方法,默认为’k-means ++’,以智能方式选择k-均值聚类的初始聚类中心,以加速收敛;random,从初始质心数据中随机选择k个观察值(行
:param n_init:int,默认值:10使用不同质心种子运行k-means算法的时间。最终结果将是n_init连续运行在惯性方面的最佳输出。
:param n_jobs:int用于计算的作业数量。这可以通过并行计算每个运行的n_init。如果-1使用所有CPU。如果给出1,则不使用任何并行计算代码,这对调试很有用。对于-1以下的n_jobs,使用(n_cpus + 1 + n_jobs)。因此,对于n_jobs = -2,所有CPU都使用一个。
:param random_state:随机数种子,默认为全局numpy随机数生成器
“”"
from sklearn.cluster import KMeans
import numpy as np
X = np.array([[1, 2], [1, 4], [1, 0],[4, 2], [4, 4], [4, 0]])
kmeans = KMeans(n_clusters=2, random_state=0)
方法
fit(X,y=None)
使用X作为训练数据拟合模型
kmeans.fit(X)
predict(X)
预测新的数据所在的类别
kmeans.predict([[0, 0], [4, 4]])
array([0, 1], dtype=int32)
属性
clustercenters
集群中心的点坐标
kmeans.cluster_centers_
array([[ 1., 2.],
[ 4., 2.]])
labels_
每个点的类别
kmeans.labels_
k-means ++

学习目标

学习集成学习方法以及交叉验证情况下的模型集成
学会使用深度学习模型的集成学习

集成学习方法

在机器学习中的集成学习可以在一定程度上提高预测精度,常见的集成学习方法有Stacking、Bagging和Boosting,同时这些集成学习方法与具体验证集划分联系紧密。

由于深度学习模型一般需要较长的训练周期,如果硬件设备不允许建议选取留出法,如果需要追求精度可以使用交叉验证的方法。

下面假设构建了10折交叉验证,训练得到10个CNN模型。
IMG

那么在10个CNN模型可以使用如下方式进行集成:

对预测的结果的概率值进行平均,然后解码为具体字符;
对预测的字符进行投票,得到最终字符。
5.3 深度学习中的集成学习
此外在深度学习中本身还有一些集成学习思路的做法,值得借鉴学习:

Dropout

Dropout可以作为训练深度神经网络的一种技巧。在每个训练批次中,通过随机让一部分的节点停止工作。同时在预测的过程中让所有的节点都其作用。
IMG
Dropout经常出现在在先有的CNN网络中,可以有效的缓解模型过拟合的情况,也可以在预测时增加模型的精度。

定义模型

class SVHN_Model1(nn.Module):
def init(self):
super(SVHN_Model1, self).init()
# CNN提取特征模块
self.cnn = nn.Sequential(
nn.Conv2d(3, 16, kernel_size=(3, 3), stride=(2, 2)),
nn.ReLU(),
nn.Dropout(0.25),
nn.MaxPool2d(2),
nn.Conv2d(16, 32, kernel_size=(3, 3), stride=(2, 2)),
nn.ReLU(),
nn.Dropout(0.25),
nn.MaxPool2d(2),
)
#
self.fc1 = nn.Linear(3237, 11)
self.fc2 = nn.Linear(3237, 11)
self.fc3 = nn.Linear(3237, 11)
self.fc4 = nn.Linear(3237, 11)
self.fc5 = nn.Linear(3237, 11)
self.fc6 = nn.Linear(3237, 11)

def forward(self, img):        
    feat = self.cnn(img)
    feat = feat.view(feat.shape[0], -1)
    c1 = self.fc1(feat)
    c2 = self.fc2(feat)
    c3 = self.fc3(feat)
    c4 = self.fc4(feat)
    c5 = self.fc5(feat)
    c6 = self.fc6(feat)
    return c1, c2, c3, c4, c5, c6

5.3.2 TTA
测试集数据扩增(Test Time Augmentation,简称TTA)也是常用的集成学习技巧,数据扩增不仅可以在训练时候用,而且可以同样在预测时候进行数据扩增,对同一个样本预测三次,然后对三次结果进行平均。

1 2 3
IMG IMG IMG
def predict(test_loader, model, tta=10):
model.eval()
test_pred_tta = None

TTA 次数

for _ in range(tta):
test_pred = []

   with torch.no_grad():
       for i, (input, target) in enumerate(test_loader):
           c0, c1, c2, c3, c4, c5 = model(data[0])
           output = np.concatenate([c0.data.numpy(), c1.data.numpy(),
              c2.data.numpy(), c3.data.numpy(),
              c4.data.numpy(), c5.data.numpy()], axis=1)
           test_pred.append(output)
   
   test_pred = np.vstack(test_pred)
   if test_pred_tta is None:
       test_pred_tta = test_pred
   else:
       test_pred_tta += test_pred

return test_pred_tta

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值