背景:这几天找了几个二分类的网络,准备对一些算法进行集成,集成之前决定先把代码跑通。
几个算法是Inception系列的InceptionV3,InceptionV4,Inception_Resnet_V2,之前也试过用VGG19作为backbone(主干网络)来进行迁移训练,简单来说做的事情就是使用在imagenet等数据集上训练过的网络,改变最后的分类层来进行训练。
迁移训练/学习,有几种方式:
一:全部训练,将所有网络层放开,加上后面的分类层一起做反向传播训练,每次整个网络的所有参数要改变一次。
二:将前面的网络部分冻结起来,不改变其参数,只训练最后几个分类层,由于前面的网络在大规模的数据集上训练过了,拥有了一定捕捉特征的能力,所以对于足够的提取特征能力,再次分类就足够了。
但是进行学习最好的方式是将几种办法复合起来,首先将所有层都放开进行训练,这样能够让模型对我们自己的数据样本有一个适应的过程,个人理解的是,我们自己的样本中有一些特征不易捕捉,原来的网络中并未捕捉到,所以将前面的网络层进行开放,进行特征的补充学习。之后再将前面的网络层冻结,针对我们的数据进行训练,让后面的分类层能够更好地对我们自己地数据进行分类,最终提升精度。
这是在网络是否开放训练上做的文章,与之不同的是在数据上做的文章。
这里举一个浙大一个实验室做对身份证人脸识别的例子,他们的训练是这样的:首先使用现有的大量人脸数据集(其中包括全世界的人种)进行训练,第二步使用网络搜集的亚洲面孔进行训练,最后才是使用现有的身份证素材进行训练,这样一个过程对于缺乏数据的状况也是一个好的解决办法。
在训练过程中调参(学习率等)我并不擅长,因为还是做的太少,下一步要逐渐感受一下调参。
下面写一下TFBOY这几天使用tensorflow的slim的感受。
本人路子比较野,对官方的文档或者说明比较抗拒,因为首先是用不习惯,其次是阅读能力比较差,还是比较喜欢CSDN上的网友一步步细致教学,所以做什么东西就会先去搜教程,跟着做一遍,之后再自己摸索。
对我来说,跟keras简洁的集成相比,slim的使用难度要大一些,因为要修改的地方比较多,很多代码封装得比较复杂,同时模型也是不像keras一样直接封装.h5这样简洁明了,而是先是需要加载文件夹中带的构建模型的代码,之后使用自己下载的参数权重(.ckpt文件)加载进去进行训练。
但是对于我这个学习阶段的人来说是好处比较多的,不像keras的代码封装得很死,slim的代码都是开放的,参数之类的都写得明明白白,之后使用shell文件启动训练,观看日志,启动restful服务等一系列流程虽然稍微复杂,但也让人比较安心,弄懂了这些内部的机制,对于tf的理解会比较加深,同时构建工程组织代码的功力会明显提高,所以接下来的日子里要好好研读这些代码,会有一个阶段性的进步。
同时还有一个问题就是今天在使用keras的时候报了一个错误,是在与训练模型顶部构建新的分类层的时候产生的,报错的原因是:先前加载的预训练模型构建的各层使用的是原生的keras.layers进行构建的,而之后在添加分类层的时候,竟然不可以使用tf下的keras进行构建,看样子还需要对版本进行一些调整才能使用(没办法只能使用原本机器的CPU训练。。。训练专用机的环境不敢乱动)
鉴于这些,keras实在是有些不友好了,但是有人说过,封装的好的东西,灵活性上一定会有局限的,这也是取舍吧。
暂时使用的几种都是进行分类的网络,还没有进行到物体检测部分的网络,如果要进行物体检测,就不能单纯使用slim现有的功能进行了,接下来要做的是一个图像分割的网络,同样的,准备先跑通,之后再补充细节。
明天准备做和活体检测有关的工作。
一条路是活体检测的sdk,部署一下试一试怎么样。
另一条路是看网上有教程自己做一个试试好了。
然后是UNET试着去跑一个出来。