1. 程式人生 > >torch07:RNN--MNIST識別和自己資料集

torch07:RNN--MNIST識別和自己資料集

MachineLP的部落格目錄:小鵬的部落格目錄

本小節使用torch搭建RNN模型,訓練和測試:

(1)定義模型超引數:rnn的輸入,rnn隱含單元,rnn層數,迭代次數、批量大小、學習率。

(3)定義模型(定義需要的RNN結構)。

(4)定義損失函式,選用適合的損失函式。

(5)定義優化演算法(SGD、Adam等)。

(6)儲存模型。

---------------------------------我是可愛的分割線---------------------------------

程式碼部分:

# coding=utf-8

import torch 
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms


# 判定GPU是否存在 
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# 定義超引數
# RNN的輸入是一個序列,sequence_length為序列長度,input_size為序列每個長度。
sequence_length = 28
input_size = 28
# 定義RNN隱含單元的大小。
hidden_size = 128
# 定義rnn的層數
num_layers = 2
# 識別的類別數量
num_classes = 10
# 批的大小
batch_size = 100
# 定義迭代次數
num_epochs = 2
# 定義學習率
learning_rate = 0.01

# MNIST 資料集  
train_dataset = torchvision.datasets.MNIST(root='./data/',
                                           train=True, 
                                           transform=transforms.ToTensor(),
                                           download=True)

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

# 構建資料管道, 使用自己的資料集請參考:https://blog.csdn.net/u014365862/article/details/80506147 
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=False)

# 定義RNN(LSTM)
class RNN(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, num_classes):
        super(RNN, self).__init__()
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
        self.fc = nn.Linear(hidden_size, num_classes)
    
    def forward(self, x):
        # Set initial hidden and cell states 
        h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device) 
        c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device)
        
        # Forward propagate LSTM
        out, _ = self.lstm(x, (h0, c0))  # out: tensor of shape (batch_size, seq_length, hidden_size)
        
        # Decode the hidden state of the last time step
        out = self.fc(out[:, -1, :])
        return out

# 定義模型 
model = RNN(input_size, hidden_size, num_layers, num_classes).to(device)


# 損失函式和優化演算法
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

# 訓練模型 
total_step = len(train_loader)
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):
        images = images.reshape(-1, sequence_length, input_size).to(device)
        labels = labels.to(device)
        
        # 前向傳播+計算loss  
        outputs = model(images)
        loss = criterion(outputs, labels)
        
        # 後向傳播+調整引數 
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        # 每100個batch列印一次資料    
        if (i+1) % 100 == 0:
            print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}' 
                   .format(epoch+1, num_epochs, i+1, total_step, loss.item()))

# 模型測試部分    
# 測試階段不需要計算梯度,注意  
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in test_loader:
        images = images.reshape(-1, sequence_length, input_size).to(device)
        labels = labels.to(device)
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

    print('Test Accuracy of the model on the 10000 test images: {} %'.format(100 * correct / total)) 

# 儲存模型引數   
torch.save(model.state_dict(), 'model.ckpt')

加餐1:在自己資料集上使用:

其中,train.txt中的資料格式:

gender/0male/0(2).jpg 1
gender/0male/0(3).jpeg 1
gender/0male/0(1).jpg 0

test.txt中的資料格式如下:

gender/0male/0(3).jpeg 1
gender/0male/0(1).jpg 0

gender/1female/1(6).jpg 1

程式碼部分:

# coding=utf-8
import torch     
import torch.nn as nn    
import torchvision    
from torch.utils.data import Dataset, DataLoader        
from torchvision import transforms, utils     
from PIL import Image  


# 判定GPU是否存在 
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# 定義超引數
# RNN的輸入是一個序列,sequence_length為序列長度,input_size為序列每個長度。
sequence_length = 28*3
input_size = 28
# 定義RNN隱含單元的大小。
hidden_size = 128
# 定義rnn的層數
num_layers = 2
# 識別的類別數量
num_classes = 10
# 批的大小
batch_size = 16
# 定義迭代次數
num_epochs = 2
# 定義學習率
learning_rate = 0.01

def default_loader(path):        
    # 注意要保證每個batch的tensor大小時候一樣的。        
    return Image.open(path).convert('RGB')        
        
