PyTorch框架:(5)使用PyTorch框架构建卷积神经网络

news/2024/9/20 15:18:38

基于pytorch构建一个非常简单的卷积神经网络,以Mnist数据集为例演示基本的流程

 

1、导工具包

 2、读取数据

(把该写的超参数全部写出来)

PS:当前输入图像的大小,注意这里使用卷积网络处理Mnist数据他就不是一个一个像素点了,既然我们要用卷积网络去做,那输入的他得是一张图像,对于一张图像我们现在的输入得是28x28x1的三维的数据,我们现在需要的数据他是三维的h\times w\times c他是三维的。

 3、卷积网络模块构建

 

 定义的conv1不光是做了一个卷积,他是一个卷积模块,包含了卷积、池化、Relu全部加进去了,

 定义conv2也是一个卷积模块;

在做卷积层的时候其实很简单,需要在nn模块当中,把Conv2d拿出来就可以了,其中:

in_channel:表示当前输入的特征图个数,对于第一个卷积来说,他的输入应该是我们的Mnist数据,这个数据是一个灰度图,所以说他的In_channels=1,这是我输入的颜色通道,或者说输入特征图的个数;

out_channels:表示输出特征图的个数,就是说你用多少个卷积核来对当前数据或者对当前的这个图进行特征提取,这里的16表示你用16个卷积核,16个不同的卷积核,肯定会得到16个不同的特征图,所以out这里的意思就是你想得到多少个特征图的意思;

kernel_size:表示我们现在做卷积,你得告诉我我每隔多大的区域进行特征提取,这里等于5就是我用一个5x5的区域来去在当前原始的输入图像当中进行特征提取,kernel_size=5表示卷积核的大小;

stride:表示当前的步长;我在做卷积的窗口进行滑动过程当中,每隔几个单元滑动,一般情况下步长都是为1的。

padding:表示做边缘填充;这里为2表示加2圈0。

PS:如果不想写这些参数的名字,直接向nn.Conv2d那样直接全部输入数字也行。

在nn.Conv2d中的16表示输入,之前输入是1表示灰度图默认就是1,

 这里的16表示(大家记住一点就是我当前这个卷积层他的输入大小就是之前得到多少个特征图)之前得到的16个特征图,所以这里我们的输入也是16;

32表示使用32个卷积核去提取特征,得到的是32个图;

5表示kernel_size=5;

3.1、拉伸操作

在做卷积的时候,最后不管是卷积层还是Relu层还是pooling层,无论这三个层中的哪一个,我们最终得到的都是一个特征图,所谓这个特征图不考虑batch_size的前提下,他是一个三维的h\times w\times c比如我最终得到的是一个32x32x256的结果,他是一个图,他不是一个矩阵,我们最终需要得到一个10分类的结果,怎么样得到一个10分类的结果呢?现在我需要把这个立体的东西给他拉长,转成一个矩阵或者说是向量,比如说这里他是一个2048维度(假设的)的向量,接下来我连接上一个全连接层(一个权重参数w,一个偏置参数b),我就能得到我最终预测出来的一个结果,比如说10个类别,我就能够去做了。

PS:所以说这里我得多做一步,把当前得到的特征图,给他拉长,拉成一个长向量,基于这个向量我才能对他做一个全连接层,得到最终的一个预测结果,所以这里有一步拉长的操作。

 在做拉长操作之前还得做一件事,我们得知道,你最后一层这个全连接层里边这个w他的一个维度,w的第2维度很简单肯定是个10,因为得到的是10个类别,第一个维度就是你得到这个特征图里边他有多少个特征,这里的2048就是把3个数乘在一起, 所以在做卷积的时候最后得到的这个特征图他的规格,它的大小是等于多少。

这里我们计算一下他得到的特征图大小是多少?

一开始输入28x28x1--------------------->经过第一个卷积层之后得到28x28x16(因为用了16个卷积核)------------->经过Relu不变还是28x28x16------------->经过最大池化层14x14x16,------------>经过第二个卷积层14x14x32因为用了32个卷积核)------------->经过Relu不变还是14x14x32------------->经过最大池化层7x7x32,所以最终的w第一个维度就等于1568=7x7x32,第二个维度是10

