交叉验证时划分数据的方式
交叉验证是机器学习中常用的一种策略,其核心是对数据集进行划分,本文介绍sklearn中的3种交叉验证时划分数据集的方法: 123KFoldStratifiedKFoldGroupKFold 这里来举例说明各个方法的使用。 先来导入这些方法,并创建一个简单的数据集: 12345from sklearn.model_selection import KFold,StratifiedKFold,GroupKFoldx=[1,2,3,4,5,6,7,8,9,10]# 特征y=[0,0,0,0,0,1,1,1,1,1]# 标签group=['a','a','a','b','b','b','b','c','c','c']# 样本所在的组 KFoldKFold只需要特征x就能够完成数据划分 123kf = KFold(n_splits=3,shuffle=True)#...
目标检测:Two-stage
RPN寻找每一个anchor匹配到的GT box,所以是多对一(不一定每个anchor都能找到匹配的GT box,原因见第三行) 假设有m个GT box,n个anchor,则有一个mxn的矩阵M, M[i,j]代表第j个anchor与第i个GT box之间的IOU anchor和GT...
ToothSeg项目总结
项目目标是打造一款牙齿分割器,它可以将一张人脸露齿图分割成共3个类别:上牙,下牙以及其他。 采集露齿微笑的图片作为样本,每个人通过摆出不同嘴型来贡献多个样本。在剔除牙齿比较模糊的图片后,总共得到2000+样本,使用labelme进行标定。 将标定好的数据处理成PascalVOC格式。 按照8:2划分训练集和验证集,基于DeepLabV3+搭建baseline. 输入网络的图片是512*512的。 数据增强: 随机翻转 随机旋转 随机模糊 中心随机裁剪 mIoU=0.8638. 修改网络结构:参考fpn的思想,原先的网络只使用了backbone提取的特征图的高层信息和低层信息,我们把中间层的信息也提取出来,自上而下的进行特征融合(插值上采样,求和或拼接),代码实现在decoder模块中。 mIoU=0.874,有提升。 将交叉熵损失改为Focal Loss,mIoU不升反降,由于调参花费时间会较长,因此不用Focal...
如何在网页上部署深度学习模型?
当训练好你的深度学习模型后,就可以考虑部署了。 今天介绍一种简易的部署方式:使用Flask作为后端,将PyTorch模型部署到网页上。 网络模型使用的是torchvision中集成的densenet121,并且已经在imagenet数据集上进行了预训练,网络的输入是1张图片,输出是这张图片的类别(1 from...
经典语义分割网络:UNet
UNetUNet是为了解决医学图像分割任务提出的,它基于FCN,并设计了更为巧妙的网络结构: 由于网络结构看起来像一个U字母,因此得名UNet. 从整体来看,左侧是编码器部分,负责提取输入图像的高层语义信息;右侧是解码器部分,负责解码高层语义信息并输出最终的分割图。 在解码阶段,还引入了类似跳连的结构,将编码阶段的中间结果直接加了进来。 观察UNet的网络结构,可以发现: 编码器重复如下结构:两次卷积使得通道数加倍,后接一次池化使得特征图尺寸减半。 解码器重复如下结构:上采样使得特征图尺寸加倍,后接两次卷积使得通道数减半。 值得注意的是,在语义分割中,输入与输出的尺寸一般都是是一致的,而UNet却不同。 UNet是为医学图像分割任务而设计的,为了更好的预测图像边界区域,采用了Overlap-tile...
经典语义分割网络:FCN
从分类任务说起语义分割是一个像素级的分类任务。 在图像分类任务中,输入一张图片,输出这张图片的类别。 在语义分割任务中,输入一张图片,输出这张图片中每一个像素所属类别,因此,语义分割中输入的图像(通道数为3,一般的图片通常含有RGB这3个通道)尺寸和输出结果(也是一张图,通道数为1,每个像素点的取值代表该像素点所属类别对应的取值)的尺寸是一样的。 在之前,我们已经实现过许多的分类网络,这些网络最后都在卷积层后面接上全连接层,以输出分类结果。 但是语义分割的输出是一张单通道的图片,所以直接将以上网络拿过来用是行不通的。 FCN的网络结构FCN( Fully Convolutional Networks, ...
经典推荐模型:NFM
NFM将FM中的二阶交叉项替换成了一个神经网络,使得NFM能够进行二阶以及二阶之上的特征交叉,增强了模型的表达能力。 NFM模型如下: 其中的f(x)便是上面提及的用于替换FM中二阶交叉项的神经网络。 NFM的结构如下,注意,这里并没有画出来一阶部分,只展示了f(x): 自下往上看。 将输入的稀疏特征向量经过Embedding层,得到对应的稠密编码向量。注意图中的$v_i,i=2,4,7,…$是一个n*k的矩阵,n是第i个特征域所含不同特征取值总数,k是Embedding的维度。 接下来进入BiInteraction Pooling层进行特征交叉,该层所执行的操作如下: $x_iv_i$是一个长度为k的向量(k是Embedding的维度,其实这个向量就是第i个类别特征取值对应的Embedding向量),$x_jv_j$同样也是一个长度为k的向量,两者做element-wise product,即使对应位置相乘,此时得到的还是一个长度为k的向量。在进行完所有特征交叉(即element-wise...
用Python实现协同过滤算法
本文分享两种经典协同过滤算法的Python实现: 基于物品的协同过滤算法 基于用户的协同过滤算法 代码来自Github开源项目:fun-rec. 在开始之前,先导入用到的库: 1234567import pandas as pdimport numpy as npimport warningsimport random, math, osfrom tqdm import tqdmfrom sklearn.model_selection import train_test_splitwarnings.filterwarnings('ignore') 数据准备本次使用的数据是一份电影评分数据: ::将数据集划分成4列,从左到右分别代表:用户id,电影id,评分值,时间戳。 首先将原始数据转换成pandas的数据框表示: 然后提取每个用户评价过的电影,格式如下: 稍后的ItemCF和UserCF都将使用这个表。 数据处理完整代码如下: 12345678910111213141516171819202122232425262728def...












