Classifier training of inception resnet v1

在这里插入图片描述
只是普通的classifier,不是用triplet那种。Facenet用的是没有ResNet版本的inception网络david指出:

These networks seems to be more difficult to train and does not converge very well when trained on the CASIA/Facesccrub datasets.

说白了就是,不带ResNet的单纯Inception网络在CASIA上不好收敛。

为啥这么说,通过什么观察出来的?

在这里插入图片描述
在训练集上面loss相对地很大,此外,当no regularization被使用的时候,同样表现出训练集上面loss很大, 这就能暗示出模型不能去overfit the data. 不是overfit,而是压根fit不好。

然后他们说那既然纯inception不好,那这样的话,我就用Inception-ResNet-v1,然后发现,就能很好收敛而且在LFW上表现也好。表现好在两个方面:

  • accuracy
  • validation rate

在这里插入图片描述
我没用david库里面的人脸对齐的脚本了,而是用的ZhaoJ的。 而且因为我在我现在的程序里,不像是之前的MTCNN如果要给网络输入的是160*160,那就因为random crop给裁剪出182×182。而是直接裁出来的就是112×112

5. Start classifer training

现在的问题是:

发现我可能少加了一个args

在这里插入图片描述
在这里插入图片描述
这就是要看是不是要对prelogits做出normalization. 我已经于2021.01.22加上了这个args.

但是,在关注这个之前,我们应该先关注:先关注david画的图,他画的图到底用的总loss(这里的总loss指的是包括上regularization loss)还是只是cross_entropy_mean. 先去验证这一点。 这得在TensorBoard产生的数据里面看。

在这里插入图片描述

应该注意的是,可以通过用冒号分隔路径来使用多个数据集的并集。

数据是有了,标签咋弄的?

应该就是把标签转换成从0到类别总数。但是如果数据集之间有类别上的overlap该怎么处理?

在这里插入图片描述
这里的reference有没有特别的意思?

其实这个inference就是给embedding产生一个输入prelogits。给我的感觉prelogits不是全连接层。这个暂时还不确定,得回头确定下

已经确定了,prelogits是来自net的结果,所以就是全连接层。

在这里插入图片描述
而在Inference内部:

在这里插入图片描述

因为和下面inception_resnet_v2的情形是一样的。

在这里插入图片描述
唯一不同就是:scope的名字,但是,这个名字也无关紧要啊。

在这里插入图片描述

在这里插入图片描述
没错。实现了。确实一样,而且在多个测试时候,也是用的Zhaoj非图像格式的测试数据集。所以这点不再担心。

这种当不变化时候,对学习率除以10是惯用,和Marco说得一样。

在这里插入图片描述
下面讲到了我疑惑的参数--prelogits_norm_loss_factor 5e-4, 这个可以让activation更加稀疏,而且能让models范化 a little bit.

在这里插入图片描述
上面的weight decaydropout都是为了防止过拟合,除了上面这两个,L1 norm loss同样也能让模型更泛化一些。所以,不管咋样,还是得先带上。

在这里插入图片描述

regularization

我先不加这个参数,先跑一个。然后不行再加上。如果行的话,也可以下次再加上。 2021.1.22后加上了。

6. Running TensorBoard(optional)

在这里插入图片描述

7. Plotting the learning curves

7.1 LFW accuracy

在这里插入图片描述
这个文件具体的内容如下:

在这里插入图片描述

这是在LFW上测试的。然后,LFW test accuracy而不是training accuracy啥的。所以这个标题下面的那个图,意义不大。但是,david画的这些图像都是带着pnlf情况的结果得到的。另外的话,是不是这些图都是他提供的m文件画出来的? 是的

在这里插入图片描述
在这里插入图片描述

在这里可以看出,即使最后一次评估的准确度为0.9965,最近10次评估的平均准确度也较低(0.9950),这可能更接近再现结果时的预期。 例如,在比较不同的超参数设置时,平均值可能是更好的指标。

