tensorflow的slim调用预训练模型的权重进行迁移学习的一些感触

背景:这几天找了几个二分类的网络,准备对一些算法进行集成,集成之前决定先把代码跑通。
几个算法是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试着去跑一个出来。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值