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

news2024/11/25 15:57:49

大家好,我是微学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.coloradmin.cn/o/1267712.html

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

相关文章

“2024上海智博会、2024北京智博会”双展联动,3月上海,6月北京

“2024上海智博会、2024北京智博会”双展联动,将分别于3月和6月在上海和北京举办。这两个展会旨在充分展示智慧城市、人工智能、物联网、大数据、软件等新兴行业的最新产品和技术。 作为中国最具影响力和创新力的智能科技展会,上海智博会和北京智博会吸引…

C#——Delegate(委托)与Event(事件)

C#——Delegate(委托)与Event(事件) 前言一、Delegate(委托)1.是什么?2.怎么用?Example 1:无输入无返回值Example 2:有输入Example 3:有返回值Exa…

实现数据一体化的有效措施

数据一体化的趋势 数据一体化是指将企业内部和外部的各种数据资源整合、统一管理和共享利用的过程,是当前信息化发展的重要趋势。 统一数据平台:企业越来越意识到数据是重要资产,需要建立统一的数据平台,集中管理和利用各类数据资…

直击广州车展 | 远航汽车“卷”出新高度

第23届广州车展作为2023年汽车行业的年度收官之作,成为各大汽车厂商“秀肌肉”的绝佳舞台,22万平方米的开放展区内容纳了1132辆展车,包括全球首发车59辆、概念车20辆、新能源车469辆。 新能源汽车产业发展迅猛,得益于新能源车型在…

开源vs闭源,大模型的未来在哪一边?

开源和闭源,两种截然不同的开发模式,对于大模型的发展有着重要影响。开源让技术共享,吸引了众多人才加入,推动了大模的创新。而闭源则保护了商业利益和技术优势,为大模型的商业应用提供了更好的保障。 那么&#xff0c…

Android-P CameraSerivce

0 前言 本文重点分析Android-P的CameraService实现。 验证:Goldfish模拟器 1 定义 图1.1 CameraService ICameraServiceframeworks/av/camera/aidl/android/hardware/ICameraService.aidlBnCameraServiceout/soong/.intermediates/frameworks/av/camera/libcamera_client/an…

如何远程开关机电脑丨远程开关机电脑的小技巧

在日常生活和工作中,我们可能需要远程控制电脑的开关机。下面就介绍几种常用的远程开关机方法。 方法一: 一、自行下载域之盾软件 https://www.yuzhidun.cn/https://www.yuzhidun.cn/ 二、在一台老板电脑上部署管理端,在想要远程开关机的电…

03、K-means聚类实现步骤与基于K-means聚类的图像压缩(2)

03、K-means聚类实现步骤与基于K-means聚类的图像压缩(2) 工程下载:K-means聚类实现步骤与基于K-means聚类的图像压缩 其他: 03、K-means聚类实现步骤与基于K-means聚类的图像压缩(1) 03、K-means聚类实现…

day66

今日回顾内容 web框架 django 路由控制 视图层 web框架 一、什么是web框架 Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行…

从0开始学习JavaScript--JavaScript中的解构赋值及使用场景

在现代JavaScript中,解构赋值是一种强大而灵活的语法特性,它允许从数组或对象中提取值并赋给变量。这种语法不仅使代码更简洁,而且提高了可读性。在本篇文章中,将深入探讨JavaScript中解构赋值的基本概念、语法规则以及丰富的使用…

element-plus 使用密码输入框的自定义图标

<el-inputv-model"ruleFormPassword.newPassword"placeholder"请输入新密码":type"showPassword ? text : password":style"{ width: 360px }"><template #suffix><span class"input_icon" click"swit…

JavaScript基础—函数、参数、返回值、作用域、变量、匿名函数、综合案例—转换时间,逻辑中断,转换为Boolean型

版本说明 当前版本号[20231129]。 版本修改说明20231126初版20231129完善部分内容 目录 文章目录 版本说明目录JavaScript 基础 - 第4天笔记函数声明和调用声明&#xff08;定义&#xff09;调用细节补充 参数形参和实参函数默认值 返回值作用域全局作用域局部作用域 变量全…

【论文阅读】基于隐蔽带宽的汽车控制网络鲁棒认证(三)

文章目录 第六章 通过认证帧定时实现VulCAN的非once同步6.1 问题陈述6.2 方法概述6.3 动机和缺点6.3.1 认证帧定时隐蔽通信6.3.2 VulCAN的梵蒂冈后端Nonce同步的应用 6.4 设计与实现6.4.1发送方6.4.2 接收方6.4.3 设计参数配置6.4.4 实现 6.5 安全注意事项6.5.1 系统模型6.5.2攻…

提升认知|为什么比尔盖茨在地上发现100美元也会捡?

哈喽呀&#xff0c;大家好&#xff0c;我是雷工&#xff01; 大概在高中时代&#xff0c;听到过这么一个段子&#xff0c;“说如果地上有100美元&#xff0c;比尔盖茨是不会去捡的&#xff0c;因为他弯腰去捡100美元浪费的时间足够其创造1000美元以上的价值。” 当时听完也觉得…

场景应用丨厦门水环境综合治理监测系统效果和作用

厦门&#xff0c;这座美丽的海滨城市&#xff0c;其水资源的状况与水环境的治理对于城市的生存与发展至关重要。近年来&#xff0c;厦门致力于打造生态宜居的城市环境&#xff0c;对城市生命线——水资源的保护与治理给予了极大的关注。其中&#xff0c;水资源综合治理监测系统…

贝锐向日葵与华为达成合作,启动鸿蒙原生应用开发

2023年11月24日&#xff0c;贝锐与华为携手举办鸿蒙原生应用开发启动仪式。贝锐创始人之一兼首席技术官张小峰先生、贝锐事业部总经理张海英女士共同出席了此次活动&#xff0c;并达成重大合作。贝锐旗下国民级远程控制品牌贝锐向日葵将以原生方式适配鸿蒙系统&#xff0c;成为…

《软件工程原理与实践》复习总结与习题——软件工程

软件生命周期 软件生命周期分为三个时期、八个阶段 软件定义时期&#xff1a; 1&#xff09;问题定义阶段&#xff1a;要解决什么问题 2&#xff09;可行性研究阶段&#xff1a;确定软件开发可行 3&#xff09;需求分析阶段&#xff1a;系统做什么 软件开发时期&#xff1a;…

查理·芒格之死对伯克希尔·哈撒韦公司意味着什么?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 虽然查理芒格是伯克希尔哈撒韦公司首席执行官沃伦巴菲特的重要合作伙伴&#xff0c;但猛兽财经认为查理芒格的去世并不会对伯克希尔哈撒韦的正常运营产生太大的影响&#xff0c;因为该公司长期以来一直是由巴菲特主导的。 …

YouTube宣布要求披露AI生成的内容并添加标签

不知道大家在逛YouTube的时候有没有刷到过一些画面和人物看起来不太自然的视频。 没错&#xff0c;这些视频里面的画面和人物可能都是由AI生成的。 近日&#xff0c;YouTube 产品管理副总裁在官方博客文章上表示&#xff1a;生成式 AI 有潜力在 YouTube 上激发创造力&#xff…

vue2常见的语法糖

Vue.js 2 提供了一些语法糖&#xff08;syntactic sugar&#xff09;来简化常见的操作。以下是一些 Vue.js 2 中常用的语法糖&#xff1a; v-bind 简写&#xff1a; <!-- 完整语法 --> <a v-bind:href"url">Link</a><!-- 简写 --> <a :hr…