Tensor

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

import torch as t#import A as B,给予A库一个B的别称,帮助记忆

#构建5*3矩阵,只是分配了空间,未初始化
x=t.Tensor(5,3)
print(x)
print(x.size())#查看x的形状
print(x.size()[0],x.size(1))#查看列的个数,两种写法等价
print(t.Size([4,5])) #使用[0,1]均匀分布随机初始化二维数组
y=t.rand(5,3)
print(y) #加法的三种写法
print(x+y)
print(t.add(x,y))
#指定加法结果的输出目标未result
result=t.Tensor(5,3)#预先分配空间
t.add(x,y,out=result)#输入到result
print(result)

函数名后面带下划线_的函数会修改Tensor本身。例如,x.add_(y)和x.t_()会改变x,但x.add(y)和x.t()会返回一个新的Tensor,且x不变

Tenor与numpt极为相似,Tensor和numpy的数组见的互操作非常容易且快速,Tensor不支持的操作可先转为numpy数组处理,之后再转回Tensor。

a=t.ones(5)
print(a) b=a.numpy()
print(b) c=np.ones(5)
d=t.from_numpy(c)#Numpy->Tensor
print(c)
print(d)
#Tensor和Numpy共享内存,其中一个改变另一个也会随之改变
d.add_(1)
print(c)
print(d)

Tensor可通过.cuda方法转为GPU的Tensor,从而享受GPU的加速

x=t.rand(3,5)
y=t.ones(3,5) print(t.cuda.is_available()) if t.cuda.is_available():
x=x.cuda()
y=y.cuda()
z=x+y
print(z)

 Autograd:自动微分

深度学习的算法本质是通过反向传播求导数,Autograd模块实现了此功能,在Tensor上的所有操作,Autograd都能为他们自动提供微分,避免手动计算导数。

autograd.Variable是Autograd的核心类,它封装了Tensor,并支持几乎所有Tensor的操作。Tensor在被封装为Variable之后,可以调用它的.backward实现反向传播,计算所有梯度。

Variable主要包含三个属性。

data:保存Variable所包含的Tensor。

grad:保存data对应的梯度,grad也是个Variable,而不是Tensor,它和data的形状一样。

grad_fn:指向一个Function对象,这个Function用来反向传播计算输入的梯度。

注意:grad在反向传播过程中是累加的,意味着每次运行反向传播,梯度都回累加之前的梯度,所以反向传播前需把梯度清零。

from torch.autograd import Variable

#使用Tensor新建一个Variable

x=Variable(t.ones(2,2),requires_grad=True)
print(x) y=x.sum()
print(y)
print(y.grad_fn) y.backward()#反向传播,计算梯度
print(x.grad) y.backward()
print(x.grad) #梯度清零
x.grad.data.zero_()
print(x.grad)

Variable和Tensor有几乎一致的接口,在实际使用中可以无缝切换

x=Variable(t.ones(4,5))

y=t.cos(x)#返回元素的余弦

print(y)

x_tensor_cos=t.cos(x.data)

print(x_tensor_cos)

pytorch构建神经网络

torch.nn是专门为神经网络设计的模块化接口。nn构建于Autograd之上,可用来定义和运行神经网络。nn.Module是nn中最重要的类,包含网络各层定义及forward方法,调用forward(input)方法,可返回前向传播的结果。

1.定义网络:

  定义网络时,需要继承nn.Module,并实现它的forward方法,把网络中具有可学习参数的层放在构造函数__init__()中。如果某一层不具有可学习参数,则既可以放在构造函数中,也可不放。

import torch.nn as nn
import torch.nn.functional as F class Net(nn.Module):
def __init__(self):
# nn.Module子类的函数必须在构造函数中执行父类的构造函数
# 下式等价于nn.Module.__init__(self)
super().__init__()
# 卷积层'1'表示输入图片为单通道,'6'表示输出通道数
# '5'表示卷积核为5*5
     #卷积核为2维
