#torchvision包的主要功能是实现数据的处理、导入和预览等, # 所以如果需要对计算机视觉的相关问题进行处理, # 就可以借用在torchvision包中提供的大量的类来完成相应的工作 import torch # torchvision包的主要功能是实现数据的处理,导入和预览等 import torchvision from torchvision import datasets from torchvision import transforms from torch.autograd import Variable from collections import OrderedDict #orderdict有序字典 模型中使用 #如果获取的数据是格式或者大小不一的图片,则还需要进行归一化和大小缩放等操作 #transforms中提供了丰富的类对载入的数据进行变换,其中有很大一部分可以用于实现数据增强(Data Argumentation) #Compose类看作是一种容器,它能够同时对多种数据变换进行组合 #传入的参数是一个列表,列表中的元素就是对载入的数据进行的各种变换操作。 transform = transforms.Compose([transforms.ToTensor(),#类型的转换变化 transforms.Normalize(mean=[0.5,0.5,0.5],#数据标准化变换 #标准差变换法方法需要使用原始数据的均值(Mean)和标准差(Standard Deviation)来进行数据的标准化, # 在经过标准化变换之后,数据全部符合均值为0,标准差为1的标准正态分布, std=[0.5,0.5,0.5])]) #transforms中常用的数据变换操作 #1 Resize #用于对载入的图片数据按我们需求的大小进行缩放,参数可以是一个整型数据,也可以是一个类似于(h ,w )的序列 #2 Scale #用于对载入的图片数据按我们需求的大小进行缩放 #3 CenterCrop #用于对载入的图片以图片中心为参考点,按我们需要的大小进行裁剪。 # 传递给这个类的参数可以是一个整型数据,也可以是一个类似于(h ,w )的序列。 #4 RandomCrop # 用于对载入的图片按我们需要的大小进行随机裁剪。 # 传递给这个类的参数可以是一个整型数据,也可以是一个类似于(h ,w )的序列 #5 RandomHorizontalFlip # 用于对载入的图片按随机概率(默认值0.5)进行水平翻转 #6 RandomVerticalFlip #用于对载入的图片按随机概率(默认值0.5)进行垂直翻转 #7 ToTensor #对载入的图片数据进行类型转换,将之前构成PIL图片的数据转换成Tensor数据类型的变量 #8 ToPILImage #将Tensor变量的数据转换成PIL图片数据,以方便图片内容的显示 #模型搭建和参数优化 # 在顺利完成数据装载后,我们可以开始编写卷积神经网络模型的搭建和参数优化的代码 #卷积层使用torch.nn.Conv2d类来搭建 # 激活层使用torch.nn.ReLU 类方法来搭建 # 池化层使用torch.nn.MaxPool2d类方法来搭建 # 全连接层使用 torch.nn.Linear 类方法来搭建 class Model(torch.nn.Module): def __init__(self): super(Model, self).__init__() self.conv1 = torch.nn.Sequential( #使用了两个卷积层:一个最大池化层和两个全连接层 #Conv2d 输入参数有输入通道数、输出通道数、卷积核大小、卷积核移动步长和Paddingde值。 #输入通道数的数据类型是整型,用于确定输入数据的层数; #输出通道数的数据类型也是整型,用于确定输出数据的层数; #卷积核大小的数据类型是整型,用于确定卷积核的大小; #卷积核移动步长的数据类型是整型,用于确定卷积核每次滑动的步长; #Paddingde 的数据类型是整型,值为0时表示不进行边界像素的填充, # Paddingde 如果值大于0,那么增加数字所对应的边界像素层数。 torch.nn.Conv2d(1, 64, kernel_size=3, stride=1, padding=1), torch.nn.ReLU(), torch.nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1), torch.nn.ReLU(), #最大池化层,主要的输入参数是池化窗口大小、池化窗口移动步长和Padding的值。 torch.nn.MaxPool2d(stride=2, kernel_size=2)) self.dense = torch.nn.Sequential( torch.nn.Linear(14 * 14 * 128, 1024), torch.nn.ReLU(), #Dropout类用于防止卷积神经网络在训练的过程中发生过拟合 #其工作原理简单来说就是在模型训练的过程中,以一定的随机概率将卷积神经网络模型的部分参数归零, # 以达到减少相邻两层神经连接的目的。 torch.nn.Dropout(p=0.5), torch.nn.Linear(1024, 10) ) def forward(self, x): x = self.conv1(x) #参数实现扁平化 #如果不进行扁平化,则全连接层的实际输出的参数维度和其定义输入的维度将不匹配,程序将会报错 x = x.view(-1, 14 * 14 * 128) #通过self.dense定义的全连接层进行最后的分类。 x = self.dense(x) return x
模型搭建和参数优化
最新推荐文章于 2024-08-14 17:18:35 发布