首页 > 编程知识 正文

pycharm如何创建python项目,c调用python

时间:2023-05-04 21:37:08 阅读:39285 作者:810

介绍

VGG-Network是K. Simonyan和A. Zisserman在论文“verydeepconvolutionalnetworksforlarge-scaleimagerecognition”[1]中提出的卷积菜单该架构在ImageNet上实现了92.7%的top-5测试精度,该网络拥有1400多万张属于1000个类别的图像。

它是深度学习领域的著名体系结构之一。 通过将第1层和第2层的较大内核大小的滤波器分别替换为11和5,显示出AlexNet架构的改善,多个33内核大小的滤波器层出不穷。 经过几周的培训,使用了NVIDIA Titan Black GPU。

VGG16架构卷积神经网络的输入是固定大小的224 224 RGB图像。 预处理只需从每个像素中减去训练数据集计算的平均RGB值。

由一捆卷积层执行的图像,其中滤波器的感觉范围非常小,3 3,是捕捉左/右、上/下概念的最小尺寸和中心部分。

在任一配置中,还使用1 1卷积滤波器,并且观测到在输入信道的线性变换之后它们为非线性的。 卷积步幅固定为1像素; 卷积层输入的空间填充使卷积后的空间分辨率保持恒定。 也就是说,3 3个卷积层的填充是1个像素。

然后,空间池化由五个最大池层执行,其中16个最大池层跟在几个Conv层之后,但不是所有Conv层。 此最大池化在2 2像素的窗口中执行,步长为2。

来源: neurohive.io

该体系结构包含许多在不同体系结构中具有不同深度的卷积层,其次是三个全连接(FC )层。 前两个FC分别有4096个通道,第三个FC执行1000通道分类,因此每类包含一个通道。

最后一层是soft-max层。 所有网络中的所有连接层的配置都很相似。

所有隐藏层都装备有整流(ReLU )非线性。 此外,此处的网络还包括局域网(lrn )。 此规范化不会提高培训数据集的性能,但这会增加内存消耗和计算时间。

体系结构总结:

模型的输入是固定大小的224224224224 RGB图像

预处理是每个像素减去训练集的RGB值后的平均值

折叠层17

步幅固定为1像素

3 x 33 x 3填充为1像素

空间池化层

此层通常不包括在网络深度中

空间池化使用最大池化层进行

窗口大小为2222

步幅固定为2

convnets最多使用5个池化层

全连接层:

第一个是4096(Relu )

第二,4096(Relu ) )。

第三,1000 (软件最大值)

体系结构配置下图显示了VGG网络的卷积神经网络配置

以下内容:

VGG-11

是vgg-11(lrn )

VGG-13

vgg-16(conV1 ) )。

VGG-16

VGG-19

来源:《大规模图像识别深度卷积网》

上述卷积神经网络每列配置一个。

以下,网络以其名称(A-E )表示。 所有配置都遵循传统设计,只有深度不同。 从网络a的11个权重层(8个变换和3个FC层)变为网络e的19个权重层(16个变换和3个FC层)。

每个卷积层的宽度较小,信道数从第一层64开始,在每个最大池化层达到512之前持续增加两倍。

各构成的参数如下。 虽然深度较大,但网络中权重的数量不大于浅网络中权重的数量,卷积层的宽度和感觉区较大

来源:“大规模图像识别的非常深的卷积网络”

训练损失函数是多个逻辑回归

学习算法是基于动量反向传播的小批量随机梯度下降(SGD )

批量是256

运动量是0.9

正则化

L2加权衰减(罚乘数为0.0005 ) ) ) )。

前两个全连接层的Dropout设置为0.5

学习率

初始: 0.01

如果停止提高验证集的精度,则下降到10。

与Alexnet相比,参数和深度多,但CNN的损耗函数收敛所需的时间少

小卷积核和大深度的更多正则化。

部分图层的预初始化。

训练图

像大小

S 是同位素重缩放图像的最小边

设置S的两种方法

Fix S,称为单尺度训练

这里 S = 256 和 S = 384

Vary S,称为多尺度训练

S 来自 [Smin, Smax] 其中 Smin = 256, Smax = 512

– 然后 224×224224×224

