Pytorch神经网络基础

一、Numpy与Torch转换

1、Torch可以将tensor放入GPU中加速运算,Numpy可以把array放入CPU中加速运算。

矩阵与张量的区别:参考博客

矩阵是二维的数组网格,可以进行数字运算

张量是一个广义矩阵,可以是n-D矩阵,张量的维数叫做它的秩。张量是一个数学实体,它存在于一个结构中并于其他数学实体相互作用。如果以常规的方式转换结构中的其他实体,那么张量必须服从一个相关的变换规则。

2、numpy array与Torch tensor转换
import torch 
import numpy as np

np_data=np.arange(6).reshape((2,3))
#从numpy array转换为 torch tensor
torch_data=torch.from_numpy(np_data)
#从 torch tensor 转化为numpy array
np_data2=torch_data.numpy()
3、Torch中的数学运算

Torch API官网:Torch API
Torch API阅读总结:

二、变量(Variable)

1、Variable简介

torch.autograd.Variable是Autograd的核心类,它封装了Tensor,并整合了反向传播的相关实现。如果用numpy或者Tensor来实现神经网络,需要手动写出前向过程和反向过程。对于简单的网络,反向过程中的导数容易求得,但是随着网络深度以及网络复杂度的增加,求出梯度的解析表达式是非常困难的。PyTorch的包autograd提供了自动求导的功能,当使用autograd时,定义前向网络会生成 一个计算图,每个节点是一个Tensor,边表示由输入Tensor到输出Tensor的函数。沿着计算图的反向传播可以很容易地计算出各个变量的梯度。在实现的时候,用到了Variable对象。Variable对Tensor对象进行封装,只需要Variable::data即可取出Tensor,并且Variable还封装了该Tensor的梯度Variable::grad(是个Variable对象)。现在用Variable作为计算图的节点,则通过反向传播自动求得的导数就保存在Variable对象中了。Variable都有三个属性,Varibale的Tensor本身的.data,对应Tensor的梯度.grad,以及这个Variable是通过什么方式得到的.grad_fn。
如果用Variable计算,返回的也是一个同类型的Variable。
Varibale包含三个属性:
data:存储了Tensor,是本体的数据
grad:保存了data的梯度,本事是个Variable而非Tensor,与data形状一致
grad_fn:指向Function对象,用于反向传播的梯度计算之用

2、定义Variable

先构造张量,再将张量放入Variable中,可以指明需不需要计算梯度,默认为False
requires_grad控制着是否在反向传播过程中对该节点求梯度

>>> import torch
>>> from torch.autograd import Variable
>>> #构造tensor
>>> tensor = torch.FloatTensor([[1,2],[3,4]])
>>> #把tensor放入Variable中
>>> #requires_grad 是要不要参与误差反向传播,要不要计算梯度
>>> variable = Vairable(tensor,requires_grad=True)
>>> vairable=Variable(tensor,requires_grad=True)
>>> tensor
tensor([[1., 2.],
        [3., 4.]])
>>> vairable
tensor([[1., 2.],
        [3., 4.]], requires_grad=True)
>>> 
3、Variable求梯度

Variable计算时,它会逐渐地生成计算图。这个图就是将所有的计算节点都连接起来,最后进行误差反向传递的时候,一次性将所有Variable里面的梯度都计算出来,而tensor就没有这个能力。

>>> import torch
>>> from torch.autograd import Variable
>>> #构建一个y=x^2函数,求x=2的导数
>>> x=Variable(torch.FloatTensor([2]),requires_grad=True)
>>> y=x**2
>>> y.backward()
>>> y
tensor([4.], grad_fn=<PowBackward0>)
>>> x.grad
tensor([4.])
>>> 

Variable在计算时,构建了一个计算图,将所有的计算步骤(节点)连接起来,最后进行误差反向传递的时候,一次性的将所有Variable里面的梯度都计算出来,tensor没有这个计算能力。

4、获取Variable里面的数据

直接print(Variable)只会输出Variable形式的数据,在很多时候是用不了的,要进行转化一下
使用variable.data进行取值

>>> x=Variable(torch.FloatTensor([[1,2],[3,4]]),requires_grad=True)
>>> x.data
tensor([[1., 2.],
        [3., 4.]])
>>> x
tensor([[1., 2.],
        [3., 4.]], requires_grad=True)
>>> x.data.numpy()
array([[1., 2.],
       [3., 4.]], dtype=float32)
5、总结

(1)注意在需要求导的时候 requires_grad是否设置为True,如果未设置为True,函数求导会为“nono”,或者报错
(2)在每次backward后,grad的值是会累加的,在利用BP算法时,每次迭代需要将grad清零:x.grad.data.zero_()
(3)variable默认是不需要被求导的,即requires_grad属性默认为False,如果某一个节点的requires_grad为True,那么所有依赖它的节点requires_grad都为True。
(4)variable的volatile属性默认为False,如果某一个variable的volatile属性被设为True,那么所有依赖它的节点volatile属性都为True。volatile属性为True的节点不会求导,volatile的优先级比requires_grad高。
(5)多次反向传播(多层监督)时,梯度是累加的。一般来说,单次反向传播后,计算图会free掉,也就是反向传播的中间缓存会被清空【这就是动态度的特点】。为进行多次反向传播需指定retain_graph=True来保存这些缓存。

三、激励函数

参考链接:常用激活函数(激励函数)理解与总结
聊一聊深度学习的activation function

1、什么是激活函数

在多层神经网络中,上层节点的输出和下层节点的输入之间的函数关系,成为激活函数。

2、激活函数的用途

如果不用激活函数,每一层节点的输入都是上层输出的线性函数,不管神经网络怎么样,输出都是输入的线性组合,网络的逼近能力有限,因此引入非线性函数作为激励函数,使得神经网络的表达能力更强,不再是输入的线性组合,而是几乎可以逼近任意函数。

常用激活函数形式有:sigmoid,tanh,Relu,Leaky ReLU,ELU

3、应用中如何选择合适的激活函数

这个问题目前没有确定的方法,凭一些经验吧。
1)深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。
2)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout.
3)最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.
ReLU目前仍是最常用的activation function,在搭建人工神经网络的时候推荐优先尝试!
激励函数所在的包:

import torch.nn.functional as F

几种常用的激励函数

x_np = x.data.numpy()   # 换成 numpy array, 出图时用

# 几种常用的 激励函数
y_relu = F.relu(x).data.numpy()
y_sigmoid = F.sigmoid(x).data.numpy()
y_tanh = F.tanh(x).data.numpy()
y_softplus = F.softplus(x).data.numpy()
# y_softmax = F.softmax(x)  softmax 比较特殊, 不能直接显示, 不过他是关于概率的, 用于分类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值