总结一下相关概念:

  • torch.Tensor - 一个近似多维数组的数据结构
  • autograd.Variable - 改变Tensor并且记录下来操作的历史记录。和Tensor拥有相同的API,以及backward()的一些API。同时包含着和张量相关的梯度
  • nn.Module - 神经网络模块,便捷的数据封装,能够将运算移往GPU,还包括一些输入输出的东西
  • nn.Parameter - 一种变量(Variable),当将任何值赋予Module时自动注册为一个参数
  • autograd.Function - 实现了使用自动求导方法的前馈和后馈的定义。每个Variable的操作都会生成至少一个独立的Function节点,与生成了Variable的函数相连之后记录下操作历史

导入库:

# Author : Hellcat
# Time : 2018/2/10 import torch as t
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torch.autograd import Variable

torch.nn:网络层

torch.nn.functional:激活函数、池化函数归于此模块

pytorch中的网络层是class,而tensorflow

print(t.nn.Conv2d)
<class 'torch.nn.modules.conv.Conv2d'>
print(tf.nn.conv2d)
<function conv2d at 0x000001A33CC44510>

网络主体:

net网络要使用class并继承父类才行,因而有一些自带的方法

net.parameters():返回全部的参数值,迭代器

net.named_parameters():返回参数名称和值,迭代器

net.参数名:就是参数变量,Variable,可以直接查看data和grad等等

class Net(nn.Module):
def __init__(self):
# nn.Module子类的函数必须在构造函数中执行父类的构造函数
# 等价于nn.Model.__init__(self)
super(Net,self).__init__() # 输入1通道,输出6通道,卷积核5*5
self.conv1 = nn.Conv2d(1, 6, 5)
# 定义卷积层:输入6张特征图,输出16张特征图,卷积核5x5
self.conv2 = nn.Conv2d(6,16,5)
# 定义全连接层:线性连接(y = Wx + b),16*5*5个节点连接到120个节点上
self.fc1 = nn.Linear(16*5*5,120)
# 定义全连接层:线性连接(y = Wx + b),120个节点连接到84个节点上
self.fc2 = nn.Linear(120,84)
# 定义全连接层:线性连接(y = Wx + b),84个节点连接到10个节点上
self.fc3 = nn.Linear(84,10) # 定义向前传播函数,并自动生成向后传播函数(autograd)
def forward(self,x):
# 输入x->conv1->relu->2x2窗口的最大池化->更新到x
x = F.max_pool2d(F.relu(self.conv1(x)),(2,2))
# 输入x->conv2->relu->2x2窗口的最大池化->更新到x
x = F.max_pool2d(F.relu(self.conv2(x)),2)
# view函数将张量x变形成一维向量形式,总特征数不变,为全连接层做准备
x = x.view(x.size()[0], -1)
# 输入x->fc1->relu,更新到x
x = F.relu(self.fc1(x))
# 输入x->fc2->relu,更新到x
x = F.relu(self.fc2(x))
# 输入x->fc3,更新到x
x = self.fc3(x)
return x if __name__ == "__main__": net = Net()

展示网络参数:

# #########查看参数#########
print(net)
"""
Net(
(conv1): Conv2d (1, 6, kernel_size=(5, 5), stride=(1, 1))
(conv2): Conv2d (6, 16, kernel_size=(5, 5), stride=(1, 1))
(fc1): Linear(in_features=400, out_features=120)
(fc2): Linear(in_features=120, out_features=84)
(fc3): Linear(in_features=84, out_features=10)
)
""" # 返回参数值:顺序和下面的named一致
params = list(net.parameters())
print(len(params))
"""
10
""" # net.named_parameters(): ((参数名称,参数属性),……)
for name, parameters in net.named_parameters():
print(name, ":", parameters.size())
"""
conv1.weight : torch.Size([6, 1, 5, 5])
conv1.bias : torch.Size([6])
conv2.weight : torch.Size([16, 6, 5, 5])
conv2.bias : torch.Size([16])
fc1.weight : torch.Size([120, 400])
fc1.bias : torch.Size([120])
fc2.weight : torch.Size([84, 120])
fc2.bias : torch.Size([84])
fc3.weight : torch.Size([10, 84])
fc3.bias : torch.Size([10])
"""

模拟单次向前&向后传播:

# #########网络传播过程模拟#########
# 输入如果没有batch数,则少一维度,Tensor,unsqueeze()可以为张量扩维
input_ = Variable(t.randn(1, 1, 32, 32))
out = net(input_)
print(out.size())
"""
torch.Size([1, 10])
"""
# net.zero_grad()
# 输出值为10个标量(一个向量),所以需要指定每个标量梯度的权重
# out.backward(t.ones(1,10))

注意: torch.nn 只接受小批量的数据

整个torch.nn包只接受那种小批量样本的数据,而非单个样本。 例如,nn.Conv2d能够结构一个四维的TensornSamples x nChannels x Height x Width。

如果你拿的是单个样本,使用input.unsqueeze(0)来加一个假维度就可以了

维度是[batch,channel,height,width]。

Loss函数构建

 # #########Loss设计#########
target = Variable(t.arange(0,10))
# Loss需要先实例化,然后是callable的实例
loss_fn = nn.MSELoss() # 均方误差
loss = loss_fn(out, target)
print(loss) net.zero_grad()
print("反向传播之前:", net.conv1.bias.grad)
loss.backward()
print("反向传播之后:", net.conv1.bias.grad)

反向传播之前: None

反向传播之后: Variable containing:
        -0.1330
        -0.0888
        -0.0101
        -0.0186
         0.0462
         0.0317
       [torch.FloatTensor of size 6]

