mnist簡易分類網(wǎng)絡(luò)(pytorch)

網(wǎng)上找了一個(gè)代碼灾螃,閱讀代碼题翻,加上了相應(yīng)的注釋

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms

BATCH_SIZE=512 #大概需要2G的顯存
EPOCHS=20 # 總共訓(xùn)練批次
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 讓torch判斷是否使用GPU
#獲取數(shù)據(jù)
train_loader = torch.utils.data.DataLoader(
        datasets.MNIST('data', train=True, download=True, #有數(shù)據(jù)集后改為download=False
                       transform=transforms.Compose([
                           transforms.ToTensor(),
                           transforms.Normalize((0.1307,), (0.3081,))
                       ])),
        batch_size=BATCH_SIZE, shuffle=True)
test_loader = torch.utils.data.DataLoader(
        datasets.MNIST('data', train=False, transform=transforms.Compose([
                           transforms.ToTensor(),
                           transforms.Normalize((0.1307,), (0.3081,))
                       ])),
        batch_size=BATCH_SIZE, shuffle=True)

#定義模型
class ConvNet(nn.Module):
    def __init__(self):
        super().__init__()
        # 1,28x28
        self.conv1=nn.Conv2d(1,10,5) # 10, 24x24
        self.conv2=nn.Conv2d(10,20,3) # 128, 10x10
        self.fc1 = nn.Linear(20*10*10,500)
        self.fc2 = nn.Linear(500,10)
    def forward(self,x):
        in_size = x.size(0)
        out = self.conv1(x) #24
        out = F.relu(out)
        out = F.max_pool2d(out, 2, 2)  #12
        out = self.conv2(out) #10
        out = F.relu(out)
        out = out.view(in_size,-1)#展開成一維,方便進(jìn)行FC
        out = self.fc1(out)
        out = F.relu(out)
        out = self.fc2(out)
        out = F.log_softmax(out,dim=1)
        return out
model = ConvNet().to(DEVICE)
optimizer = optim.Adam(model.parameters())
#訓(xùn)練過程
'''
1 獲取loss:輸入圖像和標(biāo)簽腰鬼,通過infer計(jì)算得到預(yù)測值嵌赠,計(jì)算損失函數(shù);
2 optimizer.zero_grad() 清空過往梯度熄赡;
3 loss.backward() 反向傳播姜挺,計(jì)算當(dāng)前梯度;
4 optimizer.step() 根據(jù)梯度更新網(wǎng)絡(luò)參數(shù)
鏈接:https://www.zhihu.com/question/303070254/answer/573037166
'''
def train(model, device, train_loader, optimizer, epoch):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = data.to(device), target.to(device)
        optimizer.zero_grad()#梯度置零彼硫,清空過往梯度炊豪,這種操作模式的好處可參考https://www.zhihu.com/question/303070254
        output = model(data)
        loss = F.nll_loss(output, target)#調(diào)用內(nèi)置函數(shù)
        loss.backward()#反向傳播凌箕,計(jì)算當(dāng)前梯度
        optimizer.step()#根據(jù)梯度更新網(wǎng)絡(luò)參數(shù)
        if(batch_idx+1)%30 == 0: 
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                epoch, batch_idx * len(data), len(train_loader.dataset),
                100. * batch_idx / len(train_loader), loss.item()))#Use torch.Tensor.item() to get a Python number from a tensor containing a single value:
#測試過程
def test(model, device, test_loader):
    model.eval()
    test_loss = 0
    correct = 0
    with torch.no_grad():
        for data, target in test_loader:
            data, target = data.to(device), target.to(device)
            output = model(data)#正向計(jì)算預(yù)測值
            test_loss += F.nll_loss(output, target, reduction='sum').item() # 將一批的損失相加
            pred = output.max(1, keepdim=True)[1] # 找到概率最大的下標(biāo)
            correct += pred.eq(target.view_as(pred)).sum().item()#找到正確的預(yù)測值
    test_loss /= len(test_loader.dataset)
    print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
        test_loss, correct, len(test_loader.dataset),
        100. * correct / len(test_loader.dataset)))
