【机器学习】卷积神经网络----GoogLeNet网络(pytorch)

news2025/1/11 7:15:14

代码是一个使用PyTorch实现的GoogLeNet模型,该模型是一个深度卷积神经网络(CNN)用于图像分类任务

1. 定义基本卷积模块

  • BasicConv2d 类是一个基本的卷积块,包含一个卷积层、批归一化层和ReLU激活函数。

  • 该类用于构建Inception模块中的各分支。

22af0b1e56af8465a638cd56f5b08adc.png

# 导入torch库,torch是一个基于Python的科学计算框架,主要用于深度学习
import torch
# 导入torch.nn库,torch.nn是一个神经网络模块,提供了各种层和激活函数等
import torch.nn as nn
# 导入torchinfo库,torchinfo是一个用于打印模型结构和参数信息的库
from torchinfo import summary


# 定义一个基本的卷积层类,继承自nn.Module
class BasicConv2d(nn.Module):
    # 定义初始化方法,接收输入通道数,输出通道数,以及其他可变参数
    def __init__(self, inplanes, out_channels, **kwargs):
        # 调用父类的初始化方法
        super(BasicConv2d, self).__init__()


        # 定义一个卷积模块,包含三个子层:卷积层,批归一化层,和ReLU激活层
        self.conv = nn.Sequential(
            # 定义一个卷积层,接收输入通道数,输出通道数,以及其他可变参数,不使用偏置项
            nn.Conv2d(inplanes, out_channels, bias=False, **kwargs),
            # 定义一个批归一化层,接收输出通道数
            nn.BatchNorm2d(out_channels),
            # 定义一个ReLU激活层,使用原地操作
            nn.ReLU(inplace=True)
        )


    # 定义前向传播方法,接收输入张量x
    def forward(self, x):
        # 将x通过卷积模块,得到输出张量
        x = self.conv(x)
        # 返回输出张量
        return x

2. 定义Inception层

  • Inception 类定义了Inception模块,包含四个分支:1x1卷积、1x1卷积后接3x3卷积、1x1卷积后接5x5卷积、最大池化后接1x1卷积。

  • 每个分支使用 BasicConv2d 构建。

  • 模块的输出是四个分支的拼接。

5b210e6e5522179a0f017d467c06333b.png

# 定义一个Inception模块类,继承自nn.Module
class Inception(nn.Module):
    # 定义初始化方法,接收输入通道数,以及各个分支的输出通道数
    def __init__(self, inplanes, ch1x1, ch3x3reduce, ch3x3, ch5x5reduce, ch5x5, pool_proj):
        # 调用父类的初始化方法
        super(Inception, self).__init__()


        # 定义第一个分支,使用一个1x1的卷积层
        self.branch1 = BasicConv2d(inplanes, ch1x1, kernel_size=1)
        # 定义第二个分支,使用一个1x1的卷积层,后接一个3x3的卷积层,使用1的填充
        self.branch2 = nn.Sequential(
            BasicConv2d(inplanes, ch3x3reduce, kernel_size=1),
            BasicConv2d(ch3x3reduce, ch3x3, kernel_size=3, padding=1)
        )
        # 定义第三个分支,使用一个1x1的卷积层,后接一个5x5的卷积层,使用2的填充
        self.branch3 = nn.Sequential(
            BasicConv2d(inplanes, ch5x5reduce, kernel_size=1),
            BasicConv2d(ch5x5reduce, ch5x5, kernel_size=5, padding=2)
        )
        # 定义第四个分支,使用一个3x3的最大池化层,后接一个1x1的卷积层,使用1的填充
        self.branch4 = nn.Sequential(
            nn.MaxPool2d(kernel_size=3, stride=1, padding=1),
            BasicConv2d(inplanes, pool_proj, kernel_size=1)
        )


    # 定义前向传播方法,接收输入张量x
    def forward(self, x):
        # 将x分别通过四个分支,得到四个输出张量
        branchh1 = self.branch1(x)
        branchh2 = self.branch2(x)
        branchh3 = self.branch3(x)
        branchh4 = self.branch4(x)


        # 将四个输出张量放入一个列表中
        output = [branchh1, branchh2, branchh3, branchh4]


        # 沿着通道维度,将列表中的张量拼接起来,得到最终的输出张量
        return torch.cat(output, 1)

