记:昨日调休上课,没有学习,但是理了理后续如何学习和安排
今日学习内容:
①阅读相关关于经典CNN网络的文章综述
②开始自己敲原先视频项目的代码,发现光看加解析还是没有锻炼代码能力
文章综述笔记:
- LeNet-5:最简单的网络结构,是cnn的模板:堆栈式卷积和池化层,且以一个或者多个全连接层为最后输出
- AlexNet:在①中堆叠了层数,使用ReLU作为激活函数的CNN
- VGG-16:更多的规模
- Inception-v1:重要的改变,提高网络内部计算资源的利用率,采用紧密模块/板块构建网络。不采用堆叠卷积层的方法,而是堆叠由卷积层组成模块的方法
Network in Network 方法,采用Inception Module ,3个思想:
采用不同过滤器的并行卷积塔,然后进行堆叠,采用 1×1、3×3 、5×5 卷积核,识别不同特征,从而对其进行“聚类”;
1×1 卷积核用来进行维度裁减;
1×1 卷积核在一个卷积内增加了非线性;
5.Inception-v3:批量正则化
注:批量正则化。缓解了梯度传递问题,以及饱和非线性激活问题,通过平滑优化解空间,起到了正则化作用,使模型对大步长学习率敏感度降低,更加易于训练。
6.ResNet-50:以上增加CNN层数到一定层数精度到达饱和,网络性能开始下降,故使用ResNet(残差网络),可以不在采用全连接的方式输出。ResNet很像负作用的前向反馈。
7.Xception:Inception网络结构的应用,Inception模块被替换成深度可分解卷积,对每个信道进行 1×1 卷积,对每个输出进行 3×3 卷积。这等同于将 Inception 模块替换成深度可分解卷积
8.Inception-v4:加残差。
改变了 Stem 模块。
增加了更多的 Inception 模块。
采用了 Inception-v3 的 Uniform 选择(初始化方法,和什么zeros、ones、normal类似),意味着在每个模块中采用了相同数量的过滤器。
9.Inception-ResNets:和Inception-v4出自一篇文章。
把 Inception 模块转换为残差 Inception 模块。
增加了更多的 Inception 模块。
在 Stem 模块后面,增加了一种新型的 Inception 模块(Inception-A)。
10.ResNeXt- 50:和ResNet类似。ResNeXt 在每个模块上增加了并行塔/分支、路径。
代码问题
module中自己敲敲,
在主函数中需要加载Net,故需要设一个Net的文件,但是定义的是一个class而不是def,因为在后续需要定义def,不能重了
定义class:class Net(nn.Module)
nn.Module中有前向传播等基本功能,继承给Net,然后可以在__init__方法中定义网络的结构和操作。最后,通过net = Net()语句实例化了Net类,得到一个名为net的对象,即神经网络模型的实例。
关于init的初始化:
def __init__(self):
super().__init__()
序列化和非序列化的区别
#序列化:
self.features =nn.Sequential(
nn.Conv2d(3,6,5,1),
nn.ReLU(),
nn.MaxPool2d(2,2),
nn.Conv2d(6,16,5,1),
nn.ReLU(),
nn.MaxPool2d(2,2)
)
#无序列化:
self.conv1 =nn.Conv2d(3,6,5,1)
self.relu1 =nn.ReLU()
self.pool1 =nn.MaxPool2d(2,2)
self.conv2 =nn.Conv2d(6,16,5,1)
self.relu2 =nn.ReLU()
self.pool2 =nn.MaxPool2d(2,2)
self.flatten =nn.Flatten()
self.fl1 =nn.Linear(16*5*5,120)
self.relu3 =nn.ReLU()
self.fl2 =nn.Linear(120,10)
以及记住要def forward()