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系列:
相關推薦
torch07:RNN--MNIST識別和自己資料集
MachineLP的部落格目錄:小鵬的部落格目錄本小節使用torch搭建RNN模型,訓練和測試:(1)定義模型超引數:rnn的輸入,rnn隱含單元,rnn層數,迭代次數、批量大小、學習率。(3)定義模型(定義需要的RNN結構)。(4)定義損失函式,選用適合的損失函式。(5)定
torch09:variational_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、SBD和VOC實驗總結
最近花了將近一週的時間,基於提供的原始碼,通過參考網上的部落格,跑通了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個樣本的開發資料集實在時太小了。通常,我們會在開發資料集