Torch and Numpy
变量 (Variable)
激励函数
关系拟合(回归)
区分类型 (分类)
快速搭建法
批训练
加速神经网络训练
Optimizer优化器
卷积神经网络 CNN
卷积神经网络(RNN、LSTM)
RNN 循环神经网络 (分类)
RNN 循环神经网络 (回归)
自编码 (Autoencoder)
DQN 强化学习
生成对抗网络 (GAN)
为什么 Torch 是动态的
GPU 加速运算
过拟合 (Overfitting)
批标准化 (Batch Normalization)
什么是Variable
在 Torch
中的 Variable
就是一个存放会变化的值的地理位置。里面的值会不停的变化。
我们定义一个 Variable
:
import torch
from torch.autograd import Variable # torch 中 Variable 模块
# 先生鸡蛋
tensor = torch.FloatTensor([[1,2],[3,4]])
# 把鸡蛋放到篮子里, requires_grad是参不参与误差反向传播, 要不要计算梯度
variable = Variable(tensor, requires_grad=True)
print(tensor)
"""
1 2
3 4
[torch.FloatTensor of size 2x2]
"""
print(variable)
"""
Variable containing:
1 2
3 4
[torch.FloatTensor of size 2x2]
"""
Variable 计算, 梯度
对比一下 tensor
的计算和 variable
的计算
t_out = torch.mean(tensor*tensor) # x^2
v_out = torch.mean(variable*variable) # x^2
print(t_out)
"""
7.5
"""
print(v_out) # 7.5
"""
Variable containing:
7.5000
[torch.FloatTensor of size 1]
"""
Variable
计算时, 它在背景幕布后面一步步默默地搭建着一个庞大的系统, 叫做计算图, computational graph
. 这个图是用来干嘛的? 原来是将所有的计算步骤 (节点) 都连接起来, 最后进行误差反向传递的时候, 一次性将所有 variable
里面的修改幅度 (梯度) 都计算出来, 而 tensor
就没有这个能力啦.
v_out = torch.mean(variable*variable)
就是在计算图中添加的一个计算步骤, 计算误差反向传递的时候有他一份功劳, 我们就来举个例子:
v_out.backward() # 模拟 v_out 的误差反向传递
# 下面两步看不懂没关系, 只要知道 Variable 是计算图的一部分, 可以用来传递误差就好.
# v_out = 1/4 * sum(variable*variable) 这是计算图中的 v_out 计算步骤
# 针对于 v_out 的梯度就是, d(v_out)/d(variable) = 1/4*2*variable = variable/2
print(variable.grad) # 初始 Variable 的梯度
'''
Variable containing:
0.5000 1.0000
1.5000 2.0000
[torch.FloatTensor of size 2x2]
'''
v
o
u
t
=
1
4
∗
s
u
m
(
v
a
r
i
a
b
l
e
2
)
v_{out} =\frac{1}{4}*sum(variable^2)
vout=41∗sum(variable2)
d
(
v
o
u
t
)
d
(
v
a
r
i
a
b
l
e
)
=
1
4
∗
2
∗
v
a
r
i
a
b
l
e
=
1
2
v
a
r
i
a
b
l
e
\frac{d(v_{out})}{d(variable)}=\frac{1}{4}*2*variable=\frac{1}{2}variable
d(variable)d(vout)=41∗2∗variable=21variable
直接print(variable)
只会输出 Variable
形式的数据, 在很多时候是用不了的(比如想要用 plt
画图), 所以我们要转换一下, 将它变成 tensor
形式.
print(variable) # Variable 形式
"""
Variable containing:
1 2
3 4
[torch.FloatTensor of size 2x2]
"""
print(variable.data) # tensor 形式
"""
1 2
3 4
[torch.FloatTensor of size 2x2]
"""
print(variable.data.numpy()) # numpy 形式
"""
[[ 1. 2.]
[ 3. 4.]]
"""
type(v_out)
"""
torch.autograd.variable.Variable
"""
type(v_out.data)
"""
torch.FloatTensor
"""