L0 pytorch 构建简单网络

本文是L0, 目的是把pytorch构建感知器的程序,仔细剖析理解。

  1. import torch
  2. from torch import nn
  1. torch.__version__
  1. '1.3.0'

STEP 1 手工定义全连接层Linear

  1. #torch.nn是专门为深度学习设计的模块。torch.nn的核心数据结构是Module
  2. #它是一个抽象的概念,#既可以表示神经网络中的某个层(layer),
  3. #也可以表示一个包含很多层的神经网络
  4. #class Linear(nn.Module):
  5. # def __init__(self,in_dim,out_dim):
  6. # def forward(self,x):
  7. # 手工定义全连接层,写forward
  8. class Linear(nn.Module):
  9. def __init__(self,in_dim,out_dim):
  10. super(Linear,self).__init__()
  11. #调用nn.Moudule 的初始化函数,首先找到Linear的父类nn.Moudle
  12. #然后把类Linear的对象self转换为类nn.Moudle的对象,然后“被转换”的类nn.Moudle对象调用自己的__init__函数
  13. #也可以写成nn.Module.__init__(self)
  14. #在构造函数__init__中必须自己定义可学习的参数,并封装成Parameter
  15. # parameter是一种特殊的Variable,但其默认需要求导(requires_grad = True)
  16. self.w = nn.Parameter(torch.randn(in_dim,out_dim))
  17. self.b = nn.Parameter(torch.randn(out_dim))
  18. def forward(self ,x):
  19. x=x.matmul(self.w) #使用Tensor.matmul 实现w*x矩阵相乘
  20. y=x+self.b.expand_as(x) #即 y=wx + b 使用Tensor.expand_as 保证x 和b形状一致
  21. print("调式点1:y的输出维度为",y.shape) #测试x的维度
  22. return y

STEP2 测试Linear 层是否能正常工作

  1. # 初始化 Linear层结构为 4*3
  2. layer = Linear(4, 3)
  1. # 测试喂数据,是否有输出,理解输入输出的维度
  2. #from torch.autograd import Variable as V
  3. #input = V(torch.randn(2, 4))
  4. input = torch.randn(2,4)#输入为二行样本,每行4个特征
  5. output = layer(input) #模型每次输入4个特征,输出3个值。
  6. print(output) # 二行样本,输出2个3维的结果,因此y的输入维度为 torch.size([2,3])
  1. 调式点1y的输出维度为 torch.Size([2, 3])
  2. tensor([[-1.2798, -1.4936, 0.2399],
  3. [-1.1742, 1.2190, -2.8469]], grad_fn=<AddBackward0>)

理解

input = torch.randn(2,4)

output = layer(input)

1) 定义layer对输入形状都有假设:输入的不是单行样本数据,而是一个batch。此处batch的大小为2

2)若想输入单行样本数据 必须调用unsqueeze(0)函数将数据伪装成batch_size=1的batch。

  1. # 原数据2*4,为batch为2,每batch数据为4维
  2. #通过unsqueeze 将2*4的数据伪装成 1*2*4的数据,batch变成1,每个batch数据变成2*4
  3. input = torch.randn(2,4)
  4. input.unsqueeze(0).size()
  1. torch.Size([1, 2, 4])

  1. # 测试目前网络的参数,理解参数的维度
  2. for name, param in layer.named_parameters():
  3. print(name)
  4. print(param)
  5. #w 维度为4*3 b的维度为1*3
  1. w
  2. Parameter containing:
  3. tensor([[-0.3579, -0.6608, 0.1783],
  4. [ 1.6277, -0.4486, -1.9849],
  5. [ 0.9500, -0.1879, 1.7154],
  6. [-0.5778, -0.2012, 1.5576]], requires_grad=True)
  7. b
  8. Parameter containing:
  9. tensor([-0.9491, -0.1104, -1.2390], requires_grad=True)
  1. for name, param in layer.named_parameters():
  2. print(name, param.size())
  1. w torch.Size([4, 3])
  2. b torch.Size([3])

module中parameter的命名规范:

