CNN的基本概念、常用的计算公式和pytorch代码_计算图cnn-程序员宅基地

技术标签: cnn  深度学习  pytorch  


一、CNN的基本概念

卷积填充池化参考此处
激活函数参考此处
简言之:
卷积有助于我们找到特定的局部图像特征。
池化是用于特征融合和降维,还可以防止过拟合。
激活函数是增加非线性,主要是为了解决梯度消失和梯度爆炸问题

二、常见的卷积

参考此处

1.一般卷积

这个就是最常见的卷积了,看动图比较容易理解。
在这里插入图片描述

2.扩张卷积(空洞卷积)

这个主要用来扩大感受野,改变扩张率可获得多尺度信息。

3.转置卷积(反卷积)

就是卷积的逆过程做还原(恢复尺寸不恢复值),比如要可视化、分割还原、gan生成等。

4.可分离卷积

可分离卷积主要可分为空间可分离卷积和深度可分离卷积。

4.1.空间可分离卷积

用2个1D卷积核代替1个2D卷积核得到同样的结果,这样减少了计算量。

4.2.深度可分离卷积

对N通道分别进行卷积后,再对这个输出做一个pointwise核(11N)卷积,这样也减少了计算量。

11的卷积核可以降维、增加模型深度以及增加非线性。
N
N的卷积核可以

三、CNN的输入输出尺寸计算公式

3.1.卷积层

N=(W-F+2P)/S + 1
其中
N:输出大小
W:输入大小
F:卷积核大小
P:填充值的大小
S:步长大小

如当W=256,F=3,P=1,S=2时,N=(256-3+2*1)/2+1=128

3.2.池化层

N=(W+2P-D(F-1)-1)/S + 1
其中
N:输出大小
W:输入大小
D:空洞
F:池化核大小
P:填充值的大小
S:步长大小
*
如当W=128,D=0, F=2,P=0,S=2时,N=(128+0-0-1)/2+1=64
当分子为奇数时,无论分母是1还是2,分子在最后算的时候都会取为偶数

四、CNN常用的激活函数

4.1.Sigmoid

计算公式:
在这里插入图片描述
函数图像:
在这里插入图片描述
导数图像:
在这里插入图片描述

4.2.tanh

计算公式:在这里插入图片描述
函数图像:
在这里插入图片描述

导数图像:
在这里插入图片描述

4.3.Relu

计算公式:
在这里插入图片描述
函数图像:
在这里插入图片描述
导数图像:
在这里插入图片描述

此外,还有LeakRelu、ERelu、Silu等。

五、标准化和归一化

参考此处

1.标准化

将数据变换为均值为0,标准差为1的分布

1.1.批标准化(Batch Normalization)

每个激活函数都有自己的非饱和区,在激活函数前如果没有BN的话,在非饱和区外的数据都会导致梯度消失,只有非饱和区的数据可用,也加快收敛,防止了过拟合,所以一般会在激活函数前加入BN。

2.归一化

将数据变换到某个区间范围,如[0,1]
在这里插入图片描述
总结:归一化是根据极小极大值缩放范围的,从这个定义出发,看自己的数据是否需要这样处理
标准化相比更常见,如在梯度计算时能加快收敛速度,处理不同尺度的特征等

六、保存和加载模型

1.仅保存学习到的参数

1.1.保存模型:torch.save(model.state_dict(), PATH)

1.2.调用模型:model.load_state_dict(torch.load(PATH));model.eval()

2.保存整个model

2.1.保存模型:torch.save(model,PATH)

2.2.调用模型:model = torch.load(PATH)

七、model.eval()和with torch.no_grad()的作用和区别

参考此处
在train模式下,dropout网络层会按照设定的参数p设置保留激活单元的概率(保留概率=p); batchnorm层会继续计算数据的mean和var等参数并更新。

在val模式下,dropout层会让所有的激活单元都通过,而batchnorm层会停止计算和更新mean和var,直接使用在训练阶段已经学出的mean和var值

model.eval()中的数据不会进行反向传播,但是仍然需要计算梯度。
with torch.no_grad()中的数据不需要计算梯度,也不会进行反向传播。

可以看到测试要用model.eval()模式,加上with torch.no_grad()能更节省计算资源

八、Copy

赋值:内存地址不变,相当于引用,一改都改。
copy.copy():浅复制,增加元素没影响,但改变共有的元素则原数据也改变。
copy.deepcopy():深复制,就是完全复制,包括内存地址都是新的。

九、微调

参考此处
什么情况下可以微调呢?
(1) 你要使用的数据集和预训练模型的数据集相似
(2) 自己搭建或者使用的CNN模型正确率太低。
(3)数据集相似,但数据集数量太少。
(4)计算资源太少。
根据自己的数据判断是否需要预训练

针对不同情况,也有不同的微调方式:
数据集1 - 数据量少,但数据相似度非常高 - 在这种情况下,我们所做的只是修改最后几层或最终的softmax图层的输出类别。

数据集2 - 数据量少,数据相似度低 - 在这种情况下,我们可以冻结预训练模型的初始层(比如k层),并再次训练剩余的(n-k)层。由于新数据集的相似度较低,因此根据新数据集对较高层进行重新训练具有重要意义。

数据集3 - 数据量大,数据相似度低 - 在这种情况下,由于我们有一个大的数据集,我们的神经网络训练将会很有效。但是,由于我们的数据与用于训练我们的预训练模型的数据相比有很大不同。使用预训练模型进行的预测不会有效。因此,最好根据你的数据从头开始训练神经网络(Training from scatch)

数据集4 - 数据量大,数据相似度高 - 这是理想情况。在这种情况下,预训练模型应该是最有效的。使用模型的最好方法是保留模型的体系结构和模型的初始权重。然后,我们可以使用在预先训练的模型中的权重来重新训练该模型。

1.冻结

参考此处
冻结就是让某些层不反向传播:

for layer in list(model.parameters())[:]:#这里就写你要要冻结的层
	layer.requires_grad = False #这里不计算梯度
optimizer = optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=0.0001)#过滤掉不需要反向传播的层

解冻:

for layer in list(model.parameters())[:]:
    layer.requires_grad = True
	optimizer.add_param_group({
    'params': layer})

2.修改层

查看model的结构后,得到的是
model(
    (feature):Sequential(
        (0):Conv(
        (conv):Conv2d(3,24,kernel_size=(3,3),stride=(2,2),padding=(1,1),bias=False)
        …
        )
        …
        …
    (fc):Sequantial(
        (0):Dropout(p=0.3,inplace=True)
        (1):Linear(in_features=1792,out_features=1000,bias=True)
        )
    )

比如你要修改fc层,类别从1000改为10:

model.fc = nn.Linear(1792,10)

那么输出的fc层就是
(fc):Sequantial(
    (0):Dropout(p=0.3,inplace=True)
    (1):Linear(in_features=1792,out_features=1000,bias=True)

十、评价指标

参考此处
TP: 预测为1(Positive),实际也为1(Truth-预测对了)
TN: 预测为0(Negative),实际也为0(Truth-预测对了)
FP: 预测为1(Positive),实际为0(False-预测错了)
FN: 预测为0(Negative),实际为1(False-预测错了)
总样本数为:TP+TN+FP+FN

一般直接看到的是准确率Accuracy=(TP+TN)/(TP+TN+FP+FN)

查准率Precision = TP/(TP+FP)

查全率Recall = TP/(TP+FN)

F1 = 2*(PrecisionRecall)/(Precision+Recall)=2TP/(2*TP+FP+FN)
AR = TP/(TP+FP)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37249793/article/details/122244198

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签