人工智能(pytorch)搭建模型21-基于pytorch搭建卷积神经网络VoVNetV2模型,并利用简单数据进行快速训练

大家好,我是微学AI,今天给大家介绍一下人工智能(pytorch)搭建模型21-基于pytorch搭建卷积神经网络VoVNetV2模型,并利用简单数据进行快速训练。VoVNetV2模型是计算机视觉领域的一个重要研究成果,它采用了Voice of Visual Residual(VoV)模块来构建网络,通过多个VoV模块的堆叠逐渐提取图像中的高级语义信息。本文对VoVNetV2模型的结构和特点进行了详细介绍,包括VoV模块的特征提取和重建过程,以及引入的注意力机制和跳跃连接技术。我们还讨论了VoVNetV2模型在图像分类、物体检测和语义分割等任务中的优异表现。通过本文的阐述,本文深入介绍VoVNetV2模型的数学原理和实现方式,为其在计算机视觉领域的应用提供参考和指导。

目录:

  1. 引言
  2. VoVNetV2模型的结构和原理
  3. VoVNetV2模型的应用场景
  4. 代码实现
    • 数据生成
    • VoVNetV2模型的构建
    • 模型训练
    • 测试结果
  5. 结论

正文:

1. 引言

随着人工智能和深度学习的发展,越来越多的复杂网络结构被提出来,以解决各种复杂的问题。本文将介绍如何用Pytorch搭建卷积神经网络VoVNetV2模型,详细展示VoVNetV2模型的结构和原理,以及它的应用场景。

2. VoVNetV2模型的结构和原理

VoVNetV2是VoVNet的升级版,其基础是一种名为“视觉卷积”(Visual Convolution)的结构。这是一种新型的卷积结构,它能够以更少的计算量捕获丰富的视觉信息。VoVNetV2的主要特点是其使用了一系列的1x1和3x3的卷积核,通过这种结构,模型可以有效地提取更高级的特征。

VoVNetV2模型的数学原理可以用以下公式表示:

首先,对于输入的图像 x x x,VoVNetV2模型采用了多个VoV模块进行特征提取和重建,其中第 i i i个VoV模块由特征提取子网络 F i F_i Fi和特征重建子网络 G i G_i Gi组成。具体来说,输入特征 x x x会通过特征提取子网络 F i F_i Fi生成中间特征 y i y_i yi,然后经过特征重建子网络 G i G_i Gi得到重建特征 x i + 1 x_{i+1} xi+1,即:

y i = F i ( x i ) x i + 1 = G i ( y i ) + x i y_i=F_i(x_i)\\ x_{i+1}=G_i(y_i)+x_i yi=Fi(xi)xi+1=Gi(yi)+xi

其中, x 0 = x x_0=x x0=x x L x_L xL为网络输出, L L L为VoV模块的数量。

在VoV模块内部,特征提取子网络 F i F_i Fi和特征重建子网络 G i G_i Gi都采用了具有非线性变换能力的卷积神经网络(CNN)。对于特征提取子网络 F i F_i Fi,它可以被表示为:

y i = ReLU ( W i , 2 ReLU ( W i , 1 x i + b i , 1 ) + b i , 2 ) y_i=\text{ReLU}(W_{i,2}\text{ReLU}(W_{i,1}x_i+b_{i,1})+b_{i,2}) yi=ReLU(Wi,2ReLU(Wi,1xi+bi,1)+bi,2)

其中, W i , 1 W_{i,1} Wi,1 W i , 2 W_{i,2} Wi,2 b i , 1 b_{i,1} bi,1 b i , 2 b_{i,2} bi,2是特征提取子网络 F i F_i Fi的权重和偏置, ReLU \text{ReLU} ReLU表示修正线性单元激活函数。

对于特征重建子网络 G i G_i Gi,它可以被表示为:

x i + 1 = ReLU ( W i , 4 ReLU ( W i , 3 y i + b i , 3 ) + b i , 4 ) x_{i+1}=\text{ReLU}(W_{i,4}\text{ReLU}(W_{i,3}y_i+b_{i,3})+b_{i,4}) xi+1=ReLU(Wi,4ReLU(Wi,3yi+bi,3)+bi,4)

其中, W i , 3 W_{i,3} Wi,3 W i , 4 W_{i,4} Wi,4 b i , 3 b_{i,3} bi,3 b i , 4 b_{i,4} bi,4是特征重建子网络 G i G_i Gi的权重和偏置。

除了VoV模块外,VoVNetV2模型还采用了注意力机制和跳跃连接等技术来提高模型的性能。具体来说,注意力机制可以根据特征图中的像素值自适应地调整不同位置的特征权重,从而提高模型在感兴趣区域中的表现;跳跃连接则可以将低级特征和高级特征进行结合,以加强模型的语义表达能力。

在这里插入图片描述

3. VoVNetV2模型的应用场景

由于VoVNetV2的强大的特征提取能力,它广泛应用于计算机视觉的许多领域,包括图像分类,物体检测,语义分割等。在这些任务中,VoVNetV2都表现出了优越的性能。

4. 代码实现

4.1 数据生成

首先,我们生成一些假的数据,用于训练和测试我们的模型。

import torch
import torch.nn as nn
import torchvision

# 生成训练数据
x_train = torch.randn(100, 3, 64, 64)
y_train = torch.randint(0, 1, (100,))

# 生成测试数据
x_test = torch.randn(20, 3, 64, 64)
y_test = torch.randint(0, 1, (20,))

4.2 VoVNetV2模型的构建

然后,我们用Pytorch实现VoVNetV2模型。VoVNetV2模型结构图:
在这里插入图片描述
根据结构图搭建模型代码如下:


__all__ = ['VoVNet', 'vovnet27_slim', 'vovnet39', 'vovnet57']

def Conv3x3BNReLU(in_channels,out_channels,stride,groups=1):
    return nn.Sequential(
            nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=3, stride=stride, padding=1,groups=groups, bias=False),
            nn.BatchNorm2d(out_channels),
            nn.ReLU6(inplace=True)
        )


def Conv3x3BN(in_channels,out_channels,stride,groups):
    return nn.Sequential(
            nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=3, stride=stride, padding=1,groups=groups, bias=False),
            nn.BatchNorm2d(out_channels)
        )


def Conv1x1BNReLU(in_channels,out_channels):
    return nn.Sequential(
            nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=1, stride=1, bias=False),
            nn.BatchNorm2d(out_channels),
            nn.ReLU6(inplace=True)
        )


def Conv1x1BN(in_channels,out_channels):
    return nn.Sequential(
            nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=1, stride=1, bias=False),
            nn.BatchNorm2d(out_channels)
        )

class eSE_Module(nn.Module):
    def __init__(self, channel,ratio = 16):
        super(eSE_Module, self).__init__()
        self.squeeze = nn.AdaptiveAvgPool2d(1)
        self.excitation = nn.Sequential(
            nn.Conv2d(channel, channel, kernel_size=1, padding=0),
            nn.ReLU(inplace=True),
            nn.Sigmoid()
            )
    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.squeeze(x)
        z = self.excitation(y)
        return x * z.expand_as(x)

class OSAv2_module(nn.Module):
    def __init__(self, in_channels,mid_channels, out_channels, block_nums=5):
        super(OSAv2_module, self).__init__()

        self._layers = nn.ModuleList()
        self._layers.append(Conv3x3BNReLU(in_channels=in_channels, out_channels=mid_channels, stride=1))
        for idx in range(block_nums-1):
            self._layers.append(Conv3x3BNReLU(in_channels=mid_channels, out_channels=mid_channels, stride=1))


        self.conv1x1 = Conv1x1BNReLU(in_channels+mid_channels*block_nums,out_channels)
        self.ese = eSE_Module(out_channels)
        self.pass_conv1x1 = Conv1x1BNReLU(in_channels, out_channels)

    def forward(self, x):
        residual = x
        outputs = []
        outputs.append(x)
        for _layer in self._layers:
            x = _layer(x)
            outputs.append(x)
        out = self.ese(self.conv1x1(torch.cat(outputs, dim=1)))
        return out + self.pass_conv1x1(residual)


