使用pytorch 构建一个卷积神经网络

掌握的目标
  • 掌握使用Pytorch 来构建神经网络的基本流程
  • 构建神经网络的实现过程

关于torch.nn
  • Pytorch 中构建神经网络,主要的工具包都在torch.nn中
  • nn 依赖autograd 来定义模型,并对其自动求导

构建网络的基本流程
  1. 定义一个拥有学习参数的神经网络
  2. 遍历训练数据集
  3. 处理输入数据使其流经神经网络
  4. 计算损失值
  5. 将网络参数的梯度进行反向传播
  6. 更新网络权重

卷积神经网络的组成部分

由输入层,卷积神经层,采样层、全连接层及输出层。其中卷积神经网络层、下采样层、全连接层被合称为隐含层。

  1. 卷积层:
    由很多个神经元构成,神经元包含了两个计量单位,一个输入x,一个权值w。输入数据x与权值w相乘得到加权和e ,然后通过激活函数获得神经元的输出。卷积核,是根据网络设置的步长数,对输入的特征进行卷积操作。
  2. 采样层:
    采样层连接在卷积层之后,由多个特征面构成。采样层将卷积神经元的输出数据作为输入的数据,通过去除数据中的无用信息,减少需要处理的数据量,从而提高训练的网络速度。主要功能是通过降低特征图的维度,来减少特征图的个数,达到减少计算的复杂度。
  3. 全连接层:
    至少有一个全连接层,全连接层位于所有卷积层的后面,层与层之间的神经元采用全连接的方式进行连接。该层是正规的神经网络,其主要作用是对卷积层提取出来的特征进一步提取高层次的特征。通过将卷积层的特征进行合并或者取样,提取出其中具有区分性的特征,从而达到分类的目的。在全连接层中,常用softmax 逻辑回归来进行分类识别图像。softmax 逻辑回归分类方法主要用于多分类问题。在构建分类器的过程中,一般还采用正则化方法来防止训练过拟合,提高分类的性能。

  • 定义一个Pytorch 实现的神经网络
import torch
import torch.nn as nn
import torch.nn.functional as F

#定义三层网络,两层神经网络
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        #第一层卷积神经网络
        #输入通道定义= 1 ,输出通道维度 6 卷积核大小3*3
        self.conv1 = nn.Conv2d(1,6,3)
        #定义第二层卷积神经网络
        #输入通道维度=6 ,输出通道维度=16 ,卷积核大小3*3
        self.conv2 = nn.Conv2d(6,16,3)

        #定义三层全连接层,卷积神经网络中至少有一个全连接层,是将卷积层
        self.fc1 = nn.Linear(16*3*3,120) #第一层的核大小是前一层卷积层的输出核大小16*,120是隐变量大小,
        self.fc2 = nn.Linear(120,84)
        self.fc3 = nn.Linear(84,10) #10 分类

    def forward(self,x):
        #卷积层 后面加激活层核池化层
        x = F.max_pool2d(F.relu(self.conv1(x)),(2,2,))#(2.2)池化层
        x = F.max_pool2d(F.relu(self.conv2(x)),(2.2))

        #经过卷积层的处理后,张量需要调整,进入前需要调整张量的形状
        x = x.view(-1,self.num_flat_features(x)) #这里直接写下面方法也可以
        # x = x.view(-1,16 * 3 * 3)
        # 激活层
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x
    def num_flat_features(self,x):
        #除了第0 维度的batch_size
        size = x.size()[1:]
        print(size)
        num_features = 1
        for s in size:
            num_features *= s
        return num_features

if __name__ == '__main__':
    net = Net()
    print(net)

输出结果

Net(
  (conv1): Conv2d(1, 6, kernel_size=(3, 3), stride=(1, 1))
  (conv2): Conv2d(6, 16, kernel_size=(3, 3), stride=(1, 1))
  (fc1): Linear(in_features=144, out_features=120, bias=True)
  (fc2): Linear(in_features=120, out_features=84, bias=True)
  (fc3): Linear(in_features=84, out_features=10, bias=True)
)
  • 注意
    -- 模型的一些可训练参数,可以通过net.parameters() 来获得。
params = list(net.parameters())
print(len(params))
print(params[0].size())
  • torch.nn 构建的神经网络只支持mini-batches 的输入,不支持单一样本的输入。
  • nn.Conv2d 需要一个4D Tensor ,需要调用unsqueeze(0) ,将3DTensor 扩充为4D。

补充

损失函数
  • 损失函数的输入是一个输入的pair(output,target),可以理解成对出现的,然后计算一个数值来评估output 和 tareget 之间的差距大小。
  • torch 中由若干个不同的损失函数可供使用,nn.MSELoss 是利用计算均方差损失来评估输入和目标值之间的差距。
output = net(input)
loss = nn.MSELoss (output,target)
反向传播
  • 使用很简单,操作就是loss.backward().
  • 在执行反向传播之前,要将梯度清零,否则梯度会在不同的批次数据之间被累加
net.zero_grad()

loss.backward()
更新网络参数
  • 更新网络参数算法比较简单就是SGD(随机梯度下降)
  • weight = weight - learning_rate * gradient
learning_rate = 0.01
for p in net.parameters():
      p.data_sub_(p.grad.data * learning_rate)

使用Pytorch 官方推荐代码

# 首先导入优化器的包, optim中包含若干常用的优化算法, 比如SGD, Adam等
import torch.optim as optim

# 通过optim创建优化器对象
optimizer = optim.SGD(net.parameters(), lr=0.01)

# 将优化器执行梯度清零的操作
optimizer.zero_grad()

output = net(input)
loss = criterion(output, target)

# 对损失值执行反向传播的操作
loss.backward()
# 参数的更新通过一行标准代码来执行
optimizer.step()

总结

  • 学习了构建神经网络的典型流程
  • 学习了损失函数的定义
    -- torch.nn.MSEloss() 计算均方差
  • 学习了反向传播的计算方法
    -- 反向传播前,梯度清零,
    -- 操作是 loss.backward()。
  • 学习了参数的更新方法
    -- 定义优化器来执行参数的优化与更新。
    -- 通过优化器来执行具体的参数更新
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容