初学ResNet

文章详细介绍了卷积神经网络(CNN)的基本原理,包括卷积层、池化层和全连接层的作用,强调了卷积核尺寸、步长和填充的影响。还提到了经典的CNN架构如Alexnet、VGG和ResNet,以及深度学习中遇到的退化问题和ResNet的解决策略。
摘要由CSDN通过智能技术生成

CNN

课程来源:深度学习与计算机视觉

卷积

全连接层的网络输入是一个一维的

而卷积神经网络输入是一个三维的

输入层

在这里插入图片描述

对不同的区域提取出不同的特质,也就是每个小区域可以是一群像素点(像眼睛是聚焦一小块地方去识别特征)

这一个区域就是卷积核,得到的绿色矩阵就像一个特征图!

卷积层

在这里插入图片描述

7x7x3 的最后一个3 是RGB三通道。

多个Filter(卷积核)获取不同特征。

同一个卷积层的卷积核一定是要相同的

经过几次卷积、在这里插入图片描述

先用六个不同的卷积核得到六个特征图,再用十个不同的卷积核得到十个特征图

卷积核的第三个值(第三维度)一定是和前面输入的第三个值(第三维度)是一样的

在这里插入图片描述

在这里插入图片描述

滑动窗口步长:移动大小,对结果的影响就是得到的Output Volume

当步长小,慢慢提取特征,当步长大,大刀阔斧粗略提取特征

CV用CNN一般是单步长,但是NLP有可能用大步长

NLP用CNN,可以用(类似网络滑动窗口)进行用卷积(三个词三个词或者五个字五个字提取特征)

在这里插入图片描述

卷积核尺寸:上述已讲

边缘填充:因为有些点对最终输出结果贡献多,而越边缘的点对最终输出结果贡献少,所以边缘填充,使得原来的边缘不再是边缘,让边缘也对之后的结果产生更大的影响

在这里插入图片描述

卷积核个数:上述已讲

CNN参数相对于全连接层少很多!

池化层

在这里插入图片描述

池化层,做压缩,下采样的!

最大池化比平均池化好得多!

全连接层

最后一层FC:最后一个池化层的三维输出拉直成一个特征向量![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ErN1WYy-1678691053328)(file:///C:/Users/fangz/Pictures/Typedown/0921a0e7-8aa3-428d-926c-a228b7cfa07e.png)]

总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述

经典CNN架构Alexnet

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(在这里插入图片描述

VGG

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述

所有卷积核都是3*3的,但是VGG训练时间比Alexnet长很多,以天为单位!

感受野

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述

VGG就是全用 3 ∗ 3 3*3 33 的!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述

ResNet

实验中发现一个事儿:当计算机性能越来越高,理论上层数越深,效果越好。但堆叠层数越深,居然会退化!但是深度学习应该是层数越深越好嘛。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述

我既要把层数堆叠起来,但是不能让那些影响我模型变差的层数去影响我最终结果。

选拔那些对结果有利影响的层数。同等映射! 中间不好的层数直接跳过。

H ( x ) = F ( x ) + x H(x)=F(x)+x H(x)=F(x)+x x x x 最终也直接拿下来,做一个保底,如果 F ( x ) F(x) F(x) 效果不好,那么Loss函数会将 F ( x ) F(x) F(x) 的影响优化到 0 0 0 直接同等映射!

重新盘活了深度学习!

好的,下面我来解析一下这段代码。 首先,代码开头定义了一个列表 `__all__`,里面只包含了一个字符串 `"ResNet45"`,这个列表的作用是在调用模块的时候,可以通过 `from module import *` 的方式导入指定的符号,这里只导入了 `ResNet45` 这个类。 接下来是 `conv1x1` 和 `conv3x3` 两个函数,分别实现一个 $1\times1$ 和一个 $3\times3$ 的卷积层,这两个函数的输入参数包括输入通道数、输出通道数、步长、组数和膨胀率等。 然后是 `BasicBlock` 类,它包含了两个卷积层和一个残差连接。其中 `expansion` 是扩展系数,表示残差块中第二个卷积层输出的通道数与第一个卷积层相同还是扩展了几倍。`__init__` 方法中,首先调用父类的 `__init__` 方法进行初始化,然后定义了两个卷积层、两个 BN 层和一个 ReLU 层。在 `forward` 方法中,首先将输入保存到 `identity` 变量中,然后经过第一个卷积层、BN 层和 ReLU 层,再经过第二个卷积层和 BN 层,最后将输入和残差相加,并经过 ReLU 层输出。 接下来是 `ResNet45` 类,它是整个网络的主体部分,由多个 `BasicBlock` 组成。在 `__init__` 方法中,首先调用父类的 `__init__` 方法进行初始化,然后定义了一个卷积层、一个 BN 层、一个 ReLU 层和一个最大池化层。接着调用 `_make_layer` 方法构建了四个残差块,其中第一个残差块的输入通道数为 64,后面每个残差块的输入通道数都是前一个残差块输出通道数的 $2$ 倍。最后加上一个自适应平均池化层和一个全连接层,输出分类结果。 `_make_layer` 方法中,首先判断是否需要进行下采样,如果需要则定义了一个 1x1 的卷积层和一个 BN 层,用于将输入通道数转换为输出通道数。然后按照残差块的个数循环调用 `BasicBlock` 类构建残差块。 在 `forward` 方法中,先经过一个卷积层、BN 层和 ReLU 层,再经过一个最大池化层和四个残差块,最后经过一个自适应平均池化层、展平和一个全连接层输出分类结果。 总体来说,这个 ResNet45 的实现比较简洁清晰,代码结构也比较清晰易懂,适合初学习和理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值