Part One——Code Train《猫狗大战》

Enviroment

vscode:1.83.0

python 3.11.3

pytorch 2.0.1

1.导入库 pytorch等

#本次内容是使用LeNet实现猫狗图片的二分类

# 源数据(https://www.kaggle.com/datasets/tongpython/cat-and-dog/data)

#这里已经下载到本地

MyDataLoader

用os中库读取本地文件 并根据图片的名字进行处理 分类

使用DataLoader 将train分为200个batch 并打乱

image-20231022232232438

创建网络

super是为了继承父类的init所使用的,

借鉴作业四中的leNet代码 在此基础上增加一个卷积层和池化操作,最后output是个2维向量,并且修改最后的ReLU为Sigmoid更适合二分类模型

损失函数和优化器分别为交叉熵和Adam 学习率为0.001

image-20231022232253709

训练过程

最后Epoch:9 Acc:0.9925

验证集有0.8070的精准度

最后再测试集上加载模型

提交在AI研习社

resNet

接着使用resNet重新新训练

用现成的resnet34

需要设置一下function 为 全连接层

损失函数和优化器相同

跑了50m 最后Acc0.9917

在验证集上达到了 0.9525的精确度

最后把test的分类结果写道csv中,提交

最后得分95.95也是比leNet高了不少

Part Two——Q&A

  1. Q:Residual learning 的基本原理?

    A:Residual 是残差 resNet是残差网络 一般的神经网络的每一层分别对应于提取不同层次的特征信息,有低层,中层和高层,而网络越深的时候,提取到的不同层次的信息会越多,而不同层次间的层次信息的组合也会越多。深度学习对于网络深度遇到的主要问题是梯度消失和梯度爆炸,传统对应的解决方案则是数据的初始化(normlized initializatiton)和(batch normlization)正则化

    ​ resNet需要构建残差元 它很容易训练,是前向和反向都可以保证,线性使得网络加深,可以达到1000层精度提升可以被移植到其他问题。 对于残差元的主要设计有两个,快捷连接和恒等映射,快捷连接使得残差变得可能,而恒等映射使得网络变深,而恒等映射主要有两个:快捷连接为恒等映射和相加后的激活函数去构造映射H(x),与构造残差映射F(x)是等价的,此外残差映射也更容易优化。

  2. Q:Batch Normailization 的原理,思考 BN、LN、IN 的主要区别。

    A:BN对N、H、W做归一化,而保留通道 C 的维度。BN对较小的batch size效果不好。BN适用于固定深度的前向神经网络,如CNN,不适用于RNN;

    是对不同样本里面的同一个特征通道进行归一化处理,逐特征维度归一化

    LN在通道方向上,对C、H、W归一化,主要对RNN效果明显;

    IN在图像像素上,对H、W做归一化,用在风格化迁移;

  3. Q:为什么分组卷积可以提升准确率?即然分组卷积可以提升准确率,同时还能降低计算量,分数数量尽量多不行吗?

    A:分组卷积能减少运算量和参数量,所以不容易过拟合,相同输入输出大小的情况下,减少为原来的分组数分之一
    分组数量并不是越多越好,当分组数目与输入图像channel相同,达到最大分组数,此时使用分组卷积会降低各个通道间的关联性,从而使得准确率降低。