VGG16 结构图 + pytorch代码

本文详细介绍了VGG16神经网络结构图,并提供了使用PyTorch编写的实现代码,包括conv_pool_block和conv_block模块,以及整个VGG16模型的构建过程。适合深度学习入门者理解卷积神经网络架构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VGG16 结构图 + pytorch代码

VGG16 结构图

在这里插入图片描述

需要清晰一点的可以下PDF文件:
链接: https://pan.baidu.com/s/1RaEeupUKzEQPnfy02Idp3g.
密码是:cn0t


pytorch 网络代码

import torch
import torch.nn as nn
import torch.nn.functional as F

class conv_pool_block(nn.Module):
    def __init__(self, in_channels, out_channels,conv_size=(3,3), conv_stride=(1,1), pool_size=(2,2), pool_stride=(2,2)):
        super(conv_pool_block, self).__init__()

        self.block = nn.Sequential(
            nn.Conv2d(in_channels, out_channels, kernel_size=conv_size, stride=conv_stride, padding=1),
            nn.BatchNorm2d(out_channels),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=pool_size, stride=pool_stride)
            # inplace = False 时,不会修改输入对象的值,而是返回一个新创建的对象,所以打印出对象存储地址不同,类似于C语言的值传递
            # inplace = True 时,会修改输入对象的值,所以打印出对象存储地址相同,类似于C语言的址传递
            # inplace = True ,会改变输入数据的值,节省反复申请与释放内存的空间与时间,只是将原来的地址传递,效率更好
        )

    def forward(self, x):
        x = self.block(x)
        return x


class conv_block(nn.Module):
    def __init__(self, in_channels, out_channels,conv_size=(3,3), conv_stride=(1,1)):
        super(conv_block, self).__init__()

        self.block = nn.Sequential(
            nn.Conv2d(in_channels, out_channels, kernel_size=conv_size, stride=conv_stride, padding=1),
            nn.BatchNorm2d(out_channels),
            nn.ReLU(inplace=True)
        )

    def forward(self, x):
        x = self.block(x)
        return x


class VGG16(nn.Module):
    def __init__(self, input_size, input_channels, class_num):
        super(VGG16, self).__init__()

        conv_c = [64, 128, 256, 512, 512]
        # if input_size//32 != 0:
        #     raise ValueError("图片Size不是32的倍数!")
        l_f_size = int(input_size/32)  # Last Feature Map Size

        self.layer1_conv_block = conv_block(input_channels, conv_c[0])
        self.layer1_conv_pool_block = conv_pool_block(conv_c[0], conv_c[0])

        self.layer2_conv_block = conv_block(conv_c[0], conv_c[1])
        self.layer2_conv_pool_block = conv_pool_block(conv_c[1], conv_c[1])

        self.layer3_conv_block = nn.Sequential(
            conv_block(conv_c[1], conv_c[2]),
            conv_block(conv_c[2], conv_c[2])
        )
        self.layer3_conv_pool_block = conv_pool_block(conv_c[2], conv_c[2])

        self.layer4_conv_block = nn.Sequential(
            conv_block(conv_c[2], conv_c[3]),
            conv_block(conv_c[3], conv_c[3])
        )
        self.layer4_conv_pool_block = conv_pool_block(conv_c[3], conv_c[3])

        self.layer5_conv_block = nn.Sequential(
            conv_block(conv_c[3], conv_c[4]),
            conv_block(conv_c[4], conv_c[4])
        )
        self.layer5_conv_pool_block = conv_pool_block(conv_c[4], conv_c[4])
        self.Flatten = nn.Flatten()
        self.layer6_fc = nn.Linear(512*l_f_size*l_f_size, 4096)
        self.layer7_fc = nn.Linear(4096, 4096)
        self.layer8_fc = nn.Linear(4096, class_num)

    def forward(self, x):
        in_size = x.size(0)

        x = self.layer1_conv_block(x)
        x = self.layer1_conv_pool_block(x)

        x = self.layer2_conv_block(x)
        x = self.layer2_conv_pool_block(x)

        x = self.layer3_conv_block(x)
        x = self.layer3_conv_pool_block(x)

        x = self.layer4_conv_block(x)
        x = self.layer4_conv_pool_block(x)

        x = self.layer5_conv_block(x)
        x = self.layer5_conv_pool_block(x)

        # 展平
        x = self.Flatten(x)

        x = self.layer6_fc(x)
        x = self.layer7_fc(x)
        x = self.layer8_fc(x)

        return x


if __name__ == "__main__":
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    a = VGG16(224, 3, 1000).to(device)
    from torchsummary import summary
    summary(a, input_size=(3, 224, 224)




### VGG16 模型 PyTorch 实现代码示例 为了展示如何使用 PyTorch 实现 VGG16 模型,下面提供了一个完整的代码片段。此代码不仅定义了 VGG16 的架构,还展示了如何加载预训练权重以及如何调整最后几层以适应特定的任务需求。 #### 导入必要的库 ```python import torch from torchvision import models import torch.nn as nn ``` #### 定义 VGG16 模型 可以通过 `torchvision.models` 中直接获取预训练的 VGG16 模型: ```python def get_vgg16_model(num_classes=1000, pretrained=True): model = models.vgg16(pretrained=pretrained) # 修改最后一层全连接层以匹配新的分类数目 num_features = model.classifier[6].in_features features = list(model.classifier.children())[:-1] # 去掉原来的最后一层 features.extend([nn.Linear(num_features, num_classes)]) # 添加新一层 model.classifier = nn.Sequential(*features) return model ``` 这段代码创建了一个函数 `get_vgg16_model()` 来初始化 VGG16 模型,并允许指定输出类别的数量。如果设置了 `pretrained=True` 参数,则会自动下载 ImageNet 上预先训练好的权重[^4]。 #### 加载数据集并验证输入形状 对于给定的数据集,确保输入张量的维度符合预期是非常重要的。根据提供的信息,在训练过程中观察到了如下输入张量的形状: - 输入图像批次 (X): `[N, C, H, W]`, 即 `[32, 3, 224, 224]` - 标签向量 (y): 长度为 N (`32`) 的整数标签列表 这些尺寸表明每批包含 32 张 RGB 图像(通道数为 3),分辨率为 224×224 像素。这样的设置非常适合用来作为 VGG16 的输入[^1]。 #### 使用自定义模型进行预测 一旦有了合适的模型和准备就绪的数据集,就可以开始执行前向传播过程来进行推理或评估性能了。这里给出一段简单的测试代码: ```python if __name__ == "__main__": device = "cuda" if torch.cuda.is_available() else "cpu" # 创建实例化的VGG16模型对象 vgg16 = get_vgg16_model(num_classes=10).to(device) # 构造模拟输入样本 sample_input = torch.randn(32, 3, 224, 224).to(device) # 执行一次前向传递得到输出logits output_logits = vgg16(sample_input) print(f'Output logits shape: {output_logits.shape}') ``` 上述脚本会在 GPU 或 CPU 上运行一个批量大小为 32 的随机输入通过 VGG16 网络,并打印最终输出 logit 向量的形状。注意这里的类别数被设定成了 10 只是为了演示目的;实际应用中应该依据具体任务来决定这个数值[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fire丶Chicken

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值