营销型单页网站,网站开发涉及到缓存吗,中国哪里建设最多,上海发布公众号下载安装目录
1 卷积层
2 BN层
3 激活层
3.1 ReLU#xff08;Rectified Linear Unit#xff09;
3.2 sigmoid
3.3 tanh#xff08;双曲正切#xff09;
3.4 Softmax
4 池化层
5 全连接层
6 模型例子 1 卷积层 卷积是使用一个卷积核#xff08;滤波器#xff09;对矩阵进…目录
1 卷积层
2 BN层
3 激活层
3.1 ReLURectified Linear Unit
3.2 sigmoid
3.3 tanh双曲正切
3.4 Softmax
4 池化层
5 全连接层
6 模型例子 1 卷积层 卷积是使用一个卷积核滤波器对矩阵进行内积相乘后求和的操作通过该操作可以获得输入矩阵图片的重要信息在此基础上更深层次的卷积操作会获得更重要的特征信息。
一个 padding 1, stride 2kernel size 3 的单通道卷积过程示意图如下 torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue, padding_modezeros)参数
in_channels (int): 输入通道数即输入图像的深度。例如对于 RGB 图像这个值通常为 3。out_channels (int): 输出通道数即卷积核的数量。每个卷积核会提取一个特征图。kernel_size (int 或 tuple): 卷积核的大小。如果是正方形可以只用一个整数表示例如 3 表示 3x3 的卷积核。stride (int 或 tuple, 可选): 卷积操作的步长默认为 1。padding (int 或 tuple, 可选): 输入的每一边要填充的像素数量默认为 0。dilation (空洞卷积int 或 tuple, 可选): 卷积核元素之间的间距默认为 1。groups (分组卷积int, 可选): 控制输入和输出之间的连接方式默认为 1。groups 值大于 1 时相当于对输入进行组卷积。bias (bool, 可选): 如果 True添加一个学习偏置默认为 True。padding_mode (str, 可选): 填充模式可以是 zeros默认零填充、reflect反射填充矩阵边缘为对称轴、replicate复制矩阵边缘的值 或 circular。
卷积操作输出图片大小的计算公式 多通道输入
输入图片是多通道的则卷积核对应也是多通道多维的之后对卷积结果进行求和得到一个二维矩阵 参考文档
卷积操作原理解析与nn.Conv2d用法详解https://blog.csdn.net/sazass/article/details/116790155
PyTorch Conv2d中的四种填充模式解析https://www.jianshu.com/p/a6da4ad8e8e7
2 BN层
BN层的作用
加快网络的训练和收敛的速度控制梯度爆炸防止梯度消失防止过拟合存在争议
注BN层一般接在线性层和卷积层后面
torch.nn.BatchNorm2d(num_features, eps1e-05, momentum0.1, affineTrue, track_running_statsTrue)
num_features: 整数表示输入特征的数量即输入通道数。例如对于一个三通道的RGB图像num_features 应该设置为3。对于卷积层的输出这个值通常是卷积核的数量。eps: 浮点数一个非常小的值用于数值稳定性。默认值为1e-5。在计算方差时会加上这个值以避免除以零的情况。momentum: 浮点数动量因子用于更新运行均值和方差。默认值为0.1。动量可以帮助稳定均值和方差的估计特别是在小批量数据的情况下。affine: 布尔值是否使用可学习的仿射变换参数。如果设置为 True默认值则会学习缩放和平移参数。如果设置为 False则不使用这些参数仅进行标准化处理。
参考文档
神经网络中BN层的原理与作用https://blog.csdn.net/weixin_42080490/article/details/108849715
BN(Batch Normalization)层原理与作用https://blog.csdn.net/chaipp0607/article/details/112853861
3 激活层 为什么要用激活函数激活函数给神经元引入了非线性因素使得神经网络可以任意逼近任何非线性函数这样神经网络就可以应用到众多的非线性模型中。 下图是使用sigmoid激活函数去逼近一个非线性函数 下图中不同的参数c、b、w构成的sigmoid函数这里就这样表述吧也不同 如下图所示不同的sigmoid函数蓝色显示可以构成一个新的sigmoid函数红色显示 下图x是输入y是输出函数是我们训练的模型其它的是训练得到的参数 3.1 ReLURectified Linear Unit 公式:优点: 计算简单梯度下降时计算效率高。在正域内不会产生梯度消失问题。缺点: 负域内的梯度为0可能导致“神经元死亡”现象。不是以0为中心的输出。
3.2 sigmoid 公式: 优点: 求导容易输出范围在0到1之间可以作为概率解释。缺点: 容易产生梯度消失问题。计算复杂度较高。
3.3 tanh双曲正切 公式: 优点: 输出范围在-1到1之间适合作为初始化权重。缺点: 同样容易产生梯度消失问题。计算复杂度比sigmoid高。
3.4 Softmax 公式
优点 概率解释性Softmax函数将输入向量转换为一个概率分布其中每个元素的值都在0到1之间且所有元素的总和为1。这种特性使得Softmax函数在多分类问题中特别有用因为可以直接将输出解释为属于各个类别的概率。非负性Softmax函数的输出值介于0和1之间确保了概率的非负性。缺点 易造成梯度消失当输入值非常大或非常小时Softmax函数的梯度可能会变得非常小导致梯度消失问题。这会影响神经网络的训练效果使得网络难以学习到有效的特征。幂运算复杂Softmax函数涉及指数运算这会增加训练时间。输出非零均值Softmax函数的输出是非零均值的这可能会导致后续层的神经元接收到的输入也是非零均值的从而影响神经网络的收敛速度。
参考文档
激活函数 - 维基百科自由的百科全书https://zh.wikipedia.org/wiki/%E6%BF%80%E6%B4%BB%E5%87%BD%E6%95%B0盘点当前最流行的激活函数及选择经验http://giantpandacv.com/academic/%E7%AE%97%E6%B3%95%E7%A7%91%E6%99%AE/%E7%BB%BC%E8%BF%B0%E7%B1%BB/%E7%9B%98%E7%82%B9%E5%BD%93%E5%89%8D%E6%9C%80%E6%B5%81%E8%A1%8C%E7%9A%84%E6%BF%80%E6%B4%BB%E5%87%BD%E6%95%B0%E5%8F%8A%E9%80%89%E6%8B%A9%E7%BB%8F%E9%AA%8C/
4 池化层 人类用眼睛识别物体时不是把眼睛所看到的所有信息全部传递入大脑进行处理而是有重点的选择部分信息进行处理。池化操作也是类似。池化可以缩减模型的大小减少冗余的信息提高神经网络运算效率并防止过拟合常用的池化有最大池化、平均池化。 池化层的具体操作与卷积层类似都是利用一个窗口在图像上滑动它的参数包括 filter size (n) stride (s) 和跳跃步长 (s)。一般情况下设置 ns即每 n×n 个像素提取一个像素这样图像尺寸为原先的 1/n。
最大池化选择某个矩阵中的最大值平均池化取矩阵中所有值的平均值 参考文档
卷积神经网络中的池化(Pooling)层https://0809zheng.github.io/2021/07/02/pool.html
5 全连接层 全连接层fully connected layersFC是神经网络的一种基本层类型通常位于网络的最后几层用于分类任务的输出层。在全连接层中输入向量通过一个权重矩阵进行线性变换然后加上一个偏置项最后通过激活函数如ReLU、Sigmoid、Tanh等进行非线性变换。通常会将全连接层的维度设为类别数量或通过Softmax函数输出每个类别的概率分布有时全连接层不需要加入激活函数如使用CrossEntropyLoss损失函数计算损失时会用到Softmax激活函数从而实现对输入数据的分类。另一种说法是全连接可以是卷积核大小为输入特征大小的卷积运算卷积的结果为一个节点对应全连接层的一个点。如输入特征是3x3x5那么需要一个3x3x5的卷积核进行运算得到一个数值对应全连接的一个神经元。 我们现在的任务是区别下面的这张图片是不是猫 假设猫有以下几个特征 红色的神经元表示这些被找到了激活了然后通过全连接将这些特征拼接起来即卷积获取的是局部特征全连接就是把这些局部特征连接起来。 参考文档
CNN 入门讲解什么是全连接层Fully Connected Layer?https://zhuanlan.zhihu.com/p/33841176
6 模型例子
import torch.nnclass Net(torch.nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 torch.nn.Sequential(# 5x5卷积核torch.nn.Conv2d(1, 10, kernel_size5),# 激活函数torch.nn.ReLU(),# 最大池化torch.nn.MaxPool2d(kernel_size2),)self.conv2 torch.nn.Sequential(torch.nn.Conv2d(10, 20, kernel_size5),torch.nn.ReLU(),torch.nn.MaxPool2d(kernel_size2),)self.fc torch.nn.Sequential(#输入320输出50的线性层torch.nn.Linear(320, 50),torch.nn.Linear(50, 10)# 未加入激活函数计算损失时CrossEntropyLoss损失函数会用到Softmax激活函数)def forward(self, x):batch_size x.size(0)x self.conv1(x) # 一层卷积层,一层池化层,一层激活层(图是先卷积后激活再池化差别不大)x self.conv2(x) # 再来一次x x.view(batch_size, -1) # flatten 变成全连接网络需要的输入 (batch, 20,4,4) (batch,320), -1 此处自动算出的是320x self.fc(x)return x # 最后输出的是维度为10的也就是对应数学符号的0~9比如输入一个手写数字“5”的图像它的维度为batch,1,28,28即单通道高宽分别为28像素。
首先通过一个卷积核为5×5的卷积层其通道数从1变为10高宽分别为24像素然后通过一个卷积核为2×2的最大池化层通道数不变高宽变为一半即维度变成batch,10,12,12然后再通过一个卷积核为5×5的卷积层其通道数从10变为20高宽分别为8像素再通过一个卷积核为2×2的最大池化层通道数不变高宽变为一半即维度变成batch,20,4,4之后将其view展平使其维度变为320(20*4*4)之后进入全连接层用线性函数将其输出为10类即“0-9”10个数字。
参考文档
用PyTorch实现MNIST手写数字识别最新非常详细https://blog.csdn.net/qq_45588019/article/details/120935828