class MyDataset(Dataset):        
    def __init__(self, txt, transform=None, target_transform=None, loader=default_loader):        
        fh = open(txt, 'r')        
        imgs = []        
        for line in fh:        
            line = line.strip('\n')        
            # line = line.rstrip()        
            words = line.split(' ')        
            imgs.append((words[0],int(words[1])))        
        self.imgs = imgs        
        self.transform = transform        
        self.target_transform = target_transform        
        self.loader = loader        
            
    def __getitem__(self, index):        
        fn, label = self.imgs[index]        
        img = self.loader(fn)        
        if self.transform is not None:        
            img = self.transform(img)        
        return img,label        
            
    def __len__(self):        
        return len(self.imgs)        
        
def get_loader(dataset='train.txt', crop_size=128, image_size=28, batch_size=2, mode='train', num_workers=1):        
    """Build and return a data loader."""        
    transform = []        
    if mode == 'train':        
        transform.append(transforms.RandomHorizontalFlip())        
    transform.append(transforms.CenterCrop(crop_size))        
    transform.append(transforms.Resize(image_size))        
    transform.append(transforms.ToTensor())        
    transform.append(transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5)))        
    transform = transforms.Compose(transform)        
    train_data=MyDataset(txt=dataset, transform=transform)        
    data_loader = DataLoader(dataset=train_data,        
                                  batch_size=batch_size,        
                                  shuffle=(mode=='train'),        
                                  num_workers=num_workers)        
    return data_loader        
# 注意要保證每個batch的tensor大小時候一樣的。        
# data_loader = DataLoader(train_data, batch_size=2,shuffle=True)        
train_loader = get_loader('train.txt', batch_size=batch_size)        
print(len(train_loader))        
test_loader = get_loader('test.txt', batch_size=batch_size)        
print(len(test_loader))    

# 定義RNN(LSTM)
class RNN(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, num_classes):
        super(RNN, self).__init__()
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
        self.fc = nn.Linear(hidden_size, num_classes)
    
    def forward(self, x):
        # Set initial hidden and cell states 
        h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device) 
        c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device)
        
        # Forward propagate LSTM
        out, _ = self.lstm(x, (h0, c0))  # out: tensor of shape (batch_size, seq_length, hidden_size)
        
        # Decode the hidden state of the last time step
        out = self.fc(out[:, -1, :])
        return out

# 定義模型 
model = RNN(input_size, hidden_size, num_layers, num_classes).to(device)


# 損失函式和優化演算法
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

# 訓練模型 
total_step = len(train_loader)
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):
        images = images.reshape(-1, sequence_length, input_size).to(device)
        labels = labels.to(device)
        
        # 前向傳播+計算loss  
        outputs = model(images)
        loss = criterion(outputs, labels)
        
        # 後向傳播+調整引數 
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        # 每100個batch列印一次資料    
        if (i+1) % 100 == 0:
            print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}' 
                   .format(epoch+1, num_epochs, i+1, total_step, loss.item()))

# 模型測試部分    
# 測試階段不需要計算梯度,注意  
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in test_loader:
        images = images.reshape(-1, sequence_length, input_size).to(device)
        labels = labels.to(device)
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

    print('Test Accuracy of the model on the 10000 test images: {} %'.format(100 * correct / total)) 

# 儲存模型引數   
torch.save(model.state_dict(), 'model.ckpt')

加餐2:BIRNN

# coding=utf-8
import torch 
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms


# 判定GPU是否存在 
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# 定義超引數  
# RNN的輸入是一個序列,sequence_length為序列長度,input_size為序列每個長度。
sequence_length = 28
input_size = 28
# 定義RNN隱含單元的大小。 
hidden_size = 128
# 定義rnn的層數
num_layers = 2
num_classes = 10
batch_size = 100
num_epochs = 2
learning_rate = 0.003

# MNIST 資料集
train_dataset = torchvision.datasets.MNIST(root='./data/',
                                           train=True, 
                                           transform=transforms.ToTensor(),
                                           download=True)

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

# 構建資料管道, 使用自己的資料集請參考:https://blog.csdn.net/u014365862/article/details/80506147  
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=False)