1)对于类似self.param_name = nn.Parameter(t.randn(3, 4)),命名为param_name

2)对于子Module中的parameter,会其名字之前加上当前Module的名字。

如对于self.sub_module = SubModel(),SubModel中有个parameter的名字叫做param_name,

那么二者拼接而成的parameter name 就是sub_module.param_name。

见后续采用Linear类进一步构建多层感知器的例子

STEP3 组建 二个全连接层的感知器

  1. class Perceptron (nn.Module):
  2. def __init__(self, in_features, hidden_features, out_features):
  3. super(Perceptron,self).__init__() #或写成nn.Module.__init__(self)
  4. # 利用 Linear subModel组建 layer 1 ,layer 2
  5. self.layer1 = Linear(in_features, hidden_features)
  6. self.layer2 = Linear(hidden_features, out_features)
  7. def forward(self, x):
  8. x = self.layer1(x)
  9. x = torch.sigmoid(x)
  10. x = self.layer2(x)
  11. y = torch.sigmoid(x)
  12. return y
  13. per = Perceptron(3, 4, 1)
  1. per
  1. Perceptron(
  2. (layer1): Linear()
  3. (layer2): Linear()
  4. )
  1. # 测试网络参数
  2. for name, param in per.named_parameters():
  3. print("sub_module.param_name::",name, param.size())
  1. sub_module.param_name:: layer1.w torch.Size([3, 4])
  2. sub_module.param_name:: layer1.b torch.Size([4])
  3. sub_module.param_name:: layer2.w torch.Size([4, 1])
  4. sub_module.param_name:: layer2.b torch.Size([1])

1)Module中的可学习参数可以通过**named_parameters()**或者parameters()返回迭代器,前者会给每个parameter都附上名字,使其更具有辨识度。

2)Module能够自动检测到自己的Parameter,并将其作为学习参数。

  1. # 测试网络输入,输出
  2. data=torch.randn(4,3)
  3. output=per(data)
  4. output
  1. 调式点1y的输出维度为 torch.Size([4, 4])
  2. 调式点1y的输出维度为 torch.Size([4, 1])
  3. tensor([[0.5478],
  4. [0.6146],
  5. [0.6252],
  6. [0.8016]], grad_fn=<SigmoidBackward>)

STEP 4 利用nn.Sequential 快速搭建网络

从上面的例子,可以看出在forward()方法中必须理解网络结构,并根据网络层次的之间的关系完成网络组装。

当模型仅仅是简单的前馈网络时,可以采用nn.Sequentail()模块来快速搭建模块,而不必手动的在forward()方法手工构建。

  1. class Seq_Perceptron (nn.Module):
  2. def __init__(self, in_features, hidden_features, out_features):
  3. super(Seq_Perceptron ,self).__init__() #或写成nn.Module.__init__(self)
  4. # 利用 Linear subModel组建 layer 1 ,layer 2
  5. #self.layer1 = Linear(in_features, hidden_features)
  6. #self.layer2 = Linear(hidden_features, out_features)
  7. self.seq_layer = nn.Sequential(
  8. nn.Linear(in_features,hidden_features),
  9. nn.Sigmoid(),
  10. nn.Linear(hidden_features,out_features),
  11. nn.Sigmoid()
  12. )
  13. def forward(self, x):
  14. y = self.seq_layer(x)
  15. return y
  1. # 测试网络输入,输出
  2. per = Seq_Perceptron(3, 4, 1)
  3. data=torch.randn(4,3)
  4. output=per(data)
  5. output
  1. tensor([[0.5853],
  2. [0.6061],
  3. [0.5967],
  4. [0.6131]], grad_fn=<SigmoidBackward>)

