卷積神經(jīng)網(wǎng)絡(luò)效果

import torch

import torch.nn as nn

import torch.optim as optim

import torch.nn.functional as F

from torchvision import datasets, transforms

import matplotlib.pyplot as plt

import numpy as np

%matplotlib inline

input_size = 28

num_classes = 10 #標(biāo)簽種類

num_epochs = 3

batch_size = 64

train_dataset = datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)

test_dataset = datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor())

train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)

test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=True)

class CNN(nn.Module):

? ? def __init__(self):

? ? ? ? super(CNN, self).__init__()

? ? ? ? self.conv1 = nn.Sequential(

? ? ? ? ? ? nn.Conv2d(

? ? ? ? ? ? ? ? in_channels=1,

? ? ? ? ? ? ? ? out_channels=16,

? ? ? ? ? ? ? ? kernel_size=5,

? ? ? ? ? ? ? ? stride=1,

? ? ? ? ? ? ? ? padding=2,

? ? ? ? ? ? ),

? ? ? ? ? ? nn.ReLU(),

? ? ? ? ? ? nn.MaxPool2d(kernel_size=2),

? ? ? ? )

? ? ? ? self.conv2 = nn.Sequential(

? ? ? ? ? ? nn.Conv2d(16, 32, 5, 1, 2),

? ? ? ? ? ? nn.ReLU(),

? ? ? ? ? ? nn.Conv2d(32, 32, 5, 1, 2),

? ? ? ? ? ? nn.ReLU(),

? ? ? ? ? ? nn.MaxPool2d(2),

? ? ? ? )

? ? ? ? self.conv3 = nn.Sequential(

? ? ? ? ? ? nn.Conv2d(32, 64, 5, 1, 2),

? ? ? ? ? ? nn.ReLU(),

? ? ? ? )

? ? ? ? self.out = nn.Linear(64*7*7, 10)

? ? def forward(self, x):

? ? ? ? x = self.conv1(x)

? ? ? ? x = self.conv2(x)

? ? ? ? x = self.conv3(x)

? ? ? ? x = x.view(x.size(0), -1) #第一維不變,后面flatten

? ? ? ? output = self.out(x)

? ? ? ? return output

def accuracy(predictions, labels):

? ? pred = torch.max(predictions.data, 1)[1] #兩個(gè)返回值,一個(gè)是value, 一個(gè)是index

? ? rights = pred.eq(labels.data.view_as(pred)).sum()

? ? return rights, len(labels)


# 實(shí)例化

net = CNN()

#損失函數(shù)

criterion = nn.CrossEntropyLoss()

#優(yōu)化器

optimizer = optim.Adam(net.parameters(), lr=0.001) #定義優(yōu)化器,普通的隨機(jī)梯度下降算法

#開始訓(xùn)練循環(huán)

for epoch in range(num_epochs):

? ? #當(dāng)前epoch的結(jié)果保存下來

? ? train_rights = []


? ? for batch_idx, (data, target) in enumerate(train_loader):? #針對(duì)容器中的每一個(gè)批進(jìn)行循環(huán)

? ? ? ? net.train()? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? output = net(data)

? ? ? ? loss = criterion(output, target)

? ? ? ? optimizer.zero_grad()

? ? ? ? loss.backward()

? ? ? ? optimizer.step()

? ? ? ? right = accuracy(output, target)

? ? ? ? train_rights.append(right)


? ? ? ? if batch_idx % 100 == 0:


? ? ? ? ? ? net.eval()

? ? ? ? ? ? val_rights = []


? ? ? ? ? ? for (data, target) in test_loader:

? ? ? ? ? ? ? ? output = net(data)

? ? ? ? ? ? ? ? right = accuracy(output, target)

? ? ? ? ? ? ? ? val_rights.append(right)


? ? ? ? ? ? #準(zhǔn)確率計(jì)算

? ? ? ? ? ? train_r = (sum([tup[0] for tup in train_rights]), sum([tup[1] for tup in train_rights]))

? ? ? ? ? ? val_r = (sum([tup[0] for tup in val_rights]), sum([tup[1] for tup in val_rights]))

? ? ? ? ? ? print('當(dāng)前epoch: {} [{}/{} ({:.0f}%)]\t損失: {:.6f}\t訓(xùn)練集準(zhǔn)確率: {:.2f}%\t測(cè)試集正確率: {:.2f}%'.format(

? ? ? ? ? ? ? ? epoch, batch_idx * batch_size, len(train_loader.dataset),

? ? ? ? ? ? ? ? 100. * batch_idx / len(train_loader),

? ? ? ? ? ? ? ? loss.data,

? ? ? ? ? ? ? ? 100. * train_r[0].numpy() / train_r[1],

? ? ? ? ? ? ? ? 100. * val_r[0].numpy() / val_r[1]))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容