3. 定义一个辅助分类器类

  • AuxClf 类定义了辅助分类器,用于提供额外的梯度信息。

  • 包含特征提取部分和分类器部分。

  • 特征提取部分包含平均池化和1x1卷积。

  • 分类器部分包含两个全连接层。

7ae50e58ff3922068dba5587b02151a9.png

# 定义一个辅助分类器类,继承自nn.Module
class AuxClf(nn.Module):
    # 定义初始化方法,接收输入通道数,分类数,以及其他可变参数
    def __init__(self, inplanes, num_classes, **kwargs):
        # 调用父类的初始化方法
        super(AuxClf, self).__init__()


        # 定义一个特征提取模块,包含两个子层:平均池化层,和卷积层
        self.feature_ = nn.Sequential(
            # 定义一个平均池化层,使用5x5的核,3的步长
            nn.AvgPool2d(kernel_size=5, stride=3),
            # 定义一个卷积层,使用1x1的核,输出通道数为128
            BasicConv2d(inplanes, 128, kernel_size=1)
        )
        # 定义一个分类模块,包含四个子层:线性层,ReLU激活层,Dropout层,和线性层
        self.clf_ = nn.Sequential(
            # 定义一个线性层,输入维度为4*4*128,输出维度为1024
            nn.Linear(4*4*128, 1024),
            # 定义一个ReLU激活层,使用原地操作
            nn.ReLU(inplace=True),
            # 定义一个Dropout层,使用0.7的丢弃率
            nn.Dropout(0.7),
            # 定义一个线性层,输入维度为1024,输出维度为分类数
            nn.Linear(1024, num_classes)
        )


    # 定义前向传播方法,接收输入张量x
    def forward(self, x):
        # 将x通过特征提取模块,得到输出张量
        x = self.feature_(x)
        # 将输出张量展平为一维向量,维度为4*4*128
        x = x.view(-1, 4*4*128) 
        # 将展平后的向量通过分类模块,得到输出向量
        x = self.clf_(x)


        # 返回输出向量
        return x

4. 定义一个GoogLeNet类

  • GoogLeNet 类是整个GoogLeNet模型的定义。

  • 包含多个阶段,每个阶段包含不同的卷积和Inception模块。

  • 有全局平均池化、Dropout和全连接层组成的分类器。

  • 有两个辅助分类器 (AuxClf) 提供额外的梯度信息。

  • forward 方法中定义了模型的前向传播过程。

242502e2dc5b90f55facb357d453081b.png

