一、torch.nn
pytorch有很多接口,其中的torch.nn可以让我们方便的调用以便生成神经网络各层
1.torch.nn.Module
是一个构成神经网络层的一个基本类别,一般生成一个类别来继承nn.module
torch.tensor(a)将a初始化为一个tensor类型数据
一般这种已经固定写好的类别调用其中方法时可直接对生成的类别对象传参
二、卷积操作
1.基本概念
为使图片的维度不进行压缩,出现了卷积神经网络
卷积神经网络在神经网络的基础上增加了卷积层和池化层
卷积层数据与滤波器(卷积核)之间的运算相当于神经网络中数据与权重之间的运算
卷积核相当于权重
偏置(bias):
填充(padding):
在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如0等),这称为填充
填充默认值为0,填充是为了调整输出的大小
步幅(stride):
应用滤波器的位置间隔称为步幅(stride)。增大步幅后,输出大小会变小。而增大填充后,输出大小会变大.这里,假设输入大小为(H, W),滤波器大小为(FH, FW),输出大小为 (OH, OW),填充为P,步幅为S。此时,输出大小可进行计算:
2.利用代码进行卷积操作
步骤:
生成tensor型的输入数据和卷积核:
此时input (5,5) weight(3,3)都是二维
我们要用到的卷积函数 torch.nn.functional.conv2d
所以要将input和weight都转化为4维,说明选取的数据个数,通道数,高,宽
调用函数输出:
2.构建一个卷积层
获取数据集,并使用dataloader读取数据
构建卷积层及前向操作
卷积层要求输入通道为3,输出通道为6,卷积核为3*3
实例化层对象,调用卷积层,实现输入转输出
使用tensorboard进行可视化:
由于out图片通道数过高无法使用add_image,使用torch.reshape将其维度做出改变
高和宽不变,将其通道数变为3,使用占位符-1,让计算机自行计算剩余像素位
可看vgg16模型
注:
torch.nn里面的Conv2d类和torch.nn.functional里的conv2d方法要进行一个区分
两个东西所要 设置的参数不同,用法也不同
要在类里设置一个卷积层一般使用的是Conv2d类
单纯为了完成一个卷积操作可以只调用方法
三、池化层
1.基本概念
池化是缩小高,长空间上的运算
池化是为了在保留数据特征的同时,缩小数据量
一般选用最大池化,池化也会有个池化核,池化核的窗口大小一般与步幅相同
池化只在窗口内选取数据,不做其他操作,不改变通道数
最常用的池化类:torch.nn.MaxPool2d
MaxPool2d — PyTorch 2.4 documentation
一般只设置第一个参数
关于ceil_mode:这个参数的设计是关于如何处理剩余数据,当池化窗口无法填满时,已填的数据称为剩余数据
2.构建一个池化层
获取数据集,从数据集中选取数据
书写池化层类及其方法
实例化池化层对象,使用tensorboard将数据可视化
非线性变换的主要目的是给神经网络赋予更多非线性特征,非线性特征越多越能训练出符合各种曲线的模型
四、非线性激活层
1.ReLu函数
特征:输入大于0,则照常输出;输入小于0则输出0
只有一个参数inplace,将这个参数设置为Ture则新值取代旧值;设置为False则生成一个新元素
2.sigmoid函数
获取图片数据集,使用sigmoid函数对其进行非线性变换
五、线性层
模型经过前期的变换最后一般会进行一些线性变换,旨在将多数的输入通过变换为少数的输出
即1x1x4096-->1x1x1000这段
线性变换要求输入的每个数据特征都是一维的可以输入多个,但每个数据都是独立的一维
这就要将前面的多维数据排列压缩为一维,使用torch.flatten方法
获取数据:
创建线性层:
要将每一批数据进行线性运算,首先使用torch.flatten将数据的维度变为一维,再对变换后的数据进行线性运算要将每一批数据进行线性运算
输入的特征长度是由将多维度数据变换为一维数据变换而来
对每批数据的维度进行比较:
比较三种:初始多维度数据,压缩后的一维数据,线性变换后的一维数据
六、构造CIFAR10模型
CIFAR10中每个图片维度为 (3,32,32)
该模型中有三个卷积层,三个池化层,一个flatten层,两个线性层
数据在卷积过后H和W无变化,需合理设计padding,根据公式将padding=2,stride=1
方法1:分开写每一层,分别调用
方法2:将所有的层都利用sequential放入一个模型中,直接使用模型
生成一个类似数据集的数据对模型进行验证
64是因为输入了64个数据