#運(yùn)行,這里也可以改成main的形式
for epoch in range(1, EPOCHS + 1):
    train(model, DEVICE, train_loader, optimizer, epoch)
    test(model, DEVICE, test_loader)

代碼部分比較簡單
1词渤、數(shù)據(jù)讀取
2牵舱、構(gòu)建網(wǎng)絡(luò)模型 ConvNet(nn.Module)
3、構(gòu)建訓(xùn)練函數(shù)train
4缺虐、構(gòu)建測試函數(shù)test
5芜壁、關(guān)于代碼中的model.train(),model.eval()的說明:
參考 PyTorch進(jìn)行訓(xùn)練和測試時(shí)指定實(shí)例化的model模式為:train/eval
eval即evaluation模式高氮,train即訓(xùn)練模式慧妄。僅僅當(dāng)模型中有Dropout和BatchNorm是才會(huì)有影響。因?yàn)橛?xùn)練時(shí)dropout和BN都開啟剪芍,而一般而言測試時(shí)dropout被關(guān)閉塞淹,BN中的參數(shù)也是利用訓(xùn)練時(shí)保留的參數(shù),所以測試時(shí)應(yīng)進(jìn)入評(píng)估模式紊浩。
(在訓(xùn)練時(shí)窖铡,??和??2是在整個(gè)mini-batch 上計(jì)算出來的包含了像是64 或28 或其它一定數(shù)量的樣本,但在測試時(shí)坊谁,你可能需要逐一處理樣本费彼,方法是根據(jù)你的訓(xùn)練集估算??和??2,估算的方式有很多種口芍,理論上你可以在最終的網(wǎng)絡(luò)中運(yùn)行整個(gè)訓(xùn)練集來得到??和??2箍铲,但在實(shí)際操作中,我們通常運(yùn)用指數(shù)加權(quán)平均來追蹤在訓(xùn)練過程中你看到的??和??2的值鬓椭。還可以用指數(shù)加權(quán)平均颠猴,有時(shí)也叫做流動(dòng)平均來粗略估算??和??2,然后在測試中使用??和??2的值來進(jìn)行你所需要的隱藏單元??值的調(diào)整小染。在實(shí)踐中翘瓮,不管你用什么方式估算??和??2,這套過程都是比較穩(wěn)健的裤翩,因此我不太會(huì)擔(dān)心你具體的操作方式资盅,而且如果你使用的是某種深度學(xué)習(xí)框架,通常會(huì)有默認(rèn)的估算??和??2的方式踊赠,應(yīng)該一樣會(huì)起到比較好的效果)
6呵扛、損失函數(shù),這是torch的loss function筐带,這里用的是負(fù)對數(shù)似然今穿,推導(dǎo)可以參考負(fù)對數(shù)似然

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伦籍,隨后出現(xiàn)的幾起案子蓝晒,更是在濱河造成了極大的恐慌腮出,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拔创,死亡現(xiàn)場離奇詭異利诺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)剩燥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門慢逾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灭红,你說我怎么就攤上這事侣滩。” “怎么了变擒?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵君珠,是天一觀的道長。 經(jīng)常有香客問我娇斑,道長策添,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任毫缆,我火速辦了婚禮唯竹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苦丁。我一直安慰自己浸颓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布旺拉。 她就那樣靜靜地躺著产上,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛾狗。 梳的紋絲不亂的頭發(fā)上晋涣,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音沉桌,去河邊找鬼谢鹊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蒲牧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赌莺,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼冰抢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了艘狭?” 一聲冷哼從身側(cè)響起挎扰,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤翠订,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后遵倦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尽超,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年梧躺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了似谁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掠哥,死狀恐怖巩踏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情续搀,我是刑警寧澤塞琼,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站禁舷,受9級(jí)特大地震影響彪杉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牵咙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一派近、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霜大,春花似錦构哺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至途茫,卻和暖如春碟嘴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背囊卜。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工娜扇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人栅组。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓雀瓢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親玉掸。 傳聞我的和親對象是個(gè)殘疾皇子刃麸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容