这个平均值是怎么获得的??? 应该是train_softmax.py程序里的LFW验证部分的代码决定的。

在这里插入图片描述

这个先不细究

7.2 Training /Validation cross entropy loss

在这里插入图片描述
看这个抬头的话,应该只是cross entropy loss而不是加上regularization loss的总loss.

确实的,可以在代码里看出来,每个部分都有自己专门画图的代码。

  • 有专门画cross_entropy
  • 有专门画regularization loss
  • 有专门画total loss

在这里插入图片描述
在这里插入图片描述
到底是啥,这下面给出了:

在这里插入图片描述

这明确了就是cross-entropy loss, 但是得知道具体是哪个python的变量保存出来的。

在这里插入图片描述
我自己的话是27000~多张图像。

`has been filtered with a sliding average filter over 500 steps(这个500在程序的哪里体现)
在这里插入图片描述

m文件里体现。

在这里插入图片描述

这块终于写了,终于写了到底是用的什么画的图???

写了这个cross_entropy during training but has filtered with a sliding average filter over 500 steps 所以,我也得用average过的

因为MATLAB的监控文档里提到经过平滑处理的训练准确度

贴个图,更加好观察。

在这里插入图片描述
那这明显就是cross_entropy_1而不是cross_entropy__raw_

但是从0开始就有一个竖线这种的,不光cross_entropy有,而且total_loss也有。但是通过不止查看趋势,而是看下Y軸,就知道9左右开始,那说明应该就是cross_entropy而不是总的。更何况的是,都说了每个都有自己画自己的那部分代码

在这里插入图片描述

而且这里是经过平滑处理的训练cross-entropy. 而且指明了是经过滑动平均滤波器sliding average filter, 在程序上的对应是:也是找cross_entropy_1而不是cross_entropy_raw.

这要看这个l是什么,

在这里插入图片描述
这个l无非就是在一个List里面遍历,大约是[loss1, loss2, loss3..., total loss]这种. 也就是各个单独losstotal loss. 这么看的话,就是每个单独的losstotal loss都有raw版本,然后,也都有平均过的版本。

而David画图用的是非raw版本,也就是平均过的版本,所以应该是下面这句代码, 而且是单独loss里的cross_entropy_1(
_1就是区别于raw的平均后版本。)

tf.summary.scalar(l.op.name, loss_averages.average(l))

这个问题的最终解,还是得归到m文件。去看m文件怎么从state里找到具体画滑动平均的那个变量名。

在这里插入图片描述
是这个xent_loss.

有几个全连接层?

在这里插入图片描述
先把图例都放在这里,我们知道蓝色代表的是全连接层(有时候在一些博客里也经常写成Dense layer, 没错,确实有时候也写成dense layer.).

在这里插入图片描述
on each of FC layer

因为有另外一篇博客,讨论VGG16的博客. 明确说了VGG16有了三个DENSE layer.

在这里插入图片描述
通过上图,确实是三个Dense layer. 然后接下来关注的是每个全连接层有多少神经元。

在这里插入图片描述

  • 第一个全连接层 4096
  • 第二个全连接层 4096
  • 第三个全连接层 1000

另一个链接10个CNN图示也能很好地说明确实是三个,然后4096-4096-1000

在这里插入图片描述

因为讨论VGG16的博客这个有明确的文字描述,而且附带了具体对应程序的链接

我们看到:

在这里插入图片描述
所以,我们知道,应该是看括号里面的第2位,然后,我们知道:

如果看的是第二位,确实就能对应上,4096->4096->1000.

从上面这个图,可以看出来,总共三个FC,但是只有两个涉及Dropout.

所以,难道是三个里有两个利用Dropout, 感觉就算用两个也没毛病,最后一个都是分类用的了,还Dropout什么啊?

有待验证:最后一个是不是都是softmax所在,然后单元数目是不是就是分类数目?

YES,是的,如下图所示:

在这里插入图片描述
能看到最后一个上面就是有个S, 而且类别数1000就是单元数目。

于是,我最先想到的是去看这个代码链接的系列里有没有inception_resnet_v1的代码,然后从代码里看出来到底多少个Dense layer以及每个dense layer含有多少神经元

但是,却没有, 却没有inception_resnet_v1的

在这里插入图片描述

因此,我转而要去看inception的,所以定下来去看inception.py. 而且在这个py文件里,我们知道:里面有个def inception_v3和class Inception3. 那还得分清楚到底是前面中的哪一者真正定义了网络的结构。

从下图可以看出,涉及到真正的网络模型时,def inception_v3还是class Inception 3可以从代码中看出来的。

在这里插入图片描述
最终还是去找class Inception3。因此,根据之前怎么看FC,就按照dropout去找,应该就在Dropout附近。

搜索后,有两个位置涉及dropout.

一个位置是在class Inception3__init__里:

在这里插入图片描述
另一个位置是在class Inception3__forward里面:

在这里插入图片描述
所以, 我得去图示里看下inception_v3的结构。

确实是有主和副的。

在这里插入图片描述
但是,能看出来无论是主还是副都是两个FC。 所以这么从图上看的话,就是确实能够确定出来FC。

主的是:2048--->1000
副的是: 768--->1000

综上,感觉不要再找dropout而是应该找768或者FC这些字眼

768的结果能找到副的:

副的:看括号里面的第二个字,我们就知道是7681000

在这里插入图片描述
2048 的结果能找到主的,在class Inception3()__init__里面

在这里插入图片描述
主的:看括号里面的第二个字,我们就知道是20481000

其实就是要确定是不是多少FC是由self.fc确定的。好像是的。 为了节省篇幅,以副的程序为例子:

在这里插入图片描述
在副的里确实有两个self.fc, 一个跟768有关,一个跟1000有关。一个在副的滴__init__位置,一个在forward位置.

而在主的里也确实有两个self.fc. 一个跟2048有关,一个跟1000有关。一个在__init__位置,一个在_forward位置.

该核对的是: 看看之前写的,如果之前写的没毛病,就是去和我自己的程序结合着看,从而确定我自己到底有多少FC

通过检查,确实就是找变量名fc就能实现对哪个是全连接层的确定

InceptionV3FC这个找完了,落回到我的Inception_ResNet_v1. 在看自己的代码之前,因为10个CNN图示里面有提及Inception_ResNet_v2, 所以,我去先看看Inception_ResNet_v2

在这里插入图片描述
其实吧,这个1536Inception-v4的数值。

在这里插入图片描述
那么这个1536到底算的是Dropout的还是Average Pooling的?

根据下面这个图,能看出来Global Average Pooling被单独放出来。所以,是 dropout那个层被当作FC了。

在这里插入图片描述

副的不看。只看主的。带有fully_connected的有几个呢?

在这里插入图片描述
如果说有两个,那么另一个在哪?应该就是上图中的Dropout那行。

net =slim.dropout(net,
dropout_keep_prob,
is_training=is_training,
scope='Dropout')

如果net的维度是1792或者1536就能说明两个FC都找到了。可以去看我的程序了。

我把我程序里的哪个算上了? 算上的如下面一系列的图所示:

  • 第一个
    在这里插入图片描述
  • 第二个

在这里插入图片描述

  • 第三个

因为在前面别人的tutorial里,数目为分类类别数的,都被算作FC。 所以,我还缺那个,得把num_classes那个也当作FC。

对于David之前的Softmax, 那么下面这个图就是第三个

在这里插入图片描述
对于我目前的Cosface, 下面这个图就是第三个。好像还得和LIYule的Cosface版本再对照检查一次。

在这里插入图片描述
这个xw_norm的维度应该是10575

因为这个是缩放之前的logits. 缩放通过下面代码实现:

在这里插入图片描述
看看那几个相关的数值都长成什么样子:在这里插入图片描述
再看一眼David版本的,从而验证我自己的到底对不对。

在这里插入图片描述

感觉是对的啊! 都是(?,10575).

排故部分

应该先把不该删掉的带上然后训练一次,前提是:

应该确定到底怎么画得sliding average.

此外, 原来的david有prelogits_norm而且LiYuLe的CosFace也有fc_bn

两者分别如下:

在这里插入图片描述
Li的:

在这里插入图片描述
因此,基于两者都有的这一点,我觉得还是一定要加上这个prelogits_norm的。

感觉调通这个程序有点费劲了,如果可能的话,还是直接在程序里找准变量,然后出来画。

本身画图的那个程序不行,如下所示,压根没有readlogs这个函数的定义
在这里插入图片描述
这可不只这一个函数啊,少太多函数了。fileread这个函数也没有。

在这里插入图片描述
所以,转变策略,去自己做个滑动平均。

  1. 也就是:先不平滑,先把加上norm的,然后把index同样变成1,然后把他们画到一个图里面。还没完成。
  • 已经把davidsoftmax我之前的softmax比较完了,但是还得将我前一步(基于david和我之前),再补上cosface里新加上的。 已经加上了。完成

  • 然后把最终的softmax和我目前的cosface比较,再对cosface补充,从而得到最终cosface. 2021.01.26正在开展这个工作。 完成

  • 还涉及到底要不要在最后的层里面给cosface的版本加上weight_decay. 先不加,先训练一个。

  • 该查查summary writer. 先重新查一下公共部分。再单独查不同的部分。完成

  • 现在把两个版本都重新移动到PG,但是不覆盖。记住保留之前的。先弄cosface的,传上去训练着,然后再弄softmax的。两个本地的都移动到PG了,但是对应的训练脚本还没改,尤其是cosface的。

現在一共有如下三種:

  • 只是加了prelogits_norm
  • 不加dropout的只是降低到0.5
  • 512後面dropout

然後我們就該:該畫曲線了。還是通過曲線才能判斷出來。

在这里插入图片描述
沒有必要,沒有必要申請72小時。申請48/足夠了,申請36也夠。

  • 該先把这些结果整理出来发给Marco.
  • 然后上传一个训练softmax的。
  • 然后去调整新的loss了。
  • 此外,感觉应该在200-275之间再设置个新的learning rate.
  • 那该怎么保证这套超参数对于所有的loss都好使呢。

Accuracy得到啥样才行?

在这里插入图片描述

  • 在数值的绝对大小上,training accuracy得到0.95左右,然后validation accuracy得到0.88左右。
  • 在对比趋势上,在整体上validation accuracy肯定还是小于training accuracy.
  • 在对比趋势相差多少数额上,有的区间段相差将近0.2, 有的区间相差0.05左右, 这些数值都是我大约估计的数值。

Case 1:

在这里插入图片描述
在高点,training accuracy居然有0.91111, 然后对应位置的validation accuracy0.48。 然后说明确实过拟合了。说明只是添加prelogits_norm是不够的,还是会过拟合。

Case 2: 不仅仅prelogits_norm而且drop掉更多。

在这里插入图片描述
不太行啊。training accuracy才达到0.8validation accuracy也只是到0.47。 而且后来val accuracy还在下降。这种下降的也是难得的现象,是不是有什么预示???? 感觉改变drop_rate反而让效果不好了。

Case3: 最大特点在于加了dropout.

在这里插入图片描述
我进行了三大类的对比,我发现只有加了dropout层的这个吧,trainingvalidation相差得最少。而且在training accuracy0.75时候, validation accuracy居然有0.55之高。 这和david的规律很像啊

此外,这个validation accuracy=0.55是所有情形里目前最高的。

所以,根据这个图示得到启发,那就再降低一下学习率试试。自己又加了个除以10的学习率试验了下。得到的图像如下:

case4: 只是多添加个除以10的学习率

在这里插入图片描述

在这里插入图片描述
可以看出在225epoch时候有个小小的抬升。 那如果我把这个学习率调整到更小,那是不是意味着抬升更大。并不是的,因为下面marco建议的话给我们佐证的证据,太小也好,就不再发生任何变动。

case5: 用Marco推荐的学习率

在这里插入图片描述
可以看出来,在100个epoch的时候,因为学习率过小,validation accuracy就不再有所提升了。其实在横轴120 epoch的时候对validation accuracy的提升就很低了。在横轴140的时候,就更是可以认为从那以后再也没提升过。 所以,借用二分查找的思想,确定120就是这个模型能接受的最低学习率,对应的数值刚好是

在这里插入图片描述
所以,最低也就只能是0.0005左右。 这么说得话,那我自己加的小数点后4个00.00005就不行。 行不行不是跑过了么。贴个图看看。从accuracy上看,确实在225以后有个小小的都基本看不出来的抬升。所以,最低界限就是0.0005

在这里插入图片描述
从loss上看,我们知道,225以后一样是没啥降低和改善。所以,0.00005这个数值确实没啥用。综上,0.0005可能是对于CASIA上训cosface来说可以设定的最小的学习率下界。所以,真正有意义的学习率范围应该是参考下图来得到:

在这里插入图片描述

在这里插入图片描述

只是修改学习率

  • 第一选择, 还是用0.1那套学习率。然后训练30 epoch。因为这是多数论文里用的。
    在这里插入图片描述
    已经上传 是0.1initial_30那个, 训练完毕了,从log文本里看的话,训练30epoch是不够的,总结的结论已经在ArcFace博客中。画个图看看如下:

在这里插入图片描述
最奇怪的是

这怎么还有那么长的一段,都是Validation Accuracy大于training accuracy?

CSDN链接

在这里插入图片描述
我这里验证时候的数据, 做不做和训练时候一样的那些数据增强操作?

  • 第二选择,还是由0.1开始,训练90 epoch. 因为是小数据集,所以我更加偏向这个,而不是275epoch。如果不行的话,就在中间除以2,来有更多steps. 我画图去验证自己的这个想法是否可行
    在这里插入图片描述
    已经上传 是0.1initial_90那个

它的图如下:

在这里插入图片描述
确实是,确实是,每当validation accuracy不变动的时候,就改变学习率,然后就能抬升,但是通过我的实验,我发现,改到太小以后就不好使了。就像上图80000 steps时候的微弱抬升刚好对应的是0.001变到0.0001

所以,在这里的话,大体规律是: 把学习率设置成0.0001以下是不行的,或者说顶多再除以2, 也就是 0.0001 / 2 = 5 e − 05 = 0.00005 0.0001/2=5e-05=0.00005 0.0001/2=5e05=0.00005这是接下来做实验我要进行尝试的点。

  • 第三选择:不用0.1开始,而是按照david的0.05开始,训90个。
    在这里插入图片描述
    这个相当于是我加了dropout以后的第一次训90。我画个图看看,因不因为加了dropout可以在训练90个就达到好效果。

在这里插入图片描述
可以知道的是:还是满足学习率变动validation accuracy就增高的规律。
但是没试验过不加dropout的记录指标无误版本的90好像。

可以看出来一个优势,那就是
0.05 90epoch这个版本的话,他们的training accuracy和validation accuracy他们两者相差不那么多,要是能稳稳得再将training accuracy提升一下,然后validation accuracy稳稳地跟上来的话。就非常可以了。

通过对比之前的用vgg2训练275 epoch的有dropout和无dropout另外层的曲线,得出两个规律:

  1. 没有另外层的版本training accuracy可以达到0.9左右,但是validation accuracy却只能达到0.5左右。而且200 epoch后相距甚远。
  2. 有另外层的版本training accuracy只能达到0.75多,但是吧,validation accuracy却能够达到0.55

如果根据上面的描述,问题就在于如何把training accuracy提升到百分之90。我准备用混搭LR试试。

我再次看看单纯增加更多epochs,结论是:

不太行的。

  • 把学习率调整到更小,不增加epoch
  • 把学习率调整到更小,增加epoch

只是修改dropout

同时修改dropout和学习率

Loss得到啥样才行?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值