# 定义一个GoogLeNet类,继承自nn.Module
class GoogLeNet(nn.Module):
    # 定义初始化方法,接受一个参数num_classes,表示分类的类别数,默认为1000
    def __init__(self, num_classes: int = 1000):
        # 调用父类的初始化方法
        super(GoogLeNet, self).__init__()
        # 定义第一个卷积层,输入通道为3,输出通道为64,卷积核大小为7,步长为2,边缘填充为3
        self.conv1 = BasicConv2d(3, 64, kernel_size=7, stride=2, padding=3)  # 输出112x112x64
        # 定义第一个最大池化层,池化核大小为3,步长为2,使用向上取整的方式处理边缘
        self.maxpool1 = nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True)  # (112 - 3) / 2 + 1 = 55.5,向上取整,输出56x56x64
        # 定义第二个卷积层,输入通道为64,输出通道为64,卷积核大小为1,步长为1
        self.conv2 = BasicConv2d(64, 64, kernel_size=1, stride=1)
        # 定义第三个卷积层,输入通道为64,输出通道为192,卷积核大小为3,步长为1,边缘填充为1
        self.conv3 = BasicConv2d(64, 192, kernel_size=3, stride=1, padding=1)  # 输出56x56x192
        # 定义第二个最大池化层,池化核大小为3,步长为2,使用向上取整的方式处理边缘
        self.maxpool2 = nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True)  # 输出28x28x192
        # 定义第一个Inception模块,输入通道为192,输出通道为64,96,128,16,32,32
        self.inception3a = Inception(192,64,96, 128, 16, 32, 32)  # 输出28x28x256
        # 定义第二个Inception模块,输入通道为256,输出通道为128,128,192,32,96,64
        self.inception3b = Inception(256, 128, 128, 192, 32, 96, 64)  # 输出28x28x480
        # 定义第三个最大池化层,池化核大小为3,步长为2,使用向上取整的方式处理边缘
        self.maxpool3 = nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True)  # 输出14x14x480
        # 定义第三个Inception模块,输入通道为480,输出通道为192,96,208,16,48,64
        self.inception4a = Inception(480, 192, 96, 208, 16, 48, 64)  # 输出14x14x512
        # 定义第四个Inception模块,输入通道为512,输出通道为160,112,224,24,64,64
        self.inception4b = Inception(512, 160, 112, 224, 24, 64, 64)  # 输出14x14x512
        # 定义第五个Inception模块,输入通道为512,输出通道为128,128,256,24,64,64
        self.inception4c = Inception(512, 128, 128, 256, 24, 64, 64)  # 输出14x14x512
        # 定义第六个Inception模块,输入通道为512,输出通道为112,144,288,32,64,64
        self.inception4d = Inception(512, 112, 144, 288, 32, 64, 64)  # 输出14x14x528
        # 定义第七个Inception模块,输入通道为528,输出通道为256,160,320,32,128,128
        self.inception4e = Inception(528, 256, 160, 320, 32, 128, 128)  # 输出14x14x832
        # 定义第四个最大池化层,池化核大小为3,步长为2,使用向上取整的方式处理边缘
        self.maxpool4 = nn.MaxPool2d(kernel_size=3, stride=2, ceil_mode=True)  # 输出7x7x832
        # 定义第八个Inception模块,输入通道为832,输出通道为256,160,320,32,128,128
        self.inception5a = Inception(832, 256, 160, 320, 32, 128, 128)  # 输出7x7x832
        # 定义第九个Inception模块,输入通道为832,输出通道为384,192,384,48,128,128
        self.inception5b = Inception(832, 384, 192, 384, 48, 128, 128)  # 输出7x7x1024
        # 定义自适应平均池化层,输出大小为1x1
        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))  # 输出1x1x1024
        # 定义一个0.4的随机失活层
        self.dropout = nn.Dropout(0.4)
        # 定义一个全连接层,输入维度为1024,输出维度为num_classes
        self.fc = nn.Linear(1024, num_classes)
        # 定义第一个辅助分类器,输入通道为512,输出通道为num_classes
        self.aux1 = AuxClf(512, num_classes)
        # 定义第二个辅助分类器,输入通道为528,输出通道为num_classes
        self.aux2 = AuxClf(528, num_classes)
    
    # 定义前向传播方法,接受一个参数x,表示输入的数据
    def forward(self, x):  # 前向传播函数
        x = self.maxpool1(self.conv1(x))  # 第一层卷积和池化


        x = self.maxpool2(self.conv3(self.conv2(x)))  # 第二层和第三层卷积,然后池化


        x = self.maxpool3(self.inception3b(self.inception3a(x)))  # 两个Inception模块,然后池化


        x = self.inception4a(x)  # 第三个Inception模块
        aux1 = self.aux1(x)  # 第一个辅助分类器的输出
        x = self.inception4b(x)  # 第四个Inception模块
        x = self.inception4c(x)  # 第五个Inception模块
        x = self.inception4d(x)  # 第六个Inception模块
        aux2 = self.aux2(x)  # 第二个辅助分类器的输出
        x = self.maxpool4(self.inception4e(x))  # 第七个Inception模块,然后池化


        x = self.inception5b(self.inception5a(x))  # 最后两个Inception模块


        x = self.avgpool(x)  # 平均池化
        x = torch.flatten(x, 1)  # 展平
        x = self.dropout(x)  # Dropout
        x = self.fc(x)  # 全连接层


        return x, aux1, aux2  # 返回主分类器和两个辅助分类器的输出

5. 主函数

  • 主函数创建了一个模拟输入数据,并实例化了 GoogLeNet 模型。

  • 调用模型进行前向传播,并输出主分类器以及两个辅助分类器的输出形状。

  • 使用 torchinfo.summary 打印模型的详细信息。