L0 torch 构建网络初步的更多相关文章

  1. Docker 构建网络服务后本机不能访问

    Docker 构建网络服务后本机不能访问 起因 使用tornado构建了一个服务,测试都没有问题 使用docker构建镜像,使用docker run image_name启动服务 使用浏览器访问 12 ...

  2. Pytorch_01 Tensor,Autograd,构建网络

    Tensor Tensor是PyTorch中的重要数据结构,可认为是一个高维数组,Tensor与numpy的ndarrays类似,但Tensor可以使用GPU加速 import torch as t# ...

  3. 利用sfc文件构建网络渗透

      收集哈希 SCF(Shell命令文件)文件可用于执行一组有限的操作,例如显示Windows桌面或打开Windows资源管理器,这并不是什么新鲜事.然而,一个SCF文件可以用来访问一个特定的UNC路 ...

  4. keras 学习笔记:从头开始构建网络处理 mnist

    全文参考 < 基于 python 的深度学习实战> import numpy as np from keras.datasets import mnist from keras.model ...

  5. WGCNA构建基因共表达网络详细教程

    这篇文章更多的是对于混乱的中文资源的梳理,并补充了一些没有提到的重要参数,希望大家不会踩坑. 1. 简介 1.1 背景 WGCNA(weighted gene co-expression networ ...

  6. 数据挖掘入门系列教程(十二)之使用keras构建CNN网络识别CIFAR10

    简介 在上一篇博客:数据挖掘入门系列教程(十一点五)之CNN网络介绍中,介绍了CNN的工作原理和工作流程,在这一篇博客,将具体的使用代码来说明如何使用keras构建一个CNN网络来对CIFAR-10数 ...

  7. pytorch构建自己设计的层

    下面是如何自己构建一个层,分为包含自动反向求导和手动反向求导两种方式,后面会分别构建网络,对比一下结果对不对. -------------------------------------------- ...

  8. GAN初步——本质上就是在做优化,对于生成器传给辨别器的生成图片,生成器希望辨别器打上标签 1,体现在loss上!

    from:https://www.sohu.com/a/159976204_717210 GAN 从 2014 年诞生以来发展的是相当火热,比较著名的 GAN 的应用有 Pix2Pix.CycleGA ...

  9. Pytorch torch.optim优化器个性化使用

    一.简化前馈网络LeNet 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 im ...

随机推荐

  1. mysql存储过程简单用法

    show procedure status 查看所有存储过程 <!--  简单存储过程  --> 先将结束符改成// delimiter // create procedure query ...

  2. 前端html学习笔记

    一 HTML介绍 1. Web服务的本质 import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080)) sk.li ...

  3. hdu1078 dfs+dp(记忆化搜索)搜索一条递增路径,路径和最大,起点是(0,0)

    #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty ...

  4. Matplotlib 精简实例入门

    Matplotlob 简明实例入门 通过几个实例,快速了解matplotlib.pyplot 中最为常见的折线图,散点图,柱状图,直方图,饼图的用法 如果您需要更为详细的内容,请参考官方文档: htt ...

  5. Java编程思想学习杂记(1-4章)

    程序流程控制 移位运算符 移位运算符面向的运算对象是二进制的位,可单独用它们处理整数类型.左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)." ...

  6. Hadoop调度器

    一.FIFO调度器(先进先出调度) 上图为FIFO调度器的执行过程示意图.FIFO Scheduler是最简单也是最容易理解的调度器,它缺点是不适用于共享集群.大的应用可能会占用所有集群资源,这就导致 ...

  7. Linux常用命令 - cat命令详解

    21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 获取t ...

  8. iOS 继承

    是否使用继承需要考虑三个点: 父类只是给子类提供服务,并不涉及子类的业务逻辑 层级关系明显,功能划分清晰,父类和子类各做各的. 父类的所有变化,都需要在子类中体现,也就是说此时耦合已经成为需求 万不得 ...

  9. [POJ1190]生日蛋糕<DFS>

    题目链接:http://poj.org/problem?id=1190 题看上去确实很复杂 涉及到半径面积这些,其实看着真的很头疼 但是除去这些就是剪枝优化的dfs算法 #include<cst ...

  10. pre-commit + imagemin 实现图片自动压缩

    我们日常开发的前端项目中,图片资源会占到项目资源的很大比例,因此在考虑到性能优化,页面加载速度的时候,如何更好地处理图片就非常重要了. 首先我们可以想到的方案是:使用webpack的image-web ...