Torch 自称为神经网络界的 Numpy, 因为他能将 torch 产生的 tensor 放在 GPU 中加速运算 (前提是你有合适的 GPU), 就像 Numpy 会把 array 放在 CPU 中加速运算。
import torch
import numpy as np
np_data = np.arange(6).reshape((2, 3))
# numpy转换为torch
torch_data = torch.from_numpy(np_data)
# torch转换为numpy
tensor2array = torch_data.numpy()
print(
'\nnumpy', np_data,
'\ntorch', torch_data,
'\ntensor2array', tensor2array,
)
# 运算符号
# abs
data = [-1, -2, 1, 2]
tensor = torch.FloatTensor(data) # 32bit
print(
'\nabs',
'\nnumpy:', np.abs(data),
'\ntorch:', torch.abs(tensor),
)
# sin
print(
'\nsin',
'\nnumpy:', np.sin(data),
'\ntorch:', torch.sin(tensor),
)
# mean平均值
print(
'\nmean',
'\nnumpy:', np.mean(data),
'\ntorch:', torch.mean(tensor),
)
# 矩阵运算
data_t = [[1, 2], [3, 4]]
tensor_t = torch.FloatTensor(data_t)
print(
'\n矩阵相乘',
'\nnumpy:', np.matmul(data_t, data_t),
'\ntorch:', torch.mm(tensor_t, tensor_t),
)
在 Torch 中的 Variable 就是一个存放会变化的值的地理位置. 里面的值会不停的变化;如果用一个 Variable 进行计算, 那返回的也是一个同类型的 Variable
import torch
from torch.autograd import Variable
tensor = torch.FloatTensor([[1, 2], [3, 4]])
# requires_grad是参不参与误差反向传播, 要不要计算梯度
variable = Variable(tensor, requires_grad=True)
print(tensor)
print(variable)
Variable 计算时, 它在背景幕布后面一步步默默地搭建着一个庞大的系统, 叫做计算图, computational graph。
将所有的计算步骤 (节点) 都连接起来, 最后进行误差反向传递的时候, 一次性将所有 variable 里面的修改幅度 (梯度) 都计算出来, 而 tensor 则不行。
v_out = torch.mean(variable*variable)
就是在计算图中添加的一个计算步骤
eg.
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 的梯度
'''
0.5000 1.0000
1.5000 2.0000
'''
在运用时需要转换为tensor或numpy形式
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.]]
"""