class VoVNet(nn.Module):
    def __init__(self, planes, layers, num_classes=2):
        super(VoVNet, self).__init__()

        self.groups = 1
        self.stage1 = nn.Sequential(
            Conv3x3BNReLU(in_channels=3, out_channels=64, stride=2, groups=self.groups),
            Conv3x3BNReLU(in_channels=64, out_channels=64, stride=1, groups=self.groups),
            Conv3x3BNReLU(in_channels=64, out_channels=128, stride=1, groups=self.groups),
        )

        self.stage2 = self._make_layer(planes[0][0],planes[0][1],planes[0][2],layers[0])

        self.stage3 = self._make_layer(planes[1][0],planes[1][1],planes[1][2],layers[1])

        self.stage4 = self._make_layer(planes[2][0],planes[2][1],planes[2][2],layers[2])

        self.stage5 = self._make_layer(planes[3][0],planes[3][1],planes[3][2],layers[3])

        self.avgpool = nn.AdaptiveAvgPool2d(output_size=1)
        self.flatten = nn.Flatten()
        self.dropout = nn.Dropout(p=0.2)
        self.linear = nn.Linear(in_features=planes[3][2], out_features=num_classes)

    def _make_layer(self, in_channels, mid_channels,out_channels, block_num):
        layers = []
        layers.append(nn.MaxPool2d(kernel_size=3, stride=2, padding=1))
        for idx in range(block_num):
            layers.append(OSAv2_module(in_channels=in_channels, mid_channels=mid_channels, out_channels=out_channels))
            in_channels = out_channels
        return nn.Sequential(*layers)

    def init_params(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                nn.init.kaiming_normal_(m.weight)
                if m.bias is not None:
                    nn.init.constant_(m.bias, 0)
            elif isinstance(m, nn.BatchNorm2d) or isinstance(m, nn.Linear):
                nn.init.constant_(m.weight, 1)
                nn.init.constant_(m.bias, 0)

    def forward(self, x):
        x = self.stage1(x)
        x = self.stage2(x)
        x = self.stage3(x)
        x = self.stage4(x)
        x = self.stage5(x)
        x = self.avgpool(x)
        x = self.flatten(x)
        x = self.dropout(x)
        out = self.linear(x)
        return out

def vovnet27_slim(**kwargs):
    planes = [[128, 64, 128],
              [128, 80, 256],
              [256, 96, 384],
              [384, 112, 512]]
    layers = [1, 1, 1, 1]
    model = VoVNet(planes, layers)
    return model

def vovnet39(**kwargs):
    planes = [[128, 128, 256],
              [256, 160, 512],
              [512, 192, 768],
              [768, 224, 1024]]
    layers = [1, 1, 2, 2]
    model = VoVNet(planes, layers)
    return model

def vovnet57(**kwargs):
    planes = [[128, 128, 256],
              [256, 160, 512],
              [512, 192, 768],
              [768, 224, 1024]]
    layers = [1, 1, 4, 3]
    model = VoVNet(planes, layers)
    return model


class SAG_Mask(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(SAG_Mask, self).__init__()
        mid_channels = in_channels

        self.fisrt_convs = nn.Sequential(
            Conv3x3BNReLU(in_channels=in_channels, out_channels=mid_channels, stride=1),
            Conv3x3BNReLU(in_channels=mid_channels, out_channels=mid_channels, stride=1),
            Conv3x3BNReLU(in_channels=mid_channels, out_channels=mid_channels, stride=1),
            Conv3x3BNReLU(in_channels=mid_channels, out_channels=mid_channels, stride=1)
        )

        self.avg_pool = nn.AvgPool2d(kernel_size=3, stride=1, padding=1)
        self.max_pool = nn.MaxPool2d(kernel_size=3, stride=1, padding=1)

        self.conv3x3 = Conv3x3BNReLU(in_channels=mid_channels*2, out_channels=mid_channels, stride=1)
        self.sigmoid = nn.Sigmoid()

        self.deconv = nn.ConvTranspose2d(mid_channels,mid_channels,kernel_size=2, stride=2)
        self.conv1x1 = Conv1x1BN(mid_channels,out_channels)

    def forward(self, x):
        residual =  x = self.fisrt_convs(x)
        aggregate = torch.cat([self.avg_pool(x), self.max_pool(x)], dim=1)
        sag = self.sigmoid(self.conv3x3(aggregate))
        sag_x = residual + sag * x
        out = self.conv1x1(self.deconv(sag_x))
        return out

4.3 模型训练

有了数据和模型,我们就可以开始训练我们的模型了。

# 创建模型
model = vovnet27_slim()

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

# 训练模型
for epoch in range(5):  # 假设我们训练10个epoch

    running_loss = 0.0
    for i, data in enumerate(zip(x_train, y_train), 0):
        # 获取输入
        inputs, labels = data
        inputs = inputs.unsqueeze(0)
        labels = torch.tensor([labels])

        # 梯度清零
        optimizer.zero_grad()

        # 前向 + 后向 + 优化
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # 打印统计信息
        running_loss += loss.item()
        if i % 20 == 19:    # 每20个mini-batches打印一次
            print('[%d, %5d] loss: %.6f' %
                  (epoch + 1, i + 1, running_loss / 20))
            running_loss = 0.0

print('Finished Training')

运行结果:

[1,    20] loss: 0.123264
[1,    40] loss: 0.000513
[1,    60] loss: 0.000237
[1,    80] loss: 0.000210
[1,   100] loss: 0.000174
[2,    20] loss: 0.000160
[2,    40] loss: 0.000182
[2,    60] loss: 0.000162
[2,    80] loss: 0.000137
[2,   100] loss: 0.000150
[3,    20] loss: 0.000109
[3,    40] loss: 0.000127
[3,    60] loss: 0.000104
[3,    80] loss: 0.000099
[3,   100] loss: 0.000089
[4,    20] loss: 0.000082
[4,    40] loss: 0.000094
[4,    60] loss: 0.000079
[4,    80] loss: 0.000067
[4,   100] loss: 0.000067
[5,    20] loss: 0.000073
[5,    40] loss: 0.000072
[5,    60] loss: 0.000065
[5,    80] loss: 0.000068
[5,   100] loss: 0.000056
Finished Training

4.4 测试结果

最后,我们用测试数据来检验我们模型的性能。

# 测试模型
correct = 0
total = 0
with torch.no_grad():
    for data in zip(x_test, y_test):
        images, labels = data
        images = images.unsqueeze(0)
        labels = torch.tensor([labels])
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the network on the 20 test images: %d %%' % (
    100 * correct / total))

