如何做网站监控,wordpress修改文章点赞数,厦门市城市建设档案馆的网站,wordpress php5.3.5深度学习基础——卷积神经网络的基础模块
卷积神经网络#xff08;Convolutional Neural Networks#xff0c;CNN#xff09;是深度学习中一种非常重要的神经网络结构#xff0c;它在图像识别、图像分类、目标检测等领域取得了巨大成功。本文将介绍卷积神经网络的几个基础…深度学习基础——卷积神经网络的基础模块
卷积神经网络Convolutional Neural NetworksCNN是深度学习中一种非常重要的神经网络结构它在图像识别、图像分类、目标检测等领域取得了巨大成功。本文将介绍卷积神经网络的几个基础模块包括批归一化、全局平均池化、瓶颈结构和沙漏结构。我们将首先对这些基础模块进行概述然后介绍其概念及公式并通过Python实现示例代码进行可视化展示。
1. 概述
1.1 批归一化Batch Normalization
批归一化是一种用于神经网络中的技术旨在减少训练过程中的内部协变量偏移并且可以作为一个正则化项来降低网络的过拟合程度。通过对每个小批量输入进行归一化使得网络的输入更加稳定加快收敛速度同时提高网络的泛化能力。
1.2 全局平均池化Global Average Pooling
全局平均池化是一种用于卷积神经网络中的池化操作与传统的最大池化或平均池化不同全局平均池化将输入特征图的每个通道进行平均得到一个数值作为该通道的输出从而降低了特征图的维度减少了参数数量。
1.3 瓶颈结构Bottleneck Structure
瓶颈结构是一种用于深度残差网络Residual NetworksResNet中的设计通过采用三层卷积的结构先减少维度再增加维度有效地降低了网络的计算量和参数数量提高了网络的性能和效率。
1.4 沙漏结构Hourglass Structure
沙漏结构是一种用于人体姿态估计等任务中的网络结构采用了递归的编码-解码结构旨在提高网络的特征提取能力和重建精度同时减少了网络的参数数量和计算量。
2. 概念及公式介绍
2.1 批归一化
批归一化的计算公式如下 BN ( x ) x − μ σ 2 ϵ ∗ γ β \text{BN}(x) \frac{x - \mu}{\sqrt{\sigma^2 \epsilon}} * \gamma \beta BN(x)σ2ϵ x−μ∗γβ
其中 x x x 是输入特征 μ \mu μ是输入特征的均值 σ \sigma σ 是输入特征的标准差 γ \gamma γ和 β \beta β是可学习的参数 ϵ \epsilon ϵ 是一个很小的数用于防止分母为零。
2.2 全局平均池化
全局平均池化的计算公式如下 GAP ( x ) 1 H × W ∑ i 1 H ∑ j 1 W x i , j \text{GAP}(x) \frac{1}{H \times W} \sum_{i1}^{H} \sum_{j1}^{W} x_{i,j} GAP(x)H×W1i1∑Hj1∑Wxi,j
其中 H H H 和 W W W分别是输入特征图的高度和宽度。
2.3 瓶颈结构
瓶颈结构的计算公式如下 y F 3 ( F 2 ( F 1 ( x ) ) ) y F_3(F_2(F_1(x))) yF3(F2(F1(x)))
其中 F 1 F_1 F1、 F 2 F_2 F2和 F 3 F_3 F3 分别表示三个卷积层(x) 是输入特征。
2.4 沙漏结构
沙漏结构的计算公式如下 y F 2 ( F 1 ( x ) ) x y F_2(F_1(x)) x yF2(F1(x))x
其中 (F_1) 和 (F_2) 分别表示编码和解码部分的卷积层(x) 是输入特征。
3
. 用Python实现示例代码(结果可视化)
import torch
import torch.nn as nn
import torch.nn.functional as Fclass BasicBlock(nn.Module):expansion 1def __init__(self, in_planes, planes, stride1):super(BasicBlock, self).__init__()self.conv1 nn.Conv2d(in_planes, planes, kernel_size3, stridestride, padding1, biasFalse)self.bn1 nn.BatchNorm2d(planes)self.conv2 nn.Conv2d(planes, planes, kernel_size3, stride1, padding1, biasFalse)self.bn2 nn.BatchNorm2d(planes)self.shortcut nn.Sequential()if stride ! 1 or in_planes ! self.expansion*planes:self.shortcut nn.Sequential(nn.Conv2d(in_planes, self.expansion*planes, kernel_size1, stridestride, biasFalse),nn.BatchNorm2d(self.expansion*planes))def forward(self, x):out F.relu(self.bn1(self.conv1(x)))out self.bn2(self.conv2(out))out self.shortcut(x)out F.relu(out)return outclass Bottleneck(nn.Module):expansion 4def __init__(self, in_planes, planes, stride1):super(Bottleneck, self).__init__()self.conv1 nn.Conv2d(in_planes, planes, kernel_size1, biasFalse)self.bn1 nn.BatchNorm2d(planes)self.conv2 nn.Conv2d(planes, planes, kernel_size3, stridestride, padding1, biasFalse)self.bn2 nn.BatchNorm2d(planes)self.conv3 nn.Conv2d(planes, self.expansion*planes, kernel_size1, biasFalse)self.bn3 nn.BatchNorm2d(self.expansion*planes)self.shortcut nn.Sequential()if stride ! 1 or in_planes ! self.expansion*planes:self.shortcut nn.Sequential(nn.Conv2d(in_planes, self.expansion*planes, kernel_size1, stridestride, biasFalse),nn.BatchNorm2d(self.expansion*planes))def forward(self, x):out F.relu(self.bn1(self.conv1(x)))out F.relu(self.bn2(self.conv2(out)))out self.bn3(self.conv3(out))out self.shortcut(x)out F.relu(out)return outclass GlobalAveragePooling(nn.Module):def __init__(self):super(GlobalAveragePooling, self).__init__()def forward(self, x):return F.avg_pool2d(x, x.size()[2:]).view(x.size(0), -1)class ResNet(nn.Module):def __init__(self, block, num_blocks, num_classes10):super(ResNet, self).__init__()self.in_planes 64self.conv1 nn.Conv2d(3, 64, kernel_size3, stride1, padding1, biasFalse)self.bn1 nn.BatchNorm2d(64)self.layer1 self._make_layer(block, 64, num_blocks[0], stride1)self.layer2 self._make_layer(block, 128, num_blocks[1], stride2)self.layer3 self._make_layer(block, 256, num_blocks[2], stride2)self.layer4 self._make_layer(block, 512, num_blocks[3], stride2)self.linear nn.Linear(512*block.expansion, num_classes)def _make_layer(self, block, planes, num_blocks, stride):strides [stride] [1]*(num_blocks-1)layers []for stride in strides:layers.append(block(self.in_planes, planes, stride))self.in_planes planes * block.expansionreturn nn.Sequential(*layers)def forward(self, x):out F.relu(self.bn1(self.conv1(x)))out self.layer1(out)out self.layer2(out)out self.layer3(out)out self.layer4(out)out F.avg_pool2d(out, 4)out out.view(out.size(0), -1)out self.linear(out)return outdef ResNet18():return ResNet(BasicBlock, [2,2,2,2])def ResNet50():return ResNet(Bottleneck, [3,4,6,3])# 计算网络参数量
def count_parameters(model):return sum(p.numel() for p in model.parameters() if p.requires_grad)def main():# 创建ResNet模型model ResNet18()print(ResNet18:)print(model)# 计算参数量parameters count_parameters(model)print(Parameters:, parameters)# 计算FLOPsdevice torch.device(cuda if torch.cuda.is_available() else cpu)model model.to(device)inputs torch.randn(1, 3, 32, 32).to(device)flops torch.profiler.profile(model, inputs(inputs,), use_cudatorch.cuda.is_available())print(FLOPs:, flops)if __name__ __main__:main()4. 总结
本文介绍了卷积神经网络的几个基础模块包括批归一化、全局平均池化、瓶颈结构和沙漏结构并通过Python实现了示例代码进行了可视化展示。这些基础模块在深度学习中起着重要的作用能够提高网络的性能和效率为各种计算机视觉任务提供了有力的支持。