pytorch实战3:基于pytorch复现VGG16

这篇具有很好参考价值的文章主要介绍了pytorch实战3:基于pytorch复现VGG16。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基于pytorch实现VGG16模型

前言

​ 最近在看经典的卷积网络架构,打算自己尝试复现一下,在此系列文章中,会参考很多文章,有些已经忘记了出处,所以就不贴链接了,希望大家理解。

​ 完整的代码在最后。

本系列必须的基础

​ python基础知识、CNN原理知识、pytorch基础知识

本系列的目的

​ 一是帮助自己巩固知识点;

​ 二是自己实现一次,可以发现很多之前的不足;

​ 三是希望可以给大家一个参考。

目录结构

1. VGG16模型介绍:

​ VGG是2014发布的,在图像分类上的ImageNet比赛上为当时的亚军,冠军是GoogLeNet。

​ 在VGG论文中,主要应用的模型是VGG16和VGG19,其中数字表示层数。

​ 其中VGG16具体的架构为:

pytorch实战3:基于pytorch复现VGG16

​ 上面可以简记为:2+pool+2+pool+3+pool+3+pool+3+pool+3FC

2. VGG16模型构建:

代码参考于pytorch官方实现的版本

​ 首先,导入需要的模块:

# 导包
import torch
from torch import nn

​ 其次,把pytorch实现模型的基本结构写出来:

# 创建AlexNet模型
class My_VGG16(nn.Module):
    def __int__(self):
        super(My_VGG16, self).__int__()
        # 准备定义模型
    # 前向算法
    def forward(self,x):
        pass

​ 然后,我们先来定义前面的特征提取层,即卷积–池化—卷积–池化…的层:

# 特征提取层
self.features = nn.Sequential(
    nn.Conv2d(in_channels=3,out_channels=64,kernel_size=3,stride=1,padding=1),
    nn.Conv2d(in_channels=64,out_channels=64,kernel_size=3,stride=1,padding=1),
    nn.MaxPool2d(kernel_size=2,stride=2),
    nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=1, padding=1),
    nn.Conv2d(in_channels=128, out_channels=128, kernel_size=3, stride=1, padding=1),
    nn.MaxPool2d(kernel_size=2, stride=2),
    nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, stride=1, padding=1),
    nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, stride=1, padding=1),
    nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, stride=1, padding=1),
    nn.MaxPool2d(kernel_size=2,stride=2),
    nn.Conv2d(in_channels=256, out_channels=512, kernel_size=3, stride=1, padding=1),
    nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),
    nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),
    nn.MaxPool2d(kernel_size=2, stride=2),
    nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),
    nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),
    nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),
    nn.MaxPool2d(kernel_size=2, stride=2),
)

上面代码基本没啥难点,就是按照VGG16的标准架构,一层一层写出来的,就不写注释了(有什么问题可以留言)。

​ 然后,我们来实现全连接的部分:

# 分类层
self.classifier = nn.Sequential(
    # 全连接的第一层,输入肯定是卷积输出的拉平值,即7*7*512
    # 输出是由VGG决定的,为4096
    nn.Linear(in_features=7*7*512,out_features=4096),
    nn.ReLU(),
    nn.Dropout(0.5),
    nn.Linear(in_features=4096,out_features=4096),
    nn.ReLU(),
    nn.Dropout(0.5),
    # 最后一层,输出1000个类别,也是我们所说的softmax层
    nn.Linear(in_features=4096,out_features=1000)
)

上面代码中,不要忘记加上全连接层必备的激活函数和VGG采取的正则化手段dropout即可。

​ 最后,我们定义我们的前向算法:

def forward(self,x):
    x = self.features(x)
    # 不要忘记在卷积--全连接的过程中,需要将数据拉平,之所以从1开始拉平,是因为我们
	# 批量训练,传入的x为[batch(每批的个数),x(长),x(宽),x(通道数)],因此拉平需要从第1(索引,相当于2)开始拉平
	# 变为[batch,x*x*x]
    x = torch.flatten(x,1)
    result = self.classifier(x)
    return result

3. 总结:

​ VGG16的构建和AlexNet几乎差不多,非常的简单。当然,和AlexNet一样,我也没有收集数据进行训练,不过大家可以自行尝试,简单点可以使用MNIST数据集,或者可以去网上找到ImageNet的开源数据集,收集一小部分来用。

完整代码文章来源地址https://www.toymoban.com/news/detail-480649.html

# author: baiCai
# 导包
import torch
from torch import nn
from torchvision.models import VGG

# 创建模型
class My_VGG16(nn.Module):
    def __init__(self):
        super(My_VGG16, self).__init__()
        # 特征提取层
        self.features = nn.Sequential(
            nn.Conv2d(in_channels=3,out_channels=64,kernel_size=3,stride=1,padding=1),
            nn.Conv2d(in_channels=64,out_channels=64,kernel_size=3,stride=1,padding=1),
            nn.MaxPool2d(kernel_size=2,stride=2),
            nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=1, padding=1),
            nn.Conv2d(in_channels=128, out_channels=128, kernel_size=3, stride=1, padding=1),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, stride=1, padding=1),
            nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, stride=1, padding=1),
            nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, stride=1, padding=1),
            nn.MaxPool2d(kernel_size=2,stride=2),
            nn.Conv2d(in_channels=256, out_channels=512, kernel_size=3, stride=1, padding=1),
            nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),
            nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),
            nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),
            nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),
            nn.MaxPool2d(kernel_size=2, stride=2),
        )
        # 分类层
        self.classifier = nn.Sequential(
            # 全连接的第一层,输入肯定是卷积输出的拉平值,即6*6*256
            # 输出是由AlexNet决定的,为4096
            nn.Linear(in_features=7*7*512,out_features=4096),
            nn.ReLU(),
            nn.Dropout(0.5),
            nn.Linear(in_features=4096,out_features=4096),
            nn.ReLU(),
            nn.Dropout(0.5),
            # 最后一层,输出1000个类别,也是我们所说的softmax层
            nn.Linear(in_features=4096,out_features=1000)
        )

    def forward(self,x):
        x = self.features(x)
        # 不要忘记在卷积--全连接的过程中,需要将数据拉平,之所以从1开始拉平,是因为我们
        # 批量训练,传入的x为[batch(每批的个数),x(长),x(宽),x(通道数)],因此拉平需要从第1(索引,相当于2)开始拉平
        # 变为[batch,x*x*x]
        x = torch.flatten(x,1)
        result = self.classifier(x)
        return result

