首页 > 编程知识 正文

神经网络怎么看训练效果,神经网络实例

时间:2023-05-04 13:15:00 阅读:39341 作者:3637

虽然检测到了学习了相当长时间的目标,但是因为细节总是忘记、模糊,所以觉得需要写博客记录学习笔记和心得,可以在加深印象的同时方便他人。 博客内容来自各种学习资源,因此您应该不再在图像中添加水印,而是自己获取。 本专栏详细记录在研究目标检测过程中学到的知识。 主要内容包括: R-CNN系列、YOLO系列等目标检测算法解读; 2 .论文阅读笔记3 .其他目标检测相关概念和技巧,如attention机制的应用。 由于水平有限,很多地方可能不准确、错误,请原谅。

文章目录一、引言二、VGGNet特点1 .结构简洁2 .使用小卷积核3 .使用小滤波器4 .通道数多5 .全连接层转换为卷积层三、网络结构1 .总体概观2 .卷积层3 .网络结构

因为整个目标检测框架由backbone、neck和head组成,所以在学习具体的目标检测算法之前,需要了解常见的卷积神经网络结构,这将在以后成为目标检测算法的Baba 虽然VGGNet的结构比较简单,但我们熟知的单目标检测算法SSD使用VGGNet作为后台,因此有必要将VGGNet的网络结构简化一次,为后续的学习奠定基础。

VGGNet是由牛津大学视觉几何集团(Visual Geometry Group )和谷歌旗下DeepMind团队的研究人员共同研发的,获得了2014年ImageNet图像分类比赛的第二名。 VGGNet可以认为是深版的AlexNet,由卷积层和全连接层两部分组成,只不过是卷积核尺寸都是33。 VGGNet的核心思想是利用较小的卷积核增加网络的深度,其主要贡献是增加网络深度能有效提高模型的性能,对其他数据集也有很好的泛化性能。 在AlexNet论文中,作者最后指出网络深度对最终分类结果有很大的影响,VGGNet更直接地论述了这一结论。 常用的VGGNet有VGG16和VGG19两种,前者有13个核心大小为33的卷积层、5个最大池化层和3个全连接层,后者有16个核心大小为33的卷积层、5个最大池化层和3个全连接层本文主要对VGG16进行解读,发现VGG19只是增加了三个卷积层,其他与VGG16没有区别。

二、VGGNet特点1 .结构简洁,VGGNet结构非常简洁,由5个卷积层、3个全连接层和1个softmax层组成,层与层之间使用最大池化连接,隐藏层之间使用的激活函数全都是ReLU,网络参数齐全

2 .使用小卷积核而不是大卷积核的VGGNet使用包含多个小33卷积核的卷积层。2个33的卷积核堆叠的感受野相当于一个55的卷积核的感受野,而3个33的卷积核堆叠的感受野则相当于一个77的卷积核的感受野因此,采用多个小型卷积内核可以在减少参数数量的同时加强网络非线性映射以提高网络的表达能力。

为什么能提高网络的非线性? 众所周知,激活函数的作用是向神经网络添加非线性元件以与任意函数相匹配,每次卷积操作由ReLU激活,并且ReLU函数是非线性函数。 下图说明了为什么可以使用两个3x3卷积核代替55卷积核。

总结一下,使用多个33卷积堆叠的作用有两个:一是在不影响感受野的前提下减少了参数;二是增加了网络的非线性

3 .使用较小的过滤器与AlexNet相比,VGGNet在池化层全部采用的是22的小滤波器

4 .频道数较多的VGGNet一楼有64个频道,后面各层将频道加倍,最多达到512个频道。 每个频道都代表一个功能图,因此使更多的信息可以被提取出来

5 .将所有连接层转换为卷积层的特点体现在VGGNet的测试阶段。 在进行网络测试时,用三个卷积层替换训练阶段的三个全连接层,使测试得到的网络没有全连接限制,能够接收任意宽度和高度的输入。 如果后面的三层都是全连接层,则测试阶段只能将测试的图像全部按比例缩放到一定的大小,不容易展开多尺度测试工作。

为什么这样置换后才能处理任意大小的输入图像呢?11卷积一个很重要的作用就是调整通道数如果需要在输入下一层的特征图中将通道数量控制为n,设置n个11卷积内核即可完成通道数量的调整。 例如,如果最后需要1000个神经元来划分1000个类别,那么在最后一层之前将使用1000个11的卷积核。 这样做的结果是(1,11000 )正好匹配。

在分析后续Inception结构的博客中介绍11卷积的详细内容。

三.网络结构

1 .整体概观论文共提供6种网络布局,层数由浅到深分别为11层、13层、神勇葡萄酒和19层,上表黑色加粗部分比前一列增加。虽然L

