人工智能培训

搜索

Unet语义分割及其迁移学习的实现

[复制链接]
was9527 发表于 2018-5-5 09:26:43 | 显示全部楼层 |阅读模式
was9527 2018-5-5 09:26:43 1042 2 显示全部楼层
前言:之前做过用Caffe对Ciffar10数据集和Minist数据集分类的任务,采用的是Lenet等传统CNN网络。虽然Ciffar的部署确实很麻烦,但使用Ciffar更接近底层代码,也初步了解神经网络的基本原理。目前使用了Keras(事实上也并非主流),代码实在是太简洁了,掩盖了相当多的底层原理,这倒不是重点。用他的原因还是因为用caffe部署Unet让我有些力不从心,或许日后还会再尝试,目前来看还是解决当前任务为重。
阅读原文获取Keras_unet代码。
任务:使用Tensorflow+Keras 搭建Unet网络实现对肾小球基膜的逐像素分割。
思路起初看到要做基膜分割,就已经知道要处理的是边缘识别问题。现有的工具并非做不到优质的效果,但开弓没有回头箭,不撞南墙不死心。传统CNN,由于网络结构的限制,它能处理回归问题(没做过)和分类问题(宏观)。逐像素分类看起来是能做,毕竟也是二分类的问题,但实际上会丢失很多宏观信息。FCN的结构在2015年被提出,Unet也随之被发表。相关文献后台回复对应名称可见。事实上网络一直在增加,不妨先采用Unet来作为我们迁移学习的出发点。
步骤:
1 数据处理

首先是对获取的原始数据进行标定。工具大多采用 labelme,师兄使用的是PS把原图进行二值化标定。
 第一步先进行数据增强,[color=rgba(0, 0, 0, 0.84)]示例转换:像素颜色抖动,旋转,剪切,随机裁剪,水平翻转,拉伸,镜头校正。
第二步进行数据格式和大小的转换。CNN中由于只有下采样,因此预测使用的图片必须和数据集图片的大小一致。Unet增加上采样因此输出的特征图和原图一致,所以不必规定预测图片的大小。话说回来,数据集中图片的大小还是要求统一,并且在本方法中要把标签和数据连接成高维向量。
2 网络搭建

d60N1LpsEnl0N6y2.jpg
显而易见,Unet在左边增加了上采样,并且还会把原来的输出合并到右侧。最后一层也变成了卷积层,从而可以对每个像素进行分类。
具体搭建网络的函数详见 Keras中文文档(http://keras.io/zh/)。
在keras中看不懂的参数就去翻TF文档,还看不懂就去翻Numpy文档。
3 训练
训练也是在Unet.py中一同进行。
4 预测 
见代码 predict.py
5 注意
如果预测结果全黑或全白,请下载网盘中的权重。链接:http://pan.baidu.com/s/1BIslRFmr7r9HUa4s7YVojw 密码:cjh1。
7
原代码是作者去年完成,距离我上次部署也已经过去一个月。如果有任何问题,欢迎交流和指正。另外,在公众号写Blog实在太难受了,今后会在Github上完成后转载到此处。


-------------------------------------------------------------------------------
上面的话写的时间比较早,存在草稿里面没发。
下面讲的是之后做的工作。
1  首先是区分 迁移学习 和 fine-tune 

    迁移学习,故名思意,就是将已经训练完成模型的一部分参数迁移到新的模型中来。我们都知道,训练一个复杂的神经网络是非常费时费力的过程。往往我们需要收集大量已经标注好的训练集,使用昂贵的 GPU 提供算力,再花费不少的时间,才能训练出一个表现不错的模型。如果两个任务如果存在一定的相关性,比如已经训练好的一个非常优秀的猫狗识别模型,现在需要完成猫兔识别。我们就无需从头开始训练新模型,可以将原模型中的一些权值和中间层迁移到新模型中,这样就大大降低了我们需要的算力,节省了训练时间。
迁移学习是机器学习中的非常重要,且值得深入研究的领域。反观人类本身,我们其实就拥有强大的迁移学习能力。经常听到的「举一反三」,也就是对迁移学习的最好印证。

    微调:在ConvNet之上替换和重新训练分类器,并通过反向传播微调预训练网络的权重。
2 如何选择



TyTn1Yo2n7SyOTIv.jpg
small or large 指的是自己的数据集大小,similar or differ 指的是自己的数据集和别人数据集的相似程度。
    相似和小数据集:通过不微调小数据集上的权重来避免过度拟合,并使用ConvNet最高级别提取的特征来利用数据集相似度。
    不同的和小的数据集:通过不微调小数据集上的权重来避免过度拟合,并使用ConvNet的较低级别的提取特征,这些特征是更普遍的。
    类似的大型数据集:对于大型数据集,我们可以对训练数据进行过度训练的机会更少,从而对权重进行微调。
    不同的和大的数据集:对于大数据集,我们可以再次对权重进行微调,同时减少过度拟合的机会。


步骤
1) 冻结中间层,只改造最后的输出层  当然,为了得到更好的结果。我们可能会在调整输出层之后,根据实际情况将原模型中的一些层冻结,通过训练让一部分隐含层调整权值。这是一个折中的方案,既保证了一定的准确度,又减少了从 0 开始训练模型的时间。


2 )模型构建 训练和评估


冻结层:http://keras-cn.readthedocs.io/en/latest/for_beginners/FAQ/#intermediate_layer






回复

使用道具 举报

manan666 发表于 2018-6-12 15:52:03 | 显示全部楼层
manan666 2018-6-12 15:52:03 显示全部楼层
作者您好,对您的研究《Unet语义分割及其迁移学习的实现》很感兴趣,能否发一下您的GitHub链接或者在哪里可以学习您的代码
回复 支持 反对

使用道具 举报

admin 发表于 2018-6-12 20:05:47 | 显示全部楼层
admin 2018-6-12 20:05:47 显示全部楼层
manan666 发表于 2018-6-12 15:52
作者您好,对您的研究《Unet语义分割及其迁移学习的实现》很感兴趣,能否发一下您的GitHub链接或者在哪里可 ...

https://github.com/c1a1o1/unet
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表 发新帖

was9527当前离线
新手上路

查看:1042 | 回复:2

快速回复 返回顶部 返回列表