优化算法1:随机梯度下降法

梯度下降公式很简单
在这里插入图片描述

import numpy as np
import torch
from torchvision.datasets import MNIST
from torch.utils.data import DataLoader
from torch import nn
from torch.autograd import Variable
import time
import matplotlib.pyplot as plt

#随机梯度下降法,从0开始自己实现
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)
    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函数
criterion = nn.CrossEntropyLoss()

#定义梯度下降公式:lr学习率,parameters参数
def sgd_update(parameters,lr):
    for param in parameters:
        param.data = param.data - lr * param.grad.data

train_data = DataLoader(train_set,batch_size=64,shuffle=True)

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
    for im,label in train_data:
        im = Variable(im)
        label = Variable(label)

        #向前传播
        out = net(im)
        loss = criterion(out,label)

        #反向传播
        net.zero_grad()
        loss.backward()
        sgd_update(net.parameters(),0.01)

        #记录误差
        train_loss += loss.data
        if idx%30 == 0:
            losses1.append(loss.data)
        idx += 1

    print('epoch:{},Train loss:{}'.format(e,train_loss/len(train_data)))
end = time.time()
print('使用时间:{}'.format(end-start))

x_axis = np.linspace(0,5,len(losses1),endpoint=True)
plt.semilogy(x_axis,losses1,label='batch_size = 1')
plt.show()

batch_size看电脑配置,越小越不稳定

PyTorch内置随机梯度下降法

train_data = DataLoader(train_set, batch_size=64, shuffle=True)
net = nn.Sequential(
	nn.Linear(784, 200),
	nn.ReLU(),
	nn.Linear(200, 10)
)
optimzier = torch.optim.SGD(net.parameters(), 1e-2)
start = time.time() 
	for e in range(5):
	train_loss = 0
	for im, label in train_data:
		im = Variable(im)
		label = Variable(label)
		out = net(im)
		loss = criterion(out, label)
		optimzier.zero_grad()
		loss.backward()
		optimzier.step()
		train_loss += loss.data
print('epoch: {}, Train Loss: {:.6f}'
.format(e, train_loss / len(train_data)))
end = time.time() #
print('时间: {} s'.format(end - start))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值