Author:张一极 2020·0317·23:37
数据集:cifar10
在alexnet原始网络特征层上,将pooling层改为1x1的卷积层进行试验,有一些研究说会有更好的效果,减少了网络过拟合程度。
alex通过卷积的方式,提取图像特征,在卷积和linear连接处,进行矩阵review,这是keras和tf不需要的操作,keras中通过flatten操作卷积层的输出矩阵展平为1x*的矩阵,送入全连接层,进行下一步的前向传播,而torch中需要你计算目前层的输出通道以后,手动使用view函数:
xxxxxxxxxx
11 x = x.view(x.size(0), -1)
其中x是cnn的feature output,再送进linear中,不然会有维度上不相容的问题。在本次试验中是torch.Size([2000, 4096]),后续接入的就是linear(4096,to),接着下一层输出矩阵维度是前一层的output_1和下一层的to,假如说卷积输出为(4096,256),第一层线性层的维度是(256,128),那么对应的第一层线性层输出就是(4096,128),起到了压缩维度的作用,降维的操作,类似1x1卷积的效果,线性层会有连接过于密集的问题,特别是矩阵较为庞大的时候,故而在之后接入dropout进行随机失活,至于1x1卷积层和一般的降维网络的效果,尝试实验过后发现,还是需要根据数据而定,而本次的结果有一个问题就是不同矩阵输入到一个同样的卷积提取层里,出现了几乎差不多的输出,后来确定了是输入矩阵维度太小,导致了没法顺利收敛的问题:log问题记录
接着我做了个尝试,在pytorch上将这个网络改为1x1的采样卷积发现复现了没法收敛的问题,于是加大了矩阵输入的尺寸,拔高特征梯度。
实验了目前最宽的网络结构:
一度扩充卷积通道到了384通道,跟深层次获取信息,根据这个方法,想更换图片的信息读取方式,类似非rgb的图片信息,用来作为分类依据,也就是频域上的实验。
而后遇到了前向传播中,矩阵梯度消失的问题,我发现在32的分辨率下,cifar是没办法快速收敛的,最终的acc集中在41左右波动,为正常的cnn成绩,通过提高输入的size,可以迅速拔高训练成绩。
Epoch: 001/040 | Batch 000/188 | Cost: 2.3029 Epoch: 001/040 Train ACC: 10.00 | Validation ACC: 10.05 Epoch: 001/040 | Batch 150/188 | Cost: 1.7162 Epoch: 001/040 Train ACC: 33.19 | Validation ACC: 33.20 Epoch: 002/040 | Batch 000/188 | Cost: 1.7275 Epoch: 002/040 Train ACC: 39.50 | Validation ACC: 39.45 Epoch: 002/040 | Batch 150/188 | Cost: 1.3946 Epoch: 002/040 Train ACC: 47.82 | Validation ACC: 46.85 Epoch: 003/040 | Batch 000/188 | Cost: 1.3376 Epoch: 003/040 Train ACC: 51.91 | Validation ACC: 51.45 Epoch: 003/040 | Batch 150/188 | Cost: 1.2320
Epoch: 037/040 Train ACC: 95.96 | Validation ACC: 73.35 Epoch: 038/040 | Batch 000/188 | Cost: 0.1174 Epoch: 038/040 Train ACC: 96.08 | Validation ACC: 73.65 Epoch: 038/040 | Batch 150/188 | Cost: 0.1435 Epoch: 038/040 Train ACC: 96.62 | Validation ACC: 72.60 Epoch: 039/040 | Batch 000/188 | Cost: 0.1059 Epoch: 039/040 Train ACC: 95.63 | Validation ACC: 71.95 Epoch: 039/040 | Batch 150/188 | Cost: 0.1463 Epoch: 039/040 Train ACC: 96.34 | Validation ACC: 72.90 Epoch: 040/040 | Batch 000/188 | Cost: 0.1181 Epoch: 040/040 Train ACC: 95.75 | Validation ACC: 71.75 Epoch: 040/040 | Batch 150/188 | Cost: 0.0693 Epoch: 040/040 Train ACC: 96.78 | Validation ACC: 71.80 Epoch: 040/040 Train ACC: 96.36 | Validation ACC: 72.20 Time elapsed: 13.75 min Total Training Time: 13.75 min
101 self.dense = nn.Sequential(
2 #input (4,256)
3 nn.Linear(4096, 4096),
4 nn.ReLU(inplace=True),
5 nn.Dropout(0.5),
6 nn.Linear(4096, 4096),
7 nn.ReLU(inplace=True),
8 nn.Dropout(0.5),
9 nn.Linear(4096, 10),
10 )
epoches loss:
输入64的情况下,收敛速度慢了很多,原因可能是在前期特征提取层没办法顺利收敛导致的。
最终的情况:
Epoch: 002/050 | Batch 150/188 | Cost: 1.4362 Epoch: 002/050 Train ACC: 47.50 | Validation ACC: 47.7
可以确定的是,64的收敛速度要快于128的feed,最终的效果而言
Train ACC: 99.37 | Validation ACC: 79.25 Time elapsed: 95.16 min Total Training Time: 95.16 min
128的输入条件下,自动清除了0.8的特征层的梯度,陆续摒弃了0.6的神经激活,收敛速度并未收到太大影响,code:
xxxxxxxxxx
1 self.dense = nn.Sequential(
2 #input (4,256)
3 nn.Dropout(0.6),
4 nn.Linear(4096, 4096),
5 nn.ReLU(inplace=True),
6 nn.Dropout(0.8),
7 nn.Linear(4096, 4096),
8 nn.ReLU(inplace=True),
9 nn.Dropout(0.5),
10 nn.Linear(4096, 10),)
目前图片以三通道的形式读取,后续想调研一下新的图片记录方式,或许从神奇的另一个角度,有一个全新的规律存在于这类分类问题上,觉得还可以加上一些tricks,例如10-crop或者144-crop这类的尝试,但是目前只有random-crop的尝试,其他的还未测试。