图像是从每次 SGD 迭代重新缩放的图像中随机裁剪的。

主要特征

VGG16 共有 16 层,具有一定的权重。

仅使用卷积和池化层。

始终使用 3 x 3 内核进行卷积。20

2×2 大小的最大池。

1.38 亿个参数。

在ImageNet 数据上训练。

它的准确率为 92.7%。

另一个版本是 VGG 19,共有 19 个带权重的层。

这是一个非常好的深度学习架构,用于对任何特定任务进行基准测试。

VGG 的预训练网络是开源的,因此它可以开箱即用地用于各种类型的应用程序。

让我们实现 VGG 网络

首先让我们为 VGG 网络的每个版本创建过滤器映射。参考上面的配置图片了解过滤器的数量。即为键名为 VGG11、VGG13、VGG16、VGG19 的版本创建一个字典,并分别根据每个版本中的过滤器数量创建一个列表。这里列表中的“M”称为 Maxpool 操作。

import torchimport torch.nn as nn VGG_types = {"VGG11": [64, "M", 128, "M", 256, 256, "M", 512, 512, "M", 512, 512, "M"],"VGG13": [64, 64, "M", 128, 128, "M", 256, 256, "M", 512, 512, "M", 512, 512, "M"],"VGG16": [64,64,"M",128,128,"M",256,256,256,"M",512,512,512,"M",512,512,512,"M",],"VGG19": [64,64,"M",128,128,"M",256,256,256,256,"M",512,512,512,512,          "M",512,512,512,512,"M",],}

创建一个全局变量来说明架构的版本。然后创建一个名为 VGG_net 的类,输入为 in_channels 和 num_classes,它接受输入,如图像通道数和输出类数。

初始化 Sequential 层,即在序列中,Linear layer->ReLU->Dropout。

然后创建一个名为 create_conv_layers 的函数,它将 VGGnet 架构配置作为输入,即我们上面为不同版本创建的列表。当它遇到上面列表中的字母“M”时,它执行 MaxPool2d 操作。

VGGType = "VGG16" class VGGnet(nn.Module):    def __init__(self, in_channels=3, num_classes=1000):        super(VGGnet, self).__init__()        self.in_channels = in_channels        self.conv_layers = self.create_conv_layers(VGG_types[VGGType]) self.fcs = nn.Sequential(nn.Linear(512 * 7 * 7, 4096),nn.ReLU(),nn.Dropout(p=0.5),nn.Linear(4096, 4096),nn.ReLU(),nn.Dropout(p=0.5),nn.Linear(4096, num_classes),)def forward(self, x):x = self.conv_layers(x)x = x.reshape(x.shape[0], -1)x = self.fcs(x)return xdef create_conv_layers(self, architecture):layers = []in_channels = self.in_channelsfor x in architecture:if type(x) == int:out_channels = xlayers += [nn.Conv2d(in_channels=in_channels,out_channels=out_channels,kernel_size=(3, 3),stride=(1, 1),padding=(1, 1),),nn.BatchNorm2d(x),nn.ReLU(),]in_channels = xelif x == "M":layers += [nn.MaxPool2d(kernel_size=(2, 2), stride=(2, 2))]return nn.Sequential(*layers)

完成后,编写一个小的测试代码来检查我们的实现是否运行良好。

在下面的测试代码中,给出的类数是 500。

if __name__ == "__main__":    device = "cuda" if torch.cuda.is_available() else "cpu"    model = VGGnet(in_channels=3, num_classes=500).to(device)    # print(model)    x = torch.randn(1, 3, 224, 224).to(device)    print(model(x).shape)

输出应该是这样的:

如果你想查看网络架构,你可以取消对上述代码中的*print(model)*语句的注释。也可以通过更改变量 VGGType 中的 VGG 版本来尝试使用不同的版本。

整个代码可以在这里访问:

https://github.com/BakingBrains/Deep_Learning_models_implementation_from-scratch_using_pytorch_/blob/main/VGG.py

[1]. K. Simonyan and A. Zisserman: Very Deep Convolutional Networks for Large-Scale Image Recognition, April 2015, DOI: https://arxiv.org/pdf/1409.1556.pdf

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。