# 如果是主程序
if __name__ == '__main__':
    # 创建一个全1的张量,形状为20x3x224x224,表示有20个样本,每个样本有3个通道,高和宽都是224
    data = torch.ones(20, 3, 224, 224)
    # 创建一个GoogLeNet实例
    net = GoogLeNet()
    # 将数据输入到模型中,得到模型的输出和两个辅助分类器的输出
    x, aux1, aux2 = net(data)
    # 遍历三个输出,打印它们的形状
    for i in [x, aux1, aux2]:
        print(i.shape)
    # 使用torchinfo库的summary函数,打印模型的参数统计,输入形状为20x3x224x224,设备为cpu
    summary(net, (20, 3, 224, 224), device='cpu')

总体而言,该代码实现了一个完整的GoogLeNet模型,用于图像分类任务,并包括了辅助分类器以提高训练效果。

输出结果:模型的输出和两个辅助分类器的输出、模型的参数统计

torch.Size([20, 1000])
torch.Size([20, 1000])
torch.Size([20, 1000])
===============================================================================================
Layer (type:depth-idx)                        Output Shape              Param #
===============================================================================================
GoogLeNet                                     [20, 1000]                --
├─BasicConv2d: 1-1                            [20, 64, 112, 112]        --
│    └─Sequential: 2-1                        [20, 64, 112, 112]        --
│    │    └─Conv2d: 3-1                       [20, 64, 112, 112]        9,408
│    │    └─BatchNorm2d: 3-2                  [20, 64, 112, 112]        128
│    │    └─ReLU: 3-3                         [20, 64, 112, 112]        --
├─MaxPool2d: 1-2                              [20, 64, 56, 56]          --
├─BasicConv2d: 1-3                            [20, 64, 56, 56]          --
│    └─Sequential: 2-2                        [20, 64, 56, 56]          --
│    │    └─Conv2d: 3-4                       [20, 64, 56, 56]          4,096
│    │    └─BatchNorm2d: 3-5                  [20, 64, 56, 56]          128
│    │    └─ReLU: 3-6                         [20, 64, 56, 56]          --
├─BasicConv2d: 1-4                            [20, 192, 56, 56]         --
│    └─Sequential: 2-3                        [20, 192, 56, 56]         --
│    │    └─Conv2d: 3-7                       [20, 192, 56, 56]         110,592
│    │    └─BatchNorm2d: 3-8                  [20, 192, 56, 56]         384
│    │    └─ReLU: 3-9                         [20, 192, 56, 56]         --
├─MaxPool2d: 1-5                              [20, 192, 28, 28]         --
├─Inception: 1-6                              [20, 256, 28, 28]         --
│    └─BasicConv2d: 2-4                       [20, 64, 28, 28]          --
│    │    └─Sequential: 3-10                  [20, 64, 28, 28]          12,416
│    └─Sequential: 2-5                        [20, 128, 28, 28]         --
│    │    └─BasicConv2d: 3-11                 [20, 96, 28, 28]          18,624
│    │    └─BasicConv2d: 3-12                 [20, 128, 28, 28]         110,848
│    └─Sequential: 2-6                        [20, 32, 28, 28]          --
│    │    └─BasicConv2d: 3-13                 [20, 16, 28, 28]          3,104
│    │    └─BasicConv2d: 3-14                 [20, 32, 28, 28]          12,864
│    └─Sequential: 2-7                        [20, 32, 28, 28]          --
│    │    └─MaxPool2d: 3-15                   [20, 192, 28, 28]         --
│    │    └─BasicConv2d: 3-16                 [20, 32, 28, 28]          6,208
├─Inception: 1-7                              [20, 480, 28, 28]         --
│    └─BasicConv2d: 2-8                       [20, 128, 28, 28]         --
│    │    └─Sequential: 3-17                  [20, 128, 28, 28]         33,024
│    └─Sequential: 2-9                        [20, 192, 28, 28]         --
│    │    └─BasicConv2d: 3-18                 [20, 128, 28, 28]         33,024
│    │    └─BasicConv2d: 3-19                 [20, 192, 28, 28]         221,568
│    └─Sequential: 2-10                       [20, 96, 28, 28]          --
│    │    └─BasicConv2d: 3-20                 [20, 32, 28, 28]          8,256
│    │    └─BasicConv2d: 3-21                 [20, 96, 28, 28]          76,992
│    └─Sequential: 2-11                       [20, 64, 28, 28]          --
│    │    └─MaxPool2d: 3-22                   [20, 256, 28, 28]         --
│    │    └─BasicConv2d: 3-23                 [20, 64, 28, 28]          16,512
├─MaxPool2d: 1-8                              [20, 480, 14, 14]         --
├─Inception: 1-9                              [20, 512, 14, 14]         --
│    └─BasicConv2d: 2-12                      [20, 192, 14, 14]         --
│    │    └─Sequential: 3-24                  [20, 192, 14, 14]         92,544
│    └─Sequential: 2-13                       [20, 208, 14, 14]         --
│    │    └─BasicConv2d: 3-25                 [20, 96, 14, 14]          46,272
│    │    └─BasicConv2d: 3-26                 [20, 208, 14, 14]         180,128
│    └─Sequential: 2-14                       [20, 48, 14, 14]          --
│    │    └─BasicConv2d: 3-27                 [20, 16, 14, 14]          7,712
│    │    └─BasicConv2d: 3-28                 [20, 48, 14, 14]          19,296
│    └─Sequential: 2-15                       [20, 64, 14, 14]          --
│    │    └─MaxPool2d: 3-29                   [20, 480, 14, 14]         --
│    │    └─BasicConv2d: 3-30                 [20, 64, 14, 14]          30,848
├─AuxClf: 1-10                                [20, 1000]                --
│    └─Sequential: 2-16                       [20, 128, 4, 4]           --
│    │    └─AvgPool2d: 3-31                   [20, 512, 4, 4]           --
│    │    └─BasicConv2d: 3-32                 [20, 128, 4, 4]           65,792
│    └─Sequential: 2-17                       [20, 1000]                --
│    │    └─Linear: 3-33                      [20, 1024]                2,098,176
│    │    └─ReLU: 3-34                        [20, 1024]                --
│    │    └─Dropout: 3-35                     [20, 1024]                --
│    │    └─Linear: 3-36                      [20, 1000]                1,025,000
├─Inception: 1-11                             [20, 512, 14, 14]         --
│    └─BasicConv2d: 2-18                      [20, 160, 14, 14]         --
│    │    └─Sequential: 3-37                  [20, 160, 14, 14]         82,240
│    └─Sequential: 2-19                       [20, 224, 14, 14]         --
│    │    └─BasicConv2d: 3-38                 [20, 112, 14, 14]         57,568
│    │    └─BasicConv2d: 3-39                 [20, 224, 14, 14]         226,240
│    └─Sequential: 2-20                       [20, 64, 14, 14]          --
│    │    └─BasicConv2d: 3-40                 [20, 24, 14, 14]          12,336
│    │    └─BasicConv2d: 3-41                 [20, 64, 14, 14]          38,528
│    └─Sequential: 2-21                       [20, 64, 14, 14]          --
│    │    └─MaxPool2d: 3-42                   [20, 512, 14, 14]         --
│    │    └─BasicConv2d: 3-43                 [20, 64, 14, 14]          32,896
├─Inception: 1-12                             [20, 512, 14, 14]         --
│    └─BasicConv2d: 2-22                      [20, 128, 14, 14]         --
│    │    └─Sequential: 3-44                  [20, 128, 14, 14]         65,792
│    └─Sequential: 2-23                       [20, 256, 14, 14]         --
│    │    └─BasicConv2d: 3-45                 [20, 128, 14, 14]         65,792
│    │    └─BasicConv2d: 3-46                 [20, 256, 14, 14]         295,424
│    └─Sequential: 2-24                       [20, 64, 14, 14]          --
│    │    └─BasicConv2d: 3-47                 [20, 24, 14, 14]          12,336
│    │    └─BasicConv2d: 3-48                 [20, 64, 14, 14]          38,528
│    └─Sequential: 2-25                       [20, 64, 14, 14]          --
│    │    └─MaxPool2d: 3-49                   [20, 512, 14, 14]         --
│    │    └─BasicConv2d: 3-50                 [20, 64, 14, 14]          32,896
├─Inception: 1-13                             [20, 528, 14, 14]         --
│    └─BasicConv2d: 2-26                      [20, 112, 14, 14]         --
│    │    └─Sequential: 3-51                  [20, 112, 14, 14]         57,568
│    └─Sequential: 2-27                       [20, 288, 14, 14]         --
│    │    └─BasicConv2d: 3-52                 [20, 144, 14, 14]         74,016
│    │    └─BasicConv2d: 3-53                 [20, 288, 14, 14]         373,824
│    └─Sequential: 2-28                       [20, 64, 14, 14]          --
│    │    └─BasicConv2d: 3-54                 [20, 32, 14, 14]          16,448
│    │    └─BasicConv2d: 3-55                 [20, 64, 14, 14]          51,328
│    └─Sequential: 2-29                       [20, 64, 14, 14]          --
│    │    └─MaxPool2d: 3-56                   [20, 512, 14, 14]         --
│    │    └─BasicConv2d: 3-57                 [20, 64, 14, 14]          32,896
├─AuxClf: 1-14                                [20, 1000]                --
│    └─Sequential: 2-30                       [20, 128, 4, 4]           --
│    │    └─AvgPool2d: 3-58                   [20, 528, 4, 4]           --
│    │    └─BasicConv2d: 3-59                 [20, 128, 4, 4]           67,840
│    └─Sequential: 2-31                       [20, 1000]                --
│    │    └─Linear: 3-60                      [20, 1024]                2,098,176
│    │    └─ReLU: 3-61                        [20, 1024]                --
│    │    └─Dropout: 3-62                     [20, 1024]                --
│    │    └─Linear: 3-63                      [20, 1000]                1,025,000
├─Inception: 1-15                             [20, 832, 14, 14]         --
│    └─BasicConv2d: 2-32                      [20, 256, 14, 14]         --
│    │    └─Sequential: 3-64                  [20, 256, 14, 14]         135,680
│    └─Sequential: 2-33                       [20, 320, 14, 14]         --
│    │    └─BasicConv2d: 3-65                 [20, 160, 14, 14]         84,800
│    │    └─BasicConv2d: 3-66                 [20, 320, 14, 14]         461,440
│    └─Sequential: 2-34                       [20, 128, 14, 14]         --
│    └─BasicConv2d: 2-36                      [20, 256, 7, 7]           --
│    │    └─Sequential: 3-71                  [20, 256, 7, 7]           213,504
│    └─Sequential: 2-37                       [20, 320, 7, 7]           --
│    │    └─BasicConv2d: 3-72                 [20, 160, 7, 7]           133,440
│    │    └─BasicConv2d: 3-73                 [20, 320, 7, 7]           461,440
│    └─Sequential: 2-38                       [20, 128, 7, 7]           --
│    │    └─BasicConv2d: 3-74                 [20, 32, 7, 7]            26,688
│    │    └─BasicConv2d: 3-75                 [20, 128, 7, 7]           102,656
│    └─Sequential: 2-39                       [20, 128, 7, 7]           --
│    │    └─MaxPool2d: 3-76                   [20, 832, 7, 7]           --
│    │    └─BasicConv2d: 3-77                 [20, 128, 7, 7]           106,752
├─Inception: 1-18                             [20, 1024, 7, 7]          --
│    └─BasicConv2d: 2-40                      [20, 384, 7, 7]           --
│    │    └─Sequential: 3-78                  [20, 384, 7, 7]           320,256
│    └─Sequential: 2-41                       [20, 384, 7, 7]           --
│    │    └─BasicConv2d: 3-79                 [20, 192, 7, 7]           160,128
│    │    └─BasicConv2d: 3-80                 [20, 384, 7, 7]           664,320
│    └─Sequential: 2-42                       [20, 128, 7, 7]           --
│    │    └─BasicConv2d: 3-81                 [20, 48, 7, 7]            40,032
│    │    └─BasicConv2d: 3-82                 [20, 128, 7, 7]           153,856
│    └─Sequential: 2-43                       [20, 128, 7, 7]           --
│    │    └─MaxPool2d: 3-83                   [20, 832, 7, 7]           --
│    │    └─BasicConv2d: 3-84                 [20, 128, 7, 7]           106,752
├─AdaptiveAvgPool2d: 1-19                     [20, 1024, 1, 1]          --
├─Dropout: 1-20                               [20, 1024]                --
├─Linear: 1-21                                [20, 1000]                1,025,000
===============================================================================================
Total params: 13,385,816
Trainable params: 13,385,816
Non-trainable params: 0
Total mult-adds (G): 31.82
===============================================================================================Input size (MB): 12.04
Forward/backward pass size (MB): 1034.49
Params size (MB): 53.54
Estimated Total Size (MB): 1100.08
===============================================================================================

