pytorch學習 動量法momentum

2021-08-26 20:45:52 字數 3181 閱讀 4345

關於動量法的原理這裡不寫了,參考別的文章:

以下是**實現:

# -*- coding: utf-8 -*-

"""created on sun sep 2 15:54:06 2018

@author: www

"""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

def get_data(x):

x = np.array(x, dtype='float32')/255

x = (x-0.5) / 0.5 #標準化

x = x.reshape((-1,)) #拉平

x = torch.from_numpy(x)

return x

train_set = mnist('./data', train=true, transform=get_data, download=true) # 載入資料集,申明定義的資料變換

test_set = mnist('./data', train=false, transform=get_data, download=true)

#定義loss函式

criterion = nn.crossentropyloss()

#自定義動量法

def sgd_momentum(parameters, vs, lr, gamma):

for param, v in zip(parameters, vs):

v[:] = gamma * v + lr * param.grad.data

param.data = param.data - v

train_data = dataloader(train_set, batch_size=64, shuffle=true)

#使用sequential定義神經網路

net = nn.sequential(

nn.linear(784,200),

nn.relu(),

nn.linear(200, 10),

)#將速度初始化為和引數相同的零張量

vs =

for param in net.parameters():

#開始訓練

losses =

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_momentum(net.parameters(), vs, 1e-2, 0.9)

#記錄誤差

train_loss += loss.item()

print('epoch:{},train loss:{}' .format(e, train_loss/len(train_data)))

end = time.time()

print('time={}'.format(end - start))

x_axis = np.linspace(0, 5, len(losses), endpoint=true)

plt.semilogy(x_axis, losses, label='batch_size=1')

plt.legend(loc='best')

#當然,pytorch 內建了動量法的實現,非常簡單,直接在 torch.optim.sgd(momentum=0.9)

# 即可,下面實現一下

train_data = dataloader(train_set, batch_size=64, shuffle=true)

# 使用 sequential 定義 3 層神經網路

net = nn.sequential(

nn.linear(784, 200),

nn.relu(),

nn.linear(200, 10),

)optimizer = torch.optim.sgd(net.parameters(), lr=1e-2, momentum=0.9) # 加動量

# 開始訓練

losses =

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)

# 反向傳播

optimizer.zero_grad()

loss.backward()

optimizer.step()

# 記錄誤差

train_loss += loss.data[0]

if idx % 30 == 0: # 30 步記錄一次

idx += 1

print('epoch: {}, train loss: '

.format(e, train_loss / len(train_data)))

end = time.time() # 計時結束

x_axis = np.linspace(0, 5, len(losses), endpoint=true)

plt.semilogy(x_axis, losses, label='momentum: 0.9')

plt.legend(loc='best')

通過移動平均理解動量法

移動平均法,它的思想是根據時間序列資料,逐項遞推,依次計算包含一定項數的平均值,用以反應長期趨勢,即用一組最近的實際資料值來 未來的值的一種方法。簡單移動平均各個元素的權重相等,計算公式如下 f t at 1 at 2 a t nn frac 1 2 cdots n ft na t 1 at 2 a...

PyTorch學習 安裝PyTorch

例如,使用的是 windows 系統,想用 pip 安裝,python 是 3.6 版的,沒有 gpu 加速,那就按上面的選,然後根據上面的提示,在 terminal 中輸入以下指令就好了 pip3 install torch 1.3.1 cpu torchvision 0.4.2 cpu ftor...

Pytorch學習 1 pytorch簡介

pytorch簡介 1 pytorch簡介 1.1 pytorch的大概 pytorch不是簡單的封裝 lua torch 提供python介面,而是對當下tensor之上的模組進行重構,並增加了最先進的自動求導系統,成為當下最流行的動態圖框架。pytorch是乙個基於torch的python開源機...