测试结果:
Accuracy of the network on the 20 test images: 100 %

5. 结论

本篇文章,我们了解了如何用Pytorch实现VoVNetV2模型,以及其结构和原理。VoVNetV2模型是基于VoVNet模型的改进版本,它采用了Voice of Visual Residual(VoV)模块来构建网络。VoVNetV2模型的核心思想是通过有效的信息传递和重复模块的使用来提高网络性能。VoVNetV2模型的结构包括多个连续的VoV模块,每个VoV模块由一个特征提取子网络和一个特征重建子网络组成。

VoVNetV2模型的特点之一是具有很强的表达能力和良好的特征提取能力。它通过多个VoV模块的堆叠来逐渐提取图像中的高级语义信息,并且可以根据任务需求进行灵活的调整和扩展。此外,VoVNetV2模型还引入了注意力机制和跳跃连接等技术,以增强模型的感受野和上下文信息的利用。

VoVNetV2模型在图像分类、物体检测和语义分割等任务中表现出色。在图像分类任务中,VoVNetV2模型能够学习到丰富的特征表示,从而提高分类准确性。在物体检测任务中,VoVNetV2模型可以提供更精确的目标边界框和类别预测。在语义分割任务中,VoVNetV2模型可以有效地捕捉图像中不同区域的语义信息,并生成高质量的分割结果。