RN在AlexNet中起到了作用,但是在VGG中并没有效果,并且该操作会增加内存和计算量,所以在更深的网络结构中,没有使用该操作。最后两列就分别对应了VGG16和VGG19,由于VGG16和VGG19的后三层(全连接层)完全一致,上面的结构图是针对VGG16,后文都以VGG16为例。VGGNet在替换了AlexNet的大卷积核的基础上,增加了新的卷积层,可以分为五个部分,如图中紫色序号①到⑤,VGG19仅仅是在③、④、⑤的部分增加了一个3×3的卷积层。

2. 卷积层

在卷积层中,为了便于计算,padding都是1。图像在输入进网络后的各个步骤在上图中已经很明了了,这里不做赘述(也可以直接去看第四部分的代码),下面是CS231课件中整个网络的全部参数的计算过程(不考虑偏置):

3. 全连接层

和AlexNet类似,VGGNet的最后三层都是全连接层,通过softmax层输出1000个预测结果。

四、实例演示

下面是VGG16结合批归一化方法的实现代码:

from torch import nnimport torchclass VGG16(nn.Module): def __init__(self, dim, num_classes): super().__init__() self.conv1 = nn.Sequential( nn.Conv2d(dim, 64, kernel_size=3, padding=1), nn.BatchNorm2d(64), nn.ReLU(True), nn.Conv2d(64, 64, kernel_size=3, padding=1), nn.BatchNorm2d(64), nn.ReLU(True), nn.MaxPool2d(2, 2) ) self.conv2 = nn.Sequential( nn.Conv2d(64, 128, kernel_size=3, padding=1), nn.BatchNorm2d(128), nn.ReLU(True), nn.Conv2d(128, 128, kernel_size=3, padding=1), nn.BatchNorm2d(128), nn.ReLU(True), nn.MaxPool2d(2, 2) ) self.conv3 = nn.Sequential( nn.Conv2d(128, 256, kernel_size=3, padding=1), nn.BatchNorm2d(256), nn.ReLU(True), nn.Conv2d(256, 256, kernel_size=3, padding=1), nn.BatchNorm2d(256), nn.ReLU(True), nn.Conv2d(256, 256, kernel_size=3, padding=1), nn.BatchNorm2d(256), nn.ReLU(True), nn.MaxPool2d(2, 2) ) self.conv4 = nn.Sequential( nn.Conv2d(256, 512, kernel_size=3, padding=1), nn.BatchNorm2d(512), nn.ReLU(True), nn.Conv2d(512, 512, kernel_size=3, padding=1), nn.BatchNorm2d(512), nn.ReLU(True), nn.Conv2d(512, 512, kernel_size=3, padding=1), nn.ReLU(True), nn.MaxPool2d(2, 2) ) self.conv5 = nn.Sequential( nn.Conv2d(512, 512, kernel_size=3, padding=1), nn.BatchNorm2d(512), nn.ReLU(True), nn.Conv2d(512, 512, kernel_size=3, padding=1), nn.BatchNorm2d(512), nn.ReLU(True), nn.Conv2d(512, 512, kernel_size=3, padding=1), nn.BatchNorm2d(512), nn.ReLU(True), nn.MaxPool2d(2, 2) ) self.fc = nn.Sequential( nn.Linear(7 * 7 * 512, 4096), nn.ReLU(True), nn.Dropout(), nn.Linear(4096, 4096), nn.ReLU(True), nn.Dropout(), nn.Linear(4096, num_classes) ) def forward(self, x): x = self.conv1(x) x = self.conv2(x) x = self.conv3(x) x = self.conv4(x) x = self.conv5(x) x = x.view(x.size(0), -1) output = self.fc(x) return output

可以把以下FlattenLayer加在全连接层容器最前面,来替换掉forward里的x.view,用下面的代码查看各层输出的尺寸:

class FlattenLayer(nn.Module): def __init__(self): super().__init__() def forward(self, x): return x.view(x.size(0), -1)net = VGG16(3, 1000)X = torch.rand(1, 3, 224, 224)for block in net.children(): X = block(X) print('output shape: ', X.shape)

得到的输出结果如下:

output shape: torch.Size([1, 64, 112, 112])output shape: torch.Size([1, 128, 56, 56])output shape: torch.Size([1, 256, 28, 28])output shape: torch.Size([1, 512, 14, 14])output shape: torch.Size([1, 512, 7, 7])output shape: torch.Size([1, 1000])

VGG的结构还是很简单的,和前面博客里的两个网络差别不大,只是深度更深了,从代码也可以看出来,所以这里只是简单记录一下。原论文中还有很多其他的细节,包括网络的测试等等,这里就不逐一细说了,毕竟只是过一下,感兴趣的话可以去读一读原论文:
Very Deep Convolutional Networks for Large-Scale Image Recognition
后面要讲解的GooLeNet会相对而言更巧妙一些~

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