import torch
import torchvision
import torch.nn as nn
import numpy as np
import torchvision.transforms as transforms
# 创建张量
x = torch.randn(10, 3) #10行3列 训练数据,每行一个样本
y = torch.randn(10, 2) #10行2列 训练标签,每行一个样本
# 建立全连接层(FCN).
linear = nn.Linear(3, 2)
print ('w: ', linear.weight)
print ('b: ', linear.bias)
# 定义损失函数,并且选择优化算法
criterion = nn.MSELoss() #使用均方误差作为损失函数 MSE = 1/N ∑(y-y_g)^2
optimizer = torch.optim.SGD(linear.parameters(), lr=0.01)
# 前向传播
pred = linear(x)
# 计算损失误差
loss = criterion(pred, y)
print('loss: ', loss.item())
# 后向传播
loss.backward()
# 输出梯度
print ('dL/dw: ', linear.weight.grad)
print ('dL/db: ', linear.bias.grad)
# 执行1次优化,根据每个变量梯度更新一次变量值.
optimizer.step()
# 也可以使用下面两行代码手工进行变量更新,效果相同.
# linear.weight.data.sub_(0.01 * linear.weight.grad.data)
# linear.bias.data.sub_(0.01 * linear.bias.grad.data)
# 根据更新后的变量重新计算预测值和损失函数.
pred = linear(x)
loss = criterion(pred, y)
print('loss after 1 step optimization: ', loss.item())
代码解读:
- 基本计算步骤:深度学习算法其计算流程与BP神经网络算法类似。输入变量为x,在每层定义节点连接参数w,然后对x进行计算预测输出 y_pred = f(x,w),其中w为所有节点参数。然后将预测的标签值y_pred与真实值y作比较,根据预先定义好的损失函数计算所有样本的损失,然后根据样本损失逆向传播,计算每个节点对应的导数,然后采用梯度下降算法(或其他类似的优化算法)对神经元上的所有节点更新参数,依照上述方式依次循环计算。算法的总体目标是不断优化节点参数,使得期望输出与实际输出尽可能小;
- Pytorch由于使用的是动态图,因此可以方便的在训练过程中查看结果、进行调试;
- #SGD就是每一次迭代计算mini-batch的梯度,然后对参数进行更新,是最常见的优化方法 ;