import numpy as np
import torch
from torch import nn,optim
from torch.autograd import variable
from torchvision import datasets,transforms
from torch.utils.data import dataloader
# 訓練集
train_data = datasets.mnist(root=
"./"
,# 存放位置
train =
true
,# 載入訓練集
transform=transforms.totensor(),
# 把資料變成tensor型別
download =
true
)# 測試集
test_data = datasets.mnist(root=
"./"
, train =
false
, transform=transforms.totensor(),
download =
true
)
# 批次大小
batch_size =
64# 裝載訓練集
train_loader = dataloader(dataset=train_data,batch_size=batch_size,shuffle=
true
)# 裝載測試集
test_loader = dataloader(dataset=test_data,batch_size=batch_size,shuffle=
true
)
for i,data in
enumerate
(train_loader)
: inputs,labels = data
print
(inputs.shape)
print
(labels.shape)
break
# 定義網路結構
class
net(nn.module)
:def
__init__
(self)
:super
(net,self)
.__init__(
)# 初始化
self.fc1 = nn.linear(
784,10)
# 784個輸入10個輸出
self.softmax = nn.softmax(dim=1)
# 啟用函式 dim=1表示對第乙個維度進行概率計算
defforward
(self,x)
:# torch.size([64, 1, 28, 28]) -> (64,784)
x = x.view(x.size()[
0],-
1)# 4維變2維 (在全連線層做計算只能2維)
x = self.fc1(x)
# 傳給全連線層繼續計算
x = self.softmax(x)
# 使用softmax啟用函式進行計算
return x
# 定義模型
model = net(
)# 定義代價函式
mse_loss = nn.crossentropyloss(
)# 交叉熵
# 定義優化器
optimizer = optim.adam(model.parameters(
),lr=
0.001
)# adam梯度下降
# 定義模型訓練和測試的方法
deftrain()
:for i,data in
enumerate
(train_loader)
:# 獲得乙個批次的資料和標籤
inputs,labels = data
# 獲得模型**結果(64,10)
out = model(inputs)
# 交叉熵代價函式out(batch,c:類別的數量),labels(batch)
loss = mse_loss(out,labels)
# 梯度清零
optimizer.zero_grad(
)# 計算梯度
loss.backward(
)# 修改權值
optimizer.step(
)def
test()
: correct =
0for i,data in
enumerate
(test_loader)
:# 獲得乙個批次的資料和標籤
inputs,labels = data
# 獲得模型**結果(64,10)
out = model(inputs)
# 獲得最大值,以及最大值所在的位置
_,predicted = torch.
max(out,1)
# **正確的數量
correct +=
(predicted==labels)
.sum()
print
("test acc:"
.format
(correct.item()/
len(test_data)
))
# 訓練
Pytorch中adam優化器的引數問題
之前用的adam優化器一直是這樣的 alpha optim torch.optim.adam model.alphas config.alpha lr,betas 0.5,0.999 weight decay config.alpha weight decay 沒有細想內部引數的問題,但是最近的工作...
梯度優化演算法Adam
最近讀乙個 發現用了乙個梯度更新方法,剛開始還以為是什麼奇奇怪怪的梯度下降法,最後分析一下是用一階梯度及其二次冪做的梯度更新。網上搜了一下,果然就是稱為adam的梯度更新演算法,全稱是 自適應矩估計 adaptive moment estimation 國際慣例,參考博文 一文看懂各種神經網路優化演...
adam相關的優化器
adam 自出道以來,就一直是最流行的深度學習優化器,哪怕現在其實已經有幾種可能更好用的優化器 如果將 adam 優化出現以來產生的關於優化過程的有趣想法按時間順序排列的話,結果如下 這個來自 andrej karpathy 的笑話或多或少是我深度學習專案的一套流程。除非把具有學習率硬編碼的 直接從...