通过深入理解VoVNetV2模型的实现原理和结构,读者可以更好地应用该模型进行计算机视觉任务的研究和开发。同时,读者也可以通过对VoVNetV2模型进行改进和扩展,以适应不同应用场景的需求。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高精度工业RFID识别系统的实际应用

工业RFID识别系统的应用范围很广,在生产制造、物流仓储等诸多行业都有应用。但是在实际中,根据应用场景的不同,会选用不同特性的工业识别系统。尤其是企业生产管理等环节,对于识别系统的读写精度要求更高。 高精度工业RFID识别系统…

组装业生产ERP有哪些功能?能帮助企业解决什么问题

不同的组装业务有不同的流程,关联业务环节各不相同,其中物料批次跟踪、订单领料计算、成品生产入库、班组工时负荷评估、原材料采购报价、仓库动态数据反馈等环节的管理工作比较繁琐。 有些组装生产企业采用传统的管理模式,在相关业务数据实…

看看京东的接口优化技巧,确实很优雅!!

大家好,最近看到京东云的一位大佬分享的接口优化方案,感觉挺不错的,拿来即用。建议收藏一波或者整理到自己的笔记本中,随时查阅! 下面是正文。 一、背景 针对老项目,去年做了许多降本增效的事情&#xf…

Redis 通用命令和数据类型

get和set get和set两个命令是最基本也是最常用的命令,主要用于操作字符串类型的数据。 1.SET 命令: SET 命令用于设置指定 key 的值。如果 key 已经持有其他值,SET 就覆写旧值,无视类型。具体的命令格式如下: SET key value例如…

使用Jetty编写RESTful接口

一、依赖 <!--Jetty服务器的核心依赖项&#xff0c;用于创建和管理服务器。--><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-server</artifactId><version>9.4.43.v20210629</version></dependency…

【Vulnhub 靶场】【CEREAL: 1】【困难】【20210529】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/cereal-1,703/ 靶场下载&#xff1a;https://download.vulnhub.com/cereal/Cereal.ova 靶场难度&#xff1a;困难 发布日期&#xff1a;2021年5月29日 文件大小&#xff1a;1.1 GB 靶场作者&#xff1a;Thomas…

写 SVG 动画必看!SVG系列文章2-常见标签

1、坐标定位 对于所有元素&#xff0c;SVG 使用的坐标系统或者说网格系统&#xff0c;和 Canvas 用的差不多&#xff08;所有计算机绘图都差不多&#xff09;。这种坐标系统是&#xff1a;以页面的左上角为 (0,0) 坐标点&#xff0c;坐标以像素为单位&#xff0c;x 轴正方向是…

Alignment of HMM, CTC and RNN-T,对齐方式详解——语音信号处理学习(三)(选修二)

参考文献&#xff1a; Speech Recognition (option) - Alignment of HMM, CTC and RNN-T哔哩哔哩bilibili 2020 年 3月 新番 李宏毅 人类语言处理 独家笔记 Alignment - 7 - 知乎 (zhihu.com) 本次省略所有引用论文 目录 一、E2E 模型和 CTC、RNN-T 的区别 E2E 模型的思路 C…

九要素微气象仪-气象百科

随着科技的发展&#xff0c;人们对天气的预测和掌控能力越来越强。在这个领域&#xff0c;九要素微气象仪以其精准、快速、便携的特点&#xff0c;成为了气象预测的佼佼者。这款仪器不仅可以预测风向、风速、温度、湿度、气压等九大要素&#xff0c;还可以实时监测环境温湿度、…

Spring Security OAuth2.0认证授权

