人工智能(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 = xoutputs = []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 = 1self.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_channelsreturn 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 outdef 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 modeldef 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 modeldef 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 modelclass SAG_Mask(nn.Module):def __init__(self, in_channels, out_channels):super(SAG_Mask, self).__init__()mid_channels = in_channelsself.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 * xout = 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个epochrunning_loss = 0.0for i, data in enumerate(zip(x_train, y_train), 0):# 获取输入inputs, labels = datainputs = 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.0print('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 = dataimages = 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.rhkb.cn/news/209021.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十五届蓝桥杯模拟赛(第二期)

大家好,我是晴天学长,本次分享,制作不易,本次题解只用于学习用途,如果有考试需要的小伙伴请考完试再来看题解进行学习,需要的小伙伴可以点赞关注评论一波哦!后续会继续更新第三期的。&#x1f4…

wvp gb28181 pro 平台国标级连功能说明

国标28181不同平台之间支持两种连接方式,平级和上下级,WVP目前支持向上级级联。 测试环境 测试平台上级:192.168.10.209(Alam centos8) 测试平台下级:192.168.10.206(ky10_x86) 下级…

VUE语法-ref和reactive响应式数据引用

1、响应式概述 在vue中定义一个参数,当这个参数在使用中发生了变化,在页面中对这个数据应用的地方都会同步的发生变化,这个就是数据响应式。 2、创建一个非响应式的参数 该程序中采用的是VUE3的用法: 1、在程序中定义了一个局…

应用于智慧金融的AI边缘计算盒子+AI算法软硬一体化方案

传统金融营业厅存在运营管理模式落后、资源投放不平衡、从业人员培训效果不达预期、客户体验割裂等普遍现象; 部署英码数字金融解决方案,将助力企业从传统金融模式快速向数字金融模式转变,可针对每一个客户定制个性化“一对一”服务&#xff…

【栈和队列(2)】

文章目录 前言队列队列方法队列模拟实现循环队列练习1 队列实现栈 前言 队列和栈是相反的,栈是先进后出,队列是先进先出,相当于排队打饭,排第一的是最先打到饭出去的。 队列 队列:只允许在一端进行插入数据操作&…

MySQL 8创建数据库、数据表、插入数据并且查询数据

我使用的数据库是MySQL 8。 创建数据库 create database Bookbought; -- 创建数据库Bookbought use Bookbought; -- 使用数据库Bookbought创建数据表 创建用户表bookuser。 create table ## 往allbook里边插入数据(id INT PRIMARY KEY AUTO_INCREMENT, -- id 为 主键userna…

Golang数据类型(字符串)

字符串重要概念 根据Go语言官方的定义: In Go, a string is in effect a read-only slice of bytes. 意思是Go中的字符串是一组只读的字节切片(slice of bytes),每个字符串都使用一个或多个字节表示(当字符为 ASCII 码…

OpenWrt作为旁路由(网关)配置

目录 背景前提条件环境操作步骤物理层连接设置与主路由同一网段禁用IPv6取消LAN接口桥接防火墙配置 背景 本文简介如何配置OpenWrt,使其作为旁路由(网关)运行。 旁路由大概有以下这几种工作方式: 主路由开DHCP,网关未…

LeetCode刷题---反转链表

个人主页:元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏:http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的 我讲述…

XSS漏洞原理

XSS漏洞介绍: 跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页面时,嵌入We…

【读书笔记】微习惯

周日晚上尝试速读一本书《微习惯》,共七章看了下目录结构并不复杂,计划每章7-8分钟读完, 从20:15-21:00。读的时候,订下闹钟,催促着自己的进度。边读边记了一些要点和微信读书里面的划线。 第六章实践内容最为丰富&…

CnosDB有主复制演进历程

分布式存储系统的复杂性涉及数据容灾备份、一致性、高并发请求和大容量存储等问题。本文结合CnosDB在分布式环境下的演化历程,分享如何将分布式理论应用于实际生产,以及不同实现方式的优缺点和应用场景。 分布式系统架构模式 分布式存储系统下按照数据复…

计算机网络TCP篇①

目录 一、TCP 基本信息 1.1、TCP 的头格式 1.2、什么是 TCP 1.3、什么是 TCP 连接 1.4、TCP 与 UDP 的区别 1.2、TCP 连接建立 1.2.1、TCP 三次握手的过程 1.2.2、为什么是三次握手?不是两次?四次?(这个问题真是典中典&am…

C++基础 -34- 输入输出运算符重载

输出运算符重载格式 ostream & operator<<(ostream &out,person a) {cout << a.a << endl;return out; }举例输出运算符重载 #include "iostream"using namespace std;class person {public:person(int a):a(a){}int a; };ostream &…

LabVIEW在调用image.cpp或drawmgr.cpp因为DAbort而崩溃

LabVIEW在调用image.cpp或drawmgr.cpp因为DAbort而崩溃 出现下列问题&#xff0c;如何解决&#xff1f; 1. LabVIEW 程序因image.cpp或drawmgr.cpp中的错误而崩溃 2. 正在通过cRIO-9034运行独立的LabVIEW应用程序&#xff0c;但它因drawmgr.cpp中的错误而崩溃 …

什么是DDoS攻击

DDoS攻击 1. 定义2. DDoS攻击类型2.1 网络层攻击2.2 传输层攻击2.3 应用层攻击 3.DDoS攻击态势特点 1. 定义 分布式拒绝服务&#xff08;DDoS&#xff09;攻击是一种常见的网络攻击形式。攻击者利用恶意程序对一个或多个目标发起攻击&#xff0c;企图通过大规模互联网流量耗尽…

Zabbix监控接收SNMPTrap消息与SNMPTT结合

一.SNMP 协议 1.协议介绍 snmp 协议是日常使用的较多的一种协议&#xff0c;绝大多数网络设备/存储等都支持 snmp 协议&#xff0c;通过此协议可以实现设备状态的监控及管理。 2.主要组成 SNMP 协议包括以下三个部分: SNMP Agent&#xff1a;负责处理 snmp 请求&#xff0c…

Android11适配已安装应用列表

Android11适配已安装应用列表 之前做过已安装应用列表的适配&#xff0c;最近国内版SDK升级到33和隐私合规遇到很多问题&#xff0c;于是把已安装应用列表记录一下&#xff1a; 1、在Android11及以上的适配&#xff1a; package com.example.requestinsttallapplistdemoimpo…

POSTGRESQL中如何利用SQL语句快速的进行同环比?

目录 1. 引言2. 数据准备3. 时间序列数据处理4. 同比分析4.1 对两年的数据进行对比4.2 计算两年的差额和同比4.3 细分后的同比计算 5. 环比分析5.1 简单的日期环比计算5.2 先聚合再进行环比计算5.3 考虑日期不连续的环比计算 6. 性能优化技巧7. 注意事项与常见问题8. 结语 1. 引…

在Excel中,只需点击几下,就能只复制和粘贴可见单元格

你可以在Excel中隐藏列、行或单元格&#xff0c;以使数据输入或分析更容易。但是&#xff0c;当你复制并粘贴一个包含隐藏单元格的单元格区域时&#xff0c;它们会突然重新出现。 你可能没有意识到&#xff0c;但有一种方法可以只复制和粘贴Microsoft Excel中的可见单元格。只…