# 定義RNN(LSTM) 
class BiRNN(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, num_classes):
        super(BiRNN, self).__init__()
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True, bidirectional=True)
        self.fc = nn.Linear(hidden_size*2, num_classes)  # 2 for bidirection
    
    def forward(self, x):
        # Set initial states
        h0 = torch.zeros(self.num_layers*2, x.size(0), self.hidden_size).to(device) # 2 for bidirection 
        c0 = torch.zeros(self.num_layers*2, x.size(0), self.hidden_size).to(device)
        
        # Forward propagate LSTM
        out, _ = self.lstm(x, (h0, c0))  # out: tensor of shape (batch_size, seq_length, hidden_size*2)
        
        # Decode the hidden state of the last time step
        out = self.fc(out[:, -1, :])
        return out

# 定義模型
model = BiRNN(input_size, hidden_size, num_layers, num_classes).to(device)

# 損失函式和優化演算法 
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
    
# 訓練模型 
total_step = len(train_loader)
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):
        images = images.reshape(-1, sequence_length, input_size).to(device)
        labels = labels.to(device)
        
        # 前向傳播+計算loss    
        outputs = model(images)
        loss = criterion(outputs, labels)
        
        # 後向傳播+調整引數   
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        # 每100個batch列印一次資料      
        if (i+1) % 100 == 0:
            print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}' 
                   .format(epoch+1, num_epochs, i+1, total_step, loss.item()))

# 模型測試部分      
# 測試階段不需要計算梯度,注意 
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in test_loader:
        images = images.reshape(-1, sequence_length, input_size).to(device)
        labels = labels.to(device)
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

    print('Test Accuracy of the model on the 10000 test images: {} %'.format(100 * correct / total)) 

# 儲存模型引數
torch.save(model.state_dict(), 'model.ckpt')

---------------------------------我是可愛的分割線---------------------------------

總結:

本節使用RNN訓練MNIST識別、自己資料的識別。

torch系列:

相關推薦

torch07RNN--MNIST識別自己資料

MachineLP的部落格目錄:小鵬的部落格目錄本小節使用torch搭建RNN模型,訓練和測試:(1)定義模型超引數:rnn的輸入,rnn隱含單元,rnn層數,迭代次數、批量大小、學習率。(3)定義模型(定義需要的RNN結構)。(4)定義損失函式,選用適合的損失函式。(5)定

torch09variational_autoencoder(VAE)--MNIST自己資料

MachineLP的部落格目錄:小鵬的部落格目錄 本小節使用torch搭建VAE模型,訓練和測試: (1)定義模型超引數:輸入大小、隱含單元、迭代次數、批量大小、學習率。 (2)定義訓練資料。 (3)定義模型(定義需要的VAE結構)。 (4)定義損失函式,選

全連線神經網路實現識別手寫資料MNIST

全連線神經網路實現識別手寫資料集MNIST MNIST是一個由美國由美國郵政系統開發的手寫數字識別資料集。手寫內容是0~9,一共有60000個圖片樣本,我們可以到MNIST官網免費下載。總共4個檔案,該檔案是二進位制內容。 train-images-idx3-ubyte.gz:  trainin

《TensorFlow實戰Google深度學習框架》——6.1 影象識別中經典資料介紹

