PyTorch是一个:
机器学习框架,简单易学
可以看做是支持GPU计算和自动微分计算的“Numpy”库
支持100多种Tensor常规算子,包括:创建、索引、切片、转置、连接、随机数、形状改变,线性代数、数学计算
Tensor是一个有值有属性的多维数组对象,跟NumPy ndarray对象比,还支持自动微分(.requires_grad)和选择计算硬件(.device)
Tensor是多维数组
PyTorch中的所有CPU上的Tensor除了CharTensor以外,都支持跟 NumPy ndarray类型相互转换
从神经网络角度来看,PyTorch是一个自动微分(autograd)工具包
使用PyTorch构架神经网络,用户只需要定义forward()方法,而backward()无需用户定义,PyTorch框架已经实现了,这就是所谓的自动微分。
可训练的参数,包含在net.parameters()里面
下面的Python源代码是用Numpy来实现一个简单的神经网络,并完成前向计算和反向传播。可以看出用Numpy来编写神经网络的不方便性:没有自动微分功能,需要手动编写微分计算程序
没有支持常用的神经网络层的算子,需要动手编写
需要手动实现额外的计算图和微分参数,numpy.ndarray类型没有把微分和计算图的参数封装起来
没有支持GPU
torch.tensor = numpy.ndarray + 计算图参数 + 微分参数 + GPU支持
若希望某个Tensor支持自动微分,则需要将其属性requires_grad设置为True.当神经网络层数多的时候,手动编写微分程序和反向传播程序,是非常令人抓狂的一件事情
import numpy as np
# N:batch size; D_in:输入层神经个数
# H:隐藏层神经元个数; D_out:输出层神经元个数
N, D_in, H, D_out = 64, 1000, 100, 10
# 创建随机的输入输出数据
x = np.random.randn(N, D_in)
y = np.random.randn(N, D_out)
# 用随机数初始化权重
w1 = np.random.randn(D_in, H)
w2 = np.random.randn(H, D_out)
learning_rate = 1e-6
for t in range(500):
# 前向传播,计算预测值y_pred
h = x.dot(w1)
h_relu = np.maximum(h, 0)
y_pred = h_relu.dot(w2)
# 计算Loss值
loss = np.square(y - y_pred).sum()
print(t, loss)
# 反向传播,计算w1和w2 对 loss函数的梯度
grad_y_pred = 2.0 * (y_pred - y)
grad_w2 = h_relu.T.dot(grad_y_pred)
grad_h_relu = grad_y_pred.dot(w2.T)
grad_h = grad_h_relu.copy()
grad_h[h < 0] = 0
grad_w1 = x.T.dot(grad_h)
# 更新权重
w1 -= learning_rate * grad_w1
w2 -= learning_rate * grad_w2