Pytorch学习记录(五):反向传播+基于梯度的优化器
(SGD,Adagrad,RMSp。。。
反向传播算法
链式法则
求偏导
反向传播
Sigmoid函数举例
def sgd_update(parameters, lr):
for param in parameters:
param.data = param.data - lr * ad.data
详细代码:
import numpy as np
import torch
from torchvision.datasets import MNIST
from torch.utils.data import DataLoader
from torch.utils.data import DataLoader
from torch import nn
from torch.autograd import Variable
import time
import matplotlib.pyplot as plt
import os
# batch_size=1时
# 定义数据预处理函数
def data_tf(x):
x = np.array(x, dtype='float32')/255# 将数据变到0-1
x =(x -0.5)/0.5# 标准化
x = x.reshape((-1,))# 拉平
x = torch.from_numpy(x)# 转化成Tensor
return x
train_set = MNIST('./data', train=True, transform=data_tf, download=True) test_set = MNIST('./data', train=False, transform=data_tf, download=True)
# 定义Loss函数
variable怎么记
criterion = nn.CrossEntropyLoss()
# 定义梯度下降的函数
# 公式:参数数据 - 学习率 * 梯度
# 传⼊的是⽹络的参数,和学习率,输出梯度下降后的数据
def sgd_updata(parameters, lr):
for param in parameters:
param.data = param.data - lr * ad.data
# 定义训练集
train_data = DataLoader(train_set, batch_size =1, shuffle=True)
# 使⽤Sequential定义3层神经⽹络
net = nn.Sequential(
nn.Linear(784,200),
nn.ReLU(),
nn.Linear(200,10)
)
# 开始训练
losses1 =[]# 空容器,循环次数
idx =0# 训练次数
start = time.time()# 开始计时
for e in range(5):
train_loss =0# 初始化训练损失为0
for im, label in train_data:
# 读取数据中的数据,存储在Variable中
im = Variable(im)
label = Variable(label)
# 前向传播
out = net(im)
loss = criterion(out, label)
# 反向传播
<_grad()# 梯度清零
loss.backward()# 反向传播
sgd_updata(net.parameters(),1e-2)# 梯度下降,使⽤0.01的学习率# 记录误差
train_loss += loss.item()
if idx %30==0:
losses1.append(loss.item())
idx +=1
print('epoch: {}, Train loss: {:.6f}'.format(e, train_loss /len(train_data))) end = time.time()
end = time.time()
print('使⽤时间:{:.5f} s'.format(end - start))
# 画出图形
x_axis = np.linspace(0,5,len(losses1), endpoint=True)
plt.semilogx(x_axis, losses1, label ='batch_size=1')
plt.legend(loc='best')
plt.show()
将batch_size改为64
学习率太⼤会使得损失函数不断回跳,从⽽⽆法让损失函数较好降低,所以我们⼀般都是⽤⼀个⽐较⼩的学习率Pytorch中⾃带的函数
是optimzier = torch.optim.SGD(net.parameters(), lr)
具体形式如下:
class torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)[source]
params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
lr (float) – 学习率
momentum (float,可选) – 动量因⼦(默认:0)
weight_decay (float,可选) – 权重衰减(L2惩罚)(默认:0)
dampening (float,可选) – 动量的抑制因⼦(默认:0)
nesterov (bool,可选) – 使⽤Nesterov动量(默认:False)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。