到了这里,关于pytorch实战3:基于pytorch复现VGG16的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 语义分割 | 基于 VGG16 预训练网络和 Segnet 架构实现迁移学习

    Hi,大家好,我是源于花海。 本文主要使用数据标注工具 Labelme 对猫(cat)和狗(dog)这两种训练样本进行标注,使用预训练模型 VGG16 作为卷积基,并在其之上添加了全连接层。基于标注样本的信息和预训练模型的特征提取能力以及 Segnet 架构,训练自己构建的 语义分割 网

    2024年01月25日
    浏览(43)
  • 图像分类 | 基于 Labelme 数据集和 VGG16 预训练模型实现迁移学习

    Hi,大家好,我是源于花海。 本文主要使用数据标注工具 Labelme   对自行车(bike)和摩托车(motorcycle)这两种训练样本进行标注,使用预训练模型  VGG16  作为卷积基,并在其之上添加了全连接层。基于标注样本的信息和预训练模型的特征提取能力,训练自己构建的 图像分

    2024年01月20日
    浏览(41)
  • Pytorch基于VGG cosine similarity实现简单的以图搜图(图像检索)

    代码如下: 上述代码的核心思想类似于感知损失(Perceptual Loss),利用VGG提取图像的多级特征,从而比较两张图像之间的相似性。区别在于Perceptual Loss中一般使用MAE,MSE比较特征的距离,而这里的代码使用余弦相似度。 一个例子如下,给定一张狸花的图像(query)如下: 我们希望

    2024年02月13日
    浏览(35)
  • 基于FPGA的VGG16卷积神经网络加速器

    文章搬运自本人知乎 VGG在2014年由牛津大学Visual GeometryGroup提出,获得该年lmageNet竞赛中Localization Task(定位任务)第一名和 Classification Task (分类任务)第二名。与AlexNet相比,VGG使用了3个3x3卷积核来代替7x7卷积核,使用了2个3x3卷积核来代替5x5卷积核,从而在保证具有相同感知野的

    2024年02月06日
    浏览(32)
  • pytorch 实现VGG

          VGG 全称是Visual Geometry Group,因为是由Oxford的Visual Geometry Group提出的。AlexNet问世之后,很多学者通过改进AlexNet的网络结构来提高自己的准确率,主要有两个方向:小卷积核和多尺度。而VGG的作者们则选择了另外一个方向,即加深网络深度。       卷积网络的输入是 2

    2024年02月12日
    浏览(36)
  • 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part1 案例复现

    【时间序列篇】基于LSTM的序列分类-Pytorch实现 part1 案例复现 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part2 自有数据集构建 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part3 化为己用 本篇文章是对已有一篇文章的整理归纳,并对文章中提及的模型用Pytorch实现。 序列,

    2024年01月24日
    浏览(46)
  • 基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(四)

    本项目采用VGG-16网络模型,使用Kaggle开源数据集,旨在提取图片中的用户特征,最终在移动端实现对不良驾驶行为的识别功能。 首先,通过使用VGG-16网络模型,本项目能够深入学习和理解驾驶场景图像中的特征。VGG-16是一种深度卷积神经网络,特别适用于图像识别任务,通过

    2024年02月03日
    浏览(40)
  • pytorch实战9:基于pytorch简单实现u-net

    前言 ​ 最近在看经典的卷积网络架构,打算自己尝试复现一下,在此系列文章中,会参考很多文章,有些已经忘记了出处,所以就不贴链接了,希望大家理解。 ​ 完整的代码在最后。 本系列必须的基础 ​ python基础知识、CNN原理知识、pytorch基础知识 本系列的目的 ​ 一是

    2024年02月07日
    浏览(39)
  • 深度学习——VGG16模型详解

    1、网络结构 VGG16模型很好的适用于分类和定位任务,其名称来自牛津大学几何组(Visual Geometry Group)的缩写。 根据卷积核的大小核卷积层数,VGG共有6种配置,分别为A、A-LRN、B、C、D、E,其中D和E两种是最为常用的VGG16和VGG19。 介绍结构图: conv3-64 :是指第三层卷积后维度变

    2024年01月16日
    浏览(40)
  • 经典卷积神经网络——VGG16

    我们都知道Alexnet是卷积神经网络的开山之作,但是由于卷积核太大,移动步长大,无填充,所以14年提出的VGG网络解决了这一问题 VGG网络由牛津大学在2014年ImageNet挑战赛本地和分类追踪分别获得了第一名和第二名。研究卷积网络深度对其影响在大规模图像识别设置中的准确性

    2024年02月03日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包