脚本参考这里
- 每个图像的多个标签中的单个目标标签进行了编码(是One-hot encoding,也做label smoothing)
- 在训练数据集上对目标蛋白质分布进行可视化分析
- 得到一个简单的图像生成器,用来生成一个目标-蛋白质-期望列表。这个返回列表中每个样本至少得到一个匹配结果
- 在验证模型上有一些新想法
- 使用keras构建了一个baseline模型
- 建立一个模型参数类,该类包含构建一个模型需要的所有参数、以及加载数据和数据预处理的方法。
- 一个可以使用CPU\GPU的数据generator,可用于训练和验证
- 一个图像预处理器,包括尺度变换、形状变换和归一化,用来做模型学习时的数据增强
- 通过keras的callback来跟踪损失变化,进而提高baseline模型的性能
1 代码分析
模型的设置
class KernelSettings:
def __init__(self, fit_baseline=False,
fit_improved_baseline=True,
fit_improved_higher_batchsize=False,
fit_improved_without_dropout=False):
self.fit_baseline = fit_baseline
self.fit_improved_baseline = fit_improved_baseline
self.fit_improved_higher_batchsize = fit_improved_higher_batchsize
self.fit_improved_without_dropout = fit_improved_without_dropout
这里设置了4个层次。
- fit_baseline:基础模型。
- fit_improved_baseline:改进基础模型。
- fit_improved_higher_batchsize:更高的batch size,有可能优化到局部最优。
- fit_improved_without_dropout:不带dropout的模型,可能会过拟合。
使用变量use_dropout来表示是否在网络训练中加入dropout层。
在../input/文件下有两个文件夹。
['protein-atlas-eab-predictions', 'human-protein-atlas-image-classification']
这里主要使用文件夹human-protein-atlas-image-classification
中的内容来进行分类,在该文件夹下面有2个文件夹和2个文件分别是
- train:包含训练的图片
- test:包含测试的图片
- train.csv:包含图片和标签信息
- sample_submission.csv:包含上传数据的信息
这里需要注意的是,train.csv的target中可能包含多个标签,因此做数据处理的时候这个要着重处理下。也就是说在一张图片中可能有多种蛋白质。
代码继续往下,训练数据总共有31072张图片,提前想想也知道我们的数据一定存在样本不均衡的问题。用sklearn的StratifiedKFlod的方法吗?后面再看吧。
用来测试的图片有11702张,那么
表示测试数据是训练数据的38%。这个比例还是可以的。
对target的field做处理,这里用到了pandas的DataFram的apply函数技巧,注意使用apply对行进行处理要用到axis=1这个参数,否则默认为axis=0,就是对列进行处理了。
对target的处理是,将每列的target都转换为一个整数类型的数值列表,使用apply函数对指定分类下的target进行标记,如果在数值列表中有,则记为1,其它为0。
经过改变之后对标签进行统计,如下图所示
图1 蛋白质数量分布
由图1可知,有明显的样本不均衡的问题。
再来看看标签之间的相关性,就是混淆矩阵
图2 混淆矩阵
由图2可知,Lysosomes和endosomes相关性非常高,几乎同时出现。
网友评论