1、CIFAR資料集 CIFAR是一個影響力很大的影象分類資料集,CIFAR資料集中的圖片為32*32的彩色圖片,由Alex  Krizhevsky教授、Vinod Nair博士和Geoffrey Hinton教授整理的。 CIFAR是影象詞典專案(Visual Dictionar

TensorFlow+實戰Google深度學習框架學習筆記(12)------Mnist識別卷積神經網路LeNet

一、卷積神經網路的簡述 卷積神經網路將一個影象變窄變長。原本【長和寬較大,高較小】變成【長和寬較小,高增加】 卷積過程需要用到卷積核【二維的滑動視窗】【過濾器】,每個卷積核由n*m(長*寬)個小格組成,每個小格都有自己的權重值, 長寬變窄:過濾器的長寬決定的 高度變高:過濾器的個數決定的 &nb

TensorFlow+實戰Google深度學習框架學習筆記(13)------Mnist識別卷積神經網路AlexNet

一、AlexNet:共8層:5個卷積層(卷積+池化)、3個全連線層,輸出到softmax層,產生分類。  論文中lrn層推薦的引數:depth_radius = 4,bias = 1.0 , alpha = 0.001 / 9.0 , beta = 0.75 lrn現在僅在AlexNet中使用,

TensorFlow+實戰Google深度學習框架學習筆記(13)------Mnist識別卷積神經網絡AlexNet

net dev adding 筆記 learn 明顯 lex test info 一、AlexNet:共8層:5個卷積層(卷積+池化)、3個全連接層,輸出到softmax層,產生分類。 論文中lrn層推薦的參數:depth_radius = 4,bias = 1.0 ,

Mnist手寫數字資料softmax識別

# -*- coding: utf-8 -*- # @Time : 2018/12/14 11:09 # @Author : WenZhao # @Email : [email protected] # @File : mnistSoftmax.py # @Softw

蘋果隱私條例更新收集使用者電話 Email 資料

簡評:蘋果現在會收集使用者的電話和電子郵件,作為使用者「信任評級」的一部分,我還是支援的,因為園長被黑產攻擊 AppleID,直接刷爆了我的卡!但是在大環境看,隱私已經不存在了。 Apple 最近悄悄為 iOS 裝置引入了「信用評分」。 Apple 最新的隱

MySQL--修改資料表6修改列定義更名資料

修改列定義和更名資料表把某一列移動到指定位置:ALTER TABLE users2 MODIFY id SMALLINT UNSIGNED NOT NULL FIRST; // 末尾也可加 (AFTER 列名) 放在某一列之後修改某一列的定義型別:ALTER TABLE us

FCN訓練自己資料(person-segmentation)、SIFT-FLOW、SBDVOC實驗總結

最近花了將近一週的時間,基於提供的原始碼,通過參考網上的部落格,跑通了FCN在三個資料集上的訓練以及測試。在這裡寫下總結,即是記錄,又希望能夠對其他剛剛接觸FCN的人有所幫助。 FCN的原始碼地址:https://github.com/shelhamer/fcn.berkeleyvision.o

虛擬機器安裝XP系統圖解之三安裝VM Tools共享資料

     上一篇演示了新建虛擬機器和xp系統的安裝,本篇將是這個系列的結尾階段:安裝VM Tools 和共享資料夾。      安裝VM Tools能夠使的虛擬機器和實體機之間能夠自由拖動檔案,最重要

為豬臉識別而進行自己資料的構建、訓練

 在實際過程中走了彎路,特地進行說明記錄,以備今後參考。 思路是先構建VOC2007格式的豬臉資料集,在轉換成tf格式,然後利用tf的objectdetectionapi進行訓練。原因是把2種構

神經網路中訓練資料、驗證資料測試資料的區別

whats the difference between train, validation and test set, in neural networks? Answer: The training and validation sets are used during t

使用pytorch版faster-rcnn訓練自己資料

使用pytorch版faster-rcnn訓練自己資料集 引言 faster-rcnn pytorch程式碼下載 訓練自己資料集 接下來工作 參考文獻 引言 最近在復現目標檢測程式碼(師兄強烈推薦F

keras RNN、LSTM對IMDB資料進行分類

本文介紹如何基於keras採用RNN和LSTM對IMDB資料集進行分類。 示例程式碼: from keras.layers import SimpleRNN from keras.models import Sequential from keras.layers import Embedd

《錯誤手記-01》 facenet使用預訓練模型fine-tune重新訓練自己資料報錯

環境資訊:windows10+python3.5+tensorflow1.6.0 問題描述: 在自己的訓練集上跑train_softmax.py.  引數: --logs_base_dir F:/work/runspace/log/  --models_base_

Kaldi中thchs30訓練自己資料的步驟

一、資料準備過程 網上下載的thchs-openslr資料集需要換成自己的資料集,包含兩個資料夾:data_thchs30和resource。下面講解如何搞定這一部分。 資料集在data_thchs30檔案中,包含四個部分(data、train、dev、test)。 data資料夾中包

MNIST手寫數字資料的讀取,基於python3

MNIST 是一個入門級別的計算機視覺資料庫,也是機器學習領域最有名的資料集之一。當我們開始學習程式設計的時候,第一件事往往就是打“Hello world”。而在機器學習中,識別 MNIST 就相當於程式設計中的“Hello world”。 MNIST 中包含了

7.開發測試資料多大合適 翻譯自 吳恩達新書-Machine Learning Yearning

為了檢測出不同演算法之間的差異,開發資料集應該足夠大。比如,分類演算法A的準確率為90.0%, 分類演算法B的準確率為90.1%,如果開發資料集中只有100個樣本,那你無法檢測出這0.1%差在哪兒。100個樣本的開發資料集實在時太小了。通常,我們會在開發資料集