模型搭建和参数优化

#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





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值