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