c074d17bef96efe376b1710c59221d29.png

GoogLeNet 网络中LocalRespNorm 

3207ffc34c129142300b29c1a376dab1.jpeg

GoogLeNet网络中的(Batch Normalization)批量归一化

62b4a611a50c80253617f57987f6c230.jpeg

BN(批量归一化)和LRN(局部归一化)有什么区别?

490c162c361d2c656ede2722038b3c0a.jpeg

MaxPool2d类

f6cb713b469c1116a49a9503dd25c4ff.jpeg

定义class GoogLeNet(nn.Module)类时,需要知道上一层的输出大小,才能初始化下一层的参数

3651766b690f75f9678d3cf25b572f1a.jpeg

解释 summary(net, (20, 3, 224, 224), device='cpu')

e97a7f5d72b65f02f300b2b19978c6b2.jpeg

如何计算conv1输出层的特征宽高

898b7a03752c521e2289b3e2e37153e1.jpeg

如何计算池化层的输出特征图大小?

0c9fd000bfcadff6e2bf7680da292e49.jpeg

参考网址:

https://wxler.github.io/2020/11/24/223407/   深入解读GoogLeNet网络结构(附代码实现) | Layne's Blog (wxler.github.io) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1359298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

亚马逊云科技基于 listmonk 的电子邮件营销解决方案