优化器构建

# #########优化器设计#########
print(net.parameters())
"""
<generator object Module.parameters at 0x0000021B525BE888>
"""
# 初始化优化器
optimizer = optim.SGD(net.parameters(), lr=0.01) optimizer.zero_grad() # 效果等同net.zero_grad() output = net(input_)
loss = loss_fn(output, target) loss.backward()
print("反向传播之前:", net.conv1.bias.data)
optimizer.step()
print("反向传播之后:", net.conv1.bias.data)

反向传播之前:
    -0.1702
     0.1192
     0.1349
     0.1307
    -0.0141
    -0.0558
  [torch.FloatTensor of size 6]

反向传播之后:
    -0.1689
     0.1201
     0.1350
     0.1309
    -0.0146
    -0.0561
  [torch.FloatTensor of size 6]

『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上的更多相关文章

  1. 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_下

    『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上 # Author : Hellcat # Time : 2018/2/11 import torch as t import t ...

  2. 『MXNet』第四弹_Gluon自定义层

    一.不含参数层 通过继承Block自定义了一个将输入减掉均值的层:CenteredLayer类,并将层的计算放在forward函数里, from mxnet import nd, gluon from ...

  3. 『PyTorch』第三弹重置_Variable对象

    『PyTorch』第三弹_自动求导 torch.autograd.Variable是Autograd的核心类,它封装了Tensor,并整合了反向传播的相关实现 Varibale包含三个属性: data ...

  4. 『TensorFlow』第七弹_保存&载入会话_霸王回马

    首更: 由于TensorFlow的奇怪形式,所以载入保存的是sess,把会话中当前激活的变量保存下来,所以必须保证(其他网络也要求这个)保存网络和载入网络的结构一致,且变量名称必须一致,这是caffe ...

  5. 关于『进击的Markdown』:第四弹

    关于『进击的Markdown』:第四弹 建议缩放90%食用 美人鱼(Mermaid)悄悄的来,又悄悄的走,挥一挥匕首,不留一个活口 又是漫漫画图路... 女士们先生们,大家好!  我们要接受Markd ...

  6. 关于『HTML』:第三弹

    关于『HTML』:第三弹 建议缩放90%食用 盼望着, 盼望着, 第三弹来了, HTML基础系列完结了!! 一切都像刚睡醒的样子(包括我), 欣欣然张开了眼(我没有) 敬请期待Markdown语法系列 ...

  7. 『PyTorch』第十弹_循环神经网络

    RNN基础: 『cs231n』作业3问题1选讲_通过代码理解RNN&图像标注训练 TensorFlow RNN: 『TensotFlow』基础RNN网络分类问题 『TensotFlow』基础R ...

  8. 『PyTorch』第五弹_深入理解autograd_上:Variable属性方法

    在PyTorch中计算图的特点可总结如下: autograd根据用户对variable的操作构建其计算图.对变量的操作抽象为Function. 对于那些不是任何函数(Function)的输出,由用户创 ...

  9. 『PyTorch』第五弹_深入理解autograd_下:函数扩展&高阶导数

    一.封装新的PyTorch函数 继承Function类 forward:输入Variable->中间计算Tensor->输出Variable backward:均使用Variable 线性 ...

随机推荐

  1. Luncene学习二《搜索索引》

    搜索索引的流程 第一步:创建一个Directory对象,也就是索引库存放的位置 第二步:创建一个IndexReader对象,需要指定Directory对象 第三步:创建一个indexsearcher对 ...

  2. 使用Scapy向Mininet交换机注入流量 实验记录

    使用Scapy向Mininet交换机注入流量 实验记录 用Python脚本及Scapy库写了一个简单的流量生成脚本,并打算使用该脚本往Mininet中的OpenvSwitch交换机注入流量.拓扑图如下 ...

  3. Aviutl 视频处理软件

    素材类:No.009 倒放(Video)         http://www.bilibili.com/video/av3078207/ No.010 倒放(Object)         http ...

  4. PHP变量的值类型和引用类型

    PHP 变量在内存中保存的并不直接是值的内容而是值的地址.比如: $a = 1; 从表面上看起来似乎是 $a 直接存储了 1 这个值.但是实际情况是,PHP 解释器创建了变量 $a , 将值 1 存入 ...

  5. C++ 复习要点、面试常见问题总结

    本文总结一下C++面试时常遇到的问题.C++面试中,主要涉及的考点有: 关键字极其用法,常考的关键字有const, sizeof, typedef, inline, static, extern, n ...

  6. 详解JS中DOM 元素的 attribute 和 property 属性

    一.'表亲戚':attribute和property 为什么称attribute和property为'表亲戚'呢?因为他们既有共同处,也有不同点. attribute 是 dom 元素在文档中作为 h ...

  7. IDEA 的Class not found: "..."Empty test suite

    Junit测试的时候出现  IDEA 的Class not found: "..."Empty test suite问题. 尝试一下解决方法: 第一种方法: 1.modules&g ...

  8. python 移动文件夹

    xxx@ddd:~$ mkdir testa testb >>> import shutil >>> shutil.move("/home/xxx/tes ...

  9. 搭建Nuget服务器

    1.新建一个web网站应用程序 (最好是ASP.NET空Web应用程序) 2.通过NuGet扩展 引用 NuGet.Server包 引用之后的项目结构为 将此网站部署到IIS上,即可访问,既搭建好了 ...

  10. Java SE 枚举的基本用法

    出于对自己基础的稳打,期末考试后依旧对SE部分进行复习 枚举的基本用法 public enum Season { SPRING,SUMMER,AUTUMN,WINTER } public class ...