根据计算公式:h=\frac{h-F_{h}+2P}{s}+1

 所以写了一个最终输出层,输出层里边我们是全连接操作,然后全连接里边他是32X7x7表示经过这几次卷积之后得到的一个结果,10就是最终想要输出的类别的个数。

3.2、把网络串起来

之后进行前向传播,前向传播比较简单,一开始经过conv1,再经过conv2,下一句特别的,做了一个reshape操作(x=x.view(x.size(0),-1)),这个reshape操作就是刚才说的咱们得把当前结果转化成全部向量的格式(因为下一层要做全连接了),接下来用向量再乘上我的全连接层,就是wx+b,最终就得到了当前这个输入属于10个类别中的各自的一个结果。

4、评估

评估函数计算一下当前的准确率。

 5、训练网络模型

 把一开始定义的CNN拿到手,定义损失函数,指定优化器。接下来遍历每个epoch,每个epoch里边我一个batch一个batch的取数据,然后定义一个train模块(net.train()),然后在train模块当中更新我们的一个权重参数,就可以了;

每隔一百次可以去在验证集上看一下当前验证集的效果等于多少;接下来计算准确率打印当前结果;

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

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

相关文章

使用Python,OpenCV进行基本的图像处理——提取红色圆圈轮廓并绘制

使用Python,OpenCV进行基本的图像处理——提取红色圆圈轮廓并绘制1. 效果图1.1 形态学图像处理效果图1.2 转换HSV色彩空间提取2. 源码2.1 形态学图像处理提取源码2.2 转换HSV色彩空间提取源码写这篇博客源于博友的提问,想提取图片中的红色圆圈坐标&#…

PyTorch框架:(6)图像识别实战常用模块解读

1、TorchVision 官网:torchvision — Torchvision 0.10.0 documentation 在torchvision这个模块当中,包含了很多后续需要的功能: 需要自己安装这个模块pip install torchvision。安装完之后我们就可以使用这里边的三大核心模块了。 &…

Java 使用itextPdf7操作pdf,写入照片这一篇就够了

Java 使用itextPdf7操作pdf,写入照片这一篇就够了1. 效果图1.1 M*N列图片(无边界&有边界)1.2 图片重叠1.3 文字背景图片1.4 图片与文字相邻 & 图片文字Rowspan样式1.5 一个单元格多图片 & 多图片文本内容1.6 单元格中文本图片位置…

Flash气泡回弹效果

好久没有碰过Flash了,今天温习一下AS3.0,做了一个回弹效果,气泡回弹本想着怎么可以定义气泡的不同颜色,这样可以做出更绚丽的效果,或者更进步一,气泡和气泡直接回弹,想了老半天没有想出来&#…

Computer Vision Tasks

Computer Vision Tasks: 图像分类、目标检测、语义分割、实例分割; 只有目标检测和实例分割是实现了实例级别的识别的,就是把每一个单独的物体拎出来识别的;目标检测是画框框,而实例分割是抠图。 实例识别:就是把图片…

如何在OpenCV中为InRange阈值选择颜色的最佳HSV值

如何在OpenCV中为InRange阈值选择颜色的最佳HSV值 1. 效果图2. 源码参考之前的博客介绍了如何使用Python,OpenCV通过HSV颜色空间转换检测对象,并进行轨迹追踪。怎么选定合适的HSV颜色阈值范围非常非常非常的重要。 这篇博客将介绍如何在OpenCV中为InRange阈值选择颜色的最佳…

使用pycharm将自己项目代码上传github(保姆教程)

1、梳理一下Git、github和gitee这三个之间的关系: 1.1、Github 首先从我们最熟悉的github来说,他其实是一个代码托管平台,我们可以在他的里面新建很多的仓库,有强迫症的我理解就是一个仓库是一个自己的项目代码,这些…

基于openCV的项目实战1:信用卡数字识别

目的:识别信用卡卡号; 方法:基于模板匹配; 模板匹配思想:拿4和左边模板进行一一匹配,算一下平方项的差异,恰好4和左边模板中的4差异最小,所以就知道当前的数字是4; 具体步骤: 第一步:找到与你当前非常接近的一个模板; 第二步:把模板中每一个数字单独拿出来,…