self.conv1 = nn.Conv2d(1, 6, 5) self.conv2 = nn.Conv2d(6, 16, 5)
# 仿射层/全连接层,y=Wx+b
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10) def forward(self, x):
#卷积->激活->池化
x=F.max_pool2d(F.relu(self.conv1(x)),(2,2))
x=F.max_pool2d(F.relu(self.conv1(x)),2)
#reshpe,'-1'表示自适应
x=x.view(x.size()[0],-1)
x=F.relu(self.fc1(x))
x=F.relu(self.fc2(x))
x=self.fc3
return x net=Net()
print(net)

只要在nn.module的子类中定义了forward函数,backward函数就会被自动实现(利用Autograd)。在forward函数中可使用任何Variable支持的函数,还可以使用if、for循环、print、log等Python语法

网络的可学习参数通过net.parameters()返回,net.named_parameters可同时返回可学习的参数及名称。

1.

Pytorch_01 Tensor,Autograd,构建网络的更多相关文章

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

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

  2. L0 torch 构建网络初步

    L0 pytorch 构建简单网络 本文是L0, 目的是把pytorch构建感知器的程序,仔细剖析理解. import torch from torch import nn torch.__versi ...

  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全连接ReLU网络

    PyTorch全连接ReLU网络 1.PyTorch的核心是两个主要特征: 一个n维张量,类似于numpy,但可以在GPU上运行 搭建和训练神经网络时的自动微分/求导机制 本文将使用全连接的ReLU网 ...

  8. 第二十一节,使用TensorFlow实现LSTM和GRU网络

    本节主要介绍在TensorFlow中实现LSTM以及GRU网络. 一 LSTM网络 Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息 ...

  9. pytorch构建自己设计的层

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

随机推荐

  1. table动态增加删除

    基于网上代码修改实现动态添加表数据行 <!DOCTYPE html> <html lang="cn"> <html> <head> ...

  2. WMI tester

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. MySQL Error--Got error 28 from storage engine

    问题描述执行查询或SHOW命令,返回错误信息:Got error 28 from storage engine 问题原因临时文件所在磁盘空间已满 解决办法1.使用df -lh查看磁盘空间使用情况;2. ...

  4. 2018-2019-2 网络对抗技术 20165308 Exp4 恶意代码分析

    2018-2019-2 网络对抗技术 20165308 Exp4 恶意代码分析 实验过程 一.系统运行监控 (1)使用如计划任务,每隔一分钟记录自己的电脑有哪些程序在联网,连接的外部IP是哪里.运行一 ...

  5. Mysql 一个表中的数据插入另一个表中

    两张表的字段一致,并且插入全部数据 INSERT INTO  目标表  SELECT  * FROM  来源表 ; 例如,要将 articles 表插入到 newArticles 表中,则可以通过如下 ...

  6. IPv6学习笔记

    IPv6简写规范: 1)  每个IPv6地址段起始的0可以被省略: 2)  如果一段为4个零,可以简写为一个0 3)  如果有连续的多个段全为0,则可以使用::表示 注:一个地址段中只能有一个::出现 ...

  7. 删除DataTable的指定行(Lambda)

    DataTable dtTcu = GetAllTcuInfoBySdId(sdId); DataTable dtToesm = GetAllToesmBySdId(sdId); foreach (D ...

  8. git中加入中文时,乱码

    原因:编码问题,可以看到txt转为为ANSI编码 ---->将编码方式改为UTF-8即可

  9. c#单例设计模式

    class Person { private static Person persons; public static Person Persons { get{ if (persons==null) ...

  10. jumpservice使用465端口发送邮件

    阿里云.华为云等云服务器默认屏蔽掉了25端口后,内网服务器如何通过跳板机发送邮件到外网邮箱. 如果是可联网的阿里云机器,可以直接配置mailx使用465端口发送邮件.需要进行ssl验证配置. Cent ...