本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 亚马逊云科技开发者社区, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道。 背景 电子邮件营销(EDM)在广告、电商、供应链物流等行业应用…

MR实战:网址去重

文章目录 一、实战概述二、提出任务三、完成任务(一)准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录 (二)实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建网址去重映射器类5、创建网址去重归并…

怎么选择一款好用的ERP企业管理软件?看这六点就够了!

在目前高度信息化的环境中,ERP系统已成为生产制造企业管理的心脏。它集财务、人力资源、采购、生产、销售和库存等多个业务功能于一身,为企业提供了一个统一的、高效的、实时的管理平台。然而,市场上的ERP软件繁多,选择一款真正适…

WPF美化ItemsControl1:不同颜色间隔

首先我们有的是一个绑定好数据的ItemsControl <ItemsControl ItemsSource"{Binding Starts}"> </ItemsControl> 运行后呢是朴素的将数据竖着排列 如果想要数据之间有间距&#xff0c;可以使用数据模板&#xff0c;将数据放到TextBlock中显示&#xff0…

【Python可视化实战】钻石数据可视化

一、项目引言 1.背景和目标 钻石作为一种珍贵的宝石&#xff0c;其价格受到多种因素的影响。为了深入了解钻石价格的决定因素&#xff0c;我们收集了大量关于钻石的数据&#xff0c;并希望通过数据可视化来揭示钻石特征与价格之间的关系。 2.内容 收集钻石的各项特征数据&a…

