pytorch 利用lstm做mnist手寫(xiě)數(shù)字識(shí)別分類(lèi)的實(shí)例
代碼如下,U我認(rèn)為對(duì)于新手來(lái)說(shuō)最重要的是學(xué)會(huì)rnn讀取數(shù)據(jù)的格式。
# -*- coding: utf-8 -*-
"""
Created on Tue Oct 9 08:53:25 2018
@author: www
"""
import sys
sys.path.append('..')
import torch
import datetime
from torch.autograd import Variable
from torch import nn
from torch.utils.data import DataLoader
from torchvision import transforms as tfs
from torchvision.datasets import MNIST
#定義數(shù)據(jù)
data_tf = tfs.Compose([
tfs.ToTensor(),
tfs.Normalize([0.5], [0.5])
])
train_set = MNIST('E:/data', train=True, transform=data_tf, download=True)
test_set = MNIST('E:/data', train=False, transform=data_tf, download=True)
train_data = DataLoader(train_set, 64, True, num_workers=4)
test_data = DataLoader(test_set, 128, False, num_workers=4)
#定義模型
class rnn_classify(nn.Module):
def __init__(self, in_feature=28, hidden_feature=100, num_class=10, num_layers=2):
super(rnn_classify, self).__init__()
self.rnn = nn.LSTM(in_feature, hidden_feature, num_layers)#使用兩層lstm
self.classifier = nn.Linear(hidden_feature, num_class)#將最后一個(gè)的rnn使用全連接的到最后的輸出結(jié)果
def forward(self, x):
#x的大小為(batch,1,28,28),所以我們需要將其轉(zhuǎn)化為rnn的輸入格式(28,batch,28)
x = x.squeeze() #去掉(batch,1,28,28)中的1,變成(batch, 28,28)
x = x.permute(2, 0, 1)#將最后一維放到第一維,變成(batch,28,28)
out, _ = self.rnn(x) #使用默認(rèn)的隱藏狀態(tài),得到的out是(28, batch, hidden_feature)
out = out[-1,:,:]#取序列中的最后一個(gè),大小是(batch, hidden_feature)
out = self.classifier(out) #得到分類(lèi)結(jié)果
return out
net = rnn_classify()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adadelta(net.parameters(), 1e-1)
#定義訓(xùn)練過(guò)程
def get_acc(output, label):
total = output.shape[0]
_, pred_label = output.max(1)
num_correct = (pred_label == label).sum().item()
return num_correct / total
def train(net, train_data, valid_data, num_epochs, optimizer, criterion):
if torch.cuda.is_available():
net = net.cuda()
prev_time = datetime.datetime.now()
for epoch in range(num_epochs):
train_loss = 0
train_acc = 0
net = net.train()
for im, label in train_data:
if torch.cuda.is_available():
im = Variable(im.cuda()) # (bs, 3, h, w)
label = Variable(label.cuda()) # (bs, h, w)
else:
im = Variable(im)
label = Variable(label)
# forward
output = net(im)
loss = criterion(output, label)
# backward
optimizer.zero_grad()
loss.backward()
optimizer.step()
train_loss += loss.item()
train_acc += get_acc(output, label)
cur_time = datetime.datetime.now()
h, remainder = divmod((cur_time - prev_time).seconds, 3600)
m, s = divmod(remainder, 60)
time_str = "Time %02d:%02d:%02d" % (h, m, s)
if valid_data is not None:
valid_loss = 0
valid_acc = 0
net = net.eval()
for im, label in valid_data:
if torch.cuda.is_available():
im = Variable(im.cuda())
label = Variable(label.cuda())
else:
im = Variable(im)
label = Variable(label)
output = net(im)
loss = criterion(output, label)
valid_loss += loss.item()
valid_acc += get_acc(output, label)
epoch_str = (
"Epoch %d. Train Loss: %f, Train Acc: %f, Valid Loss: %f, Valid Acc: %f, "
% (epoch, train_loss / len(train_data),
train_acc / len(train_data), valid_loss / len(valid_data),
valid_acc / len(valid_data)))
else:
epoch_str = ("Epoch %d. Train Loss: %f, Train Acc: %f, " %
(epoch, train_loss / len(train_data),
train_acc / len(train_data)))
prev_time = cur_time
print(epoch_str + time_str)
train(net, train_data, test_data, 10, optimizer, criterion)
以上這篇pytorch 利用lstm做mnist手寫(xiě)數(shù)字識(shí)別分類(lèi)的實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)圖像和辦公文檔處理的方法和技巧
本文介紹了Python實(shí)現(xiàn)圖像和辦公文檔處理的方法和技巧,包括使用Pillow庫(kù)處理圖像、使用OpenCV庫(kù)進(jìn)行圖像識(shí)別和處理、使用PyPDF2庫(kù)處理PDF文檔、使用docx和xlwt庫(kù)處理Word和Excel文檔等,幫助讀者更好地掌握Python在圖像和辦公文檔處理方面的應(yīng)用2023-05-05
使用Python在Excel工作表中創(chuàng)建圖表的實(shí)現(xiàn)步驟
在現(xiàn)代企業(yè)中,數(shù)據(jù)驅(qū)動(dòng)的決策變得越來(lái)越重要,Excel作為企業(yè)中最常用的數(shù)據(jù)分析工具,其強(qiáng)大的表格和圖表功能在日常工作中不可或缺,然而,當(dāng)面對(duì)成百上千條數(shù)據(jù)或需要生成定期報(bào)告時(shí),手動(dòng)制作圖表不僅耗時(shí),還容易出錯(cuò),所以本文介紹了如何實(shí)現(xiàn)Excel圖表自動(dòng)化生成2025-12-12
使用Python 統(tǒng)計(jì)文件夾內(nèi)所有pdf頁(yè)數(shù)的小工具
這篇文章主要介紹了Python 統(tǒng)計(jì)文件夾內(nèi)所有pdf頁(yè)數(shù)的小工具,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
使用Python的Twisted框架編寫(xiě)非阻塞程序的代碼示例
Twisted是基于異步模式的開(kāi)發(fā)框架,因而利用Twisted進(jìn)行非阻塞編程自然也是必會(huì)的用法,下面我們就來(lái)一起看一下使用Python的Twisted框架編寫(xiě)非阻塞程序的代碼示例:2016-05-05
Python 實(shí)現(xiàn)自動(dòng)化Excel報(bào)表的步驟
這篇文章主要介紹了Python 實(shí)現(xiàn)自動(dòng)化Excel報(bào)表的步驟,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-04-04
torch.optim優(yōu)化算法理解之optim.Adam()解讀
這篇文章主要介紹了torch.optim優(yōu)化算法理解之optim.Adam()解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

