优化算法1-梯度下降法
import numpy sa np
import torch
from torchvision.datasets import MNIST #导入pytorch内置的mnist数据
from torch.utils.data import DataLoader
from torch import nn
from torch.autograd import Variable
import time
import matplotlib.pyplot as plt
%matplotlib inline
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
trai_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()
随机梯度下降法:
从0开始写:
def sgd_update(parameters,lr):
for param in parameters:
param.data = param.data - lr * param.grad.data
可以先把batch size设置为1
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
for im,label in train_data:
im = Variable(im)
label = Variable(label)
#前向传播
net.zero_grad()
loss.backward()
sgd_update(net.parameters(),1e-2) #使用0.01的学习率
#记录误差
train_loss += loss.data[0]
if idx % 30