【NR技术】 NR多连接处理流程(Multi-Connectivity operation)

1 概述 本文描述NR多连接处理流程。 2 辅节点添加Secondary Node Addition 2.1 EN-DC en-gNB由gNB-CU和gNB-DU组成&#xff0c;下图给出了EN-DC中SgNB的添加过程。 图1 SgNB addition procedure in EN-DC MN决定请求SN为特定的E-RAB分配资源&#xff0c;表明E-RAB的特征(E…

openGauss + Datakit

openGauss Datakit 1. 简介1.1 openGauss1.2 Datakit 2. 环境准备2.1 支持系统2.2 安装包获取2.3 注意事项2.4 系统环境设置 3. openGauss 安装3.1 创建用户和组3.2 创建工作目录3.3 关闭HISTORY记录/关闭交换内存3.4 解压安装包3.5 安装3.6 启动数据库3.7 连接数据库3.8 添加…

使用Go语言的HTTP客户端库进行API调用

随着微服务架构和RESTful API的普及&#xff0c;API调用成为了日常开发中的常见任务。Go语言提供了多种工具和库来帮助开发者轻松地与API进行交互。本文将介绍如何使用Go语言的HTTP客户端库进行API调用。 在Go语言中&#xff0c;标准库中的net/http包提供了基本的HTTP客户端功…

Nginx(十五) proxy_pass和proxy_redirect指令的组合测试