1.基本概念 1.1.什么是认证 系统为什么要认证? 认证是为了保护系统的隐私数据与资源,用户的身份合法方可访问该系统的资源。 认证 :用户认证就是判断一个用户的身份是否合法的过程,用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问,不合法则拒绝…

kettle入门教程

一、概述 1.什么是kettle Kettle是一款开源的ETL(Extract-Transform-Load)工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;绿色无需安装&#xff0c;数据抽取高效稳定。 2.kettle工程存储方式 &#xff08;1&#xff09;以XML形式存储 …

Python实现学生信息管理系统(详解版)

Python实现学生信息管理系统-详解版 个人简介实验名称&#xff1a;学生信息管理系统系统功能实验步骤详讲添加入住学生信息删除学生的住宿信息修改学生的住宿信息查询学生的住宿信息显示所有学生住宿信息显示所有请假学生的信息 运行截图展示1.主界面2.添加新的入住学生信息3.显…

VUE本地idea启动

安装yarn&#xff08;也可以用npm&#xff09; 问题&#xff1a;yarn : 无法加载文件 C:\Users\xx/yarn.ps1&#xff0c;因为在此系统上禁止运行脚本 解决办法&#xff1a;管理员身份运行【 PowerShell】&#xff0c;然后执行【Set-ExecutionPolicy RemoteSigned】&#xff0c…

SHAP(一):具有 Shapley 值的可解释 AI 简介

SHAP&#xff08;一&#xff09;&#xff1a;具有 Shapley 值的可解释 AI 简介 这是用 Shapley 值解释机器学习模型的介绍。 沙普利值是合作博弈论中广泛使用的方法&#xff0c;具有理想的特性。 本教程旨在帮助您深入了解如何计算和解释基于 Shapley 的机器学习模型解释。 我…

从零开始的c语言日记day39——指针进阶-函数指针

复习上节内容 什么是指针数组什么是数组指针 取地址函数名和函数名都是打印函数地址 Pf指向的参数和函数的参数类型要一至。三种写法都可以实现调用 练习&#xff1a;如何解释图中代码作用 首先看&#xff08;void&#xff08;*&#xff09;&#xff08;&#xff09;&#xff…

FPGA程序执行相关知识点

1.目前&#xff0c;大多数FPGA芯片是基于 SRAM 的结构的&#xff0c; 而 SRAM 单元中的数据掉电就会丢失&#xff0c;因此系统上电后&#xff0c;必须要由配置电路将正确的配置数据加载到 SRAM 中&#xff0c;此后 FPGA 才能够正常的运行。 常见的配置芯片有EPCS 芯片 &#x…

Java微服务框架 HP-SOA 1.0.5 — 完整支持 Spring Cloud 和 Dubbo

HP-SOA 功能完备&#xff0c;简单易用&#xff0c;高度可扩展的Java微服务框架。 项目主页 : https://www.oschina.net/p/hp-soa下载地址 : https://github.com/ldcsaa/hp-soa开发文档 : https://gitee.com/ldcsaa/hp-soa/blob/master/README.mdQQ Group: 44636872, 66390394…

佳易王羽毛球馆计时计费软件操作教程,软件可以自动计算费用,支持会员管理

一、前言&#xff08;编程应用实例系列&#xff09;&#xff1a; 佳易王羽毛球馆计时计费软件操作教程&#xff0c;软件可以自动计算费用&#xff0c;支持会员管理 软件有试用版&#xff0c;可以下载试用&#xff0c;了解软件操作和软件功能。 软件试用版下载可以点击最下方…

37.从0到上线三天搭建个人网站(第一天)

点赞收藏加关注&#xff0c;你也能住大别墅&#xff01; 挑战三天搭建个人网站 从0到上线 一、项目的主要功能 1.作为自己在网上的一个工作室。 2.发帖 3.展示个人项目连接 4.介绍自己&#xff08;没准儿还能接点活儿&#xff09; 二、UI风格参考 三、技术选型 1.前端&a…
最新文章