Nginx反向代理配置文件参数详解请参考 Nginx(十三) 配置文件详解 - 反向代理&#xff08;超详细&#xff09; 测试1&#xff1a;proxy_redirect http://127.0.0.1:8080/three/ http://www.read*******l.cn:8688/four/; http {server {listen 8688;server_name www.read****…

汇编 8259 中断实验

汇编 8259 中断实验 一、实验目的 &#xff08;1&#xff09;掌握微机中断处理系统的基本原理。 &#xff08;2&#xff09;掌握8259中断控制器的工作原理&#xff0c;学会编写中断服务程序。 &#xff08;3&#xff09;掌握8259级联方式的使用方法。 二、实验设备 &#x…

企业级实践为“燃料”,大模型助推Kyligence产品力向上

回顾2023年&#xff0c;最火热的科技话题无疑是生成式AI。 从ChatGPT横空出世&#xff0c;到“千模大战”如火如荼&#xff0c;AIGC正式破圈&#xff0c;成为企业数字化转型的新关键词。 在红杉中国《2023企业数字化年度指南》中&#xff0c;通过调研235家企业可知&#xff0…

Eclipse先关的一些配置

启动配置设置 配置项详细说明&#xff1a; -Xms&#xff1a;初始堆内存大小&#xff0c;设定程序启动时占用内存大小&#xff0c;默认物理内存1/64 -Xms -XX:InitialHeapSiz-Xmx&#xff1a;最大堆内存&#xff0c;设定程序运行期间最大可占用的内存大小。如果程序运行需要…

软件测试|SQL中的null值,该如何理解?

深入理解SQL中的Null值&#xff1a;处理缺失数据的重要概念 简介 Null值在SQL中是用于表示缺失或未知数据的特殊值。本文将深入探讨Null值的概念、处理方法和注意事项&#xff0c;以帮助读者更好地理解和处理SQL中的缺失数据。 在SQL数据库中&#xff0c;Null值是一种特殊的…

BEV+Transformer感知架构共识下,传感器「火药味」再升级

高阶智能驾驶战火愈演愈烈&#xff0c;正带动感知方案卷入新一轮军备竞赛。 根据高工智能汽车研究院最新发布数据显示&#xff0c;2023年1-9月&#xff0c;中国市场&#xff08;不含进出口&#xff09;乘用车前装标配&#xff08;软硬件&#xff09;NOA交付新车37.73万辆&…

Linux下NUMA 内存管理初步理解

LINUX 系统在多核下,以及NUMA架构技术下 如何管理物理内存? 经过初步了解 发现系统对内存有以下工作 1 映射 2 内存碎片 3 内存回收 4 内存池 5 冷热页 6 水位线和保留内存 7 支持内存条热插拔 8 大页管理 这些功能给人感觉,尤其是DBA感觉是重新实现了数据缓存池的功…

机器学习(三) -- 特征工程(1)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 机器学习&#xff08;三&#xff09; -- 特征工程&#xff08;1-2&#xff09; 未完待续…… 目录 系列文章目录 前言 一、特征…

大数据开发的专业术语

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列专栏目录 [Java项…

画中画视频剪辑:创意与技术的完美结合,批量制作视频不再难

随着科技的飞速发展&#xff0c;视频制作已成为信息时代的一种重要表达方式。其中画中画视频剪辑技术更是以其独特的创意性和技术性&#xff0c;为观众的视觉体验带来了全新的冲击。它不仅为创作者提供了更广阔的创意空间&#xff0c;同时也降低了视频制作的门槛。现在一起来看…

VSCode Jupyter print 函数输出在错误的单元格(cell)

问题描述 最近在复现一个开源项目时&#xff0c;发现执行过该项目中的代码单元格后&#xff0c;其余单元格的print函数输出也会续在该单元格后。而正常情况下print函数输出应该位于其所属的单元格。下图中&#xff0c;我将出现问题的单元格执行后清空了输出&#xff0c;但是在…

深度解析 Compose 的 Modifier 原理 -- Modifier.composed()、ComposedModifier

众所周知&#xff1a;原理性分析的文章&#xff0c;真的很难讲的通俗易懂&#xff0c;讲的简单了就没必要写了&#xff0c;讲的繁琐难懂往往大家也不乐意看&#xff0c;所以只能尽量找个好的角度&#xff08;比如从 Demo 代码示例出发&#xff09;慢慢带着大家去钻源码&#xf…