pytorch dropout_PyTorch初探MNIST数据集
前言:
本文主要描述了如何使用現在熱度和關注度比較高的Pytorch(深度學習框架)構建一個簡單的卷積神經網絡,并對MNIST數據集進行了訓練和測試。MNIST數據集是一個28*28的手寫數字圖片集合,使用測試集來驗證訓練出的模型對手寫數字的識別準確率。
PyTorch資料:
PyTorch的官方文檔鏈接:PyTorch documentation,在這里不僅有 API的說明還有一些經典的實例可供參考。
PyTorch官網論壇:vision,里面會有很大資料分享和一些熱門問題的解答。
PyTorch搭建神經網絡實踐:
在一開始導入需要導入PyTorch的兩個核心庫文件torch和torchvision,這兩個庫基本包含了PyTorch會用到的許多方法和函數
import其中值得一提的是torchvision的datasets可以很方便的自動下載數據集,這里使用的是MNIST數據集。另外的COCO,ImageNet,CIFCAR等數據集也可以很方的下載并使用,導入命令也非常簡單
data_train = datasets.MNIST(root = "./data/",transform=transform,train = True,download = True)data_test = datasets.MNIST(root="./data/",transform = transform,train = False)root指定了數據集存放的路徑,transform指定導入數據集時需要進行何種變換操作,train設置為True說明導入的是訓練集合,否則為測試集合。
transform里面還有很多好的方法,可以用在圖片資源較少的數據集做Data Argumentation操作,這里只是做了個簡單的Tensor格式轉換和Batch Normalize
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize(mean=[0.5,0.5,0.5],std=[0.5,0.5,0.5])])數據下載完成后還需要做數據裝載操作
data_loader_train = torch.utils.data.DataLoader(dataset=data_train,batch_size = 64,shuffle = True)data_loader_test = torch.utils.data.DataLoader(dataset=data_test,batch_size = 64,shuffle = True)batch_size設置了每批裝載的數據圖片為64個,shuffle設置為True在裝載過程中為隨機亂序
下圖為一個batch數據集(64張圖片)的顯示,可以看出來都為28*28的1維圖片
MNIST數據集圖片預覽完成數據裝載后就可以構建核心程序了,這里構建的是一個包含了卷積層和全連接層的神經網絡,其中卷積層使用torch.nn.Conv2d來構建,激活層使用torch.nn.ReLU來構建,池化層使用torch.nn.MaxPool2d來構建,全連接層使用torch.nn.Linear來構建
class Model(torch.nn.Module):def __init__(self):super(Model, self).__init__()self.conv1 = torch.nn.Sequential(torch.nn.Conv2d(1,64,kernel_size=3,stride=1,padding=1),torch.nn.ReLU(),torch.nn.Conv2d(64,128,kernel_size=3,stride=1,padding=1),torch.nn.ReLU(),torch.nn.MaxPool2d(stride=2,kernel_size=2))self.dense = torch.nn.Sequential(torch.nn.Linear(14*14*128,1024),torch.nn.ReLU(),torch.nn.Dropout(p=0.5),torch.nn.Linear(1024, 10))def forward(self, x):x = self.conv1(x)x = x.view(-1, 14*14*128)x = self.dense(x)return x其中定義了torch.nn.Dropout(p=0.5)防止模型的過擬合
forward函數定義了前向傳播,其實就是正常卷積路徑。首先經過self.conv1(x)卷積處理,然后進行x.view(-1, 14*14*128)壓縮扁平化處理,最后通過self.dense(x)全連接進行分類
之后就是對Model對象進行調用,然后定義loss計算使用交叉熵,優化計算使用Adam自動化方式,最后就可以開始訓練了
model = Model() cost = torch.nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters())在訓練前可以查看神經網絡架構了,print輸出顯示如下
Model ((conv1): Sequential ((0): Conv2d(1, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): ReLU ()(2): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(3): ReLU ()(4): MaxPool2d (size=(2, 2), stride=(2, 2), dilation=(1, 1)))(dense): Sequential ((0): Linear (25088 -> 1024)(1): ReLU ()(2): Dropout (p = 0.5)(3): Linear (1024 -> 10)) )定義訓練次數為5次,開始跑神經網絡,訓練完成后輸入測試集合得到的結果如下
Epoch 0/5 ---------- Loss is:0.0003, Train Accuracy is:99.4167%, Test Accuracy is:98.6600 Epoch 1/5 ---------- Loss is:0.0002, Train Accuracy is:99.5967%, Test Accuracy is:98.9200 Epoch 2/5 ---------- Loss is:0.0002, Train Accuracy is:99.6667%, Test Accuracy is:98.7700 Epoch 3/5 ---------- Loss is:0.0002, Train Accuracy is:99.7133%, Test Accuracy is:98.9600 Epoch 4/5 ---------- Loss is:0.0001, Train Accuracy is:99.7317%, Test Accuracy is:98.7300從結果上看還不錯,訓練準確率最高達到了99.73%,測試最高準確率為98.96%。結果有輕微的過擬合跡象,如果使用更加健壯的卷積模型測試集會取得更加好的結果。
隨機對幾張測試集的圖片進行預測,并做可視化展示
Predict Label is: [3, 4, 9, 3] Real Label is: [3, 4, 9, 3]訓練完成后還可以保存訓練得到的參數,方便下次導入后可供直接使用
torch.save(model.state_dict(), "model_parameter.pkl")完整代碼鏈接:JaimeTang/Pytorch-and-mnist(model_parameter.pkl文件較大未做上傳)
微信公眾號:PyMachine
總結
以上是生活随笔為你收集整理的pytorch dropout_PyTorch初探MNIST数据集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第11章 Tkinter 概述
- 下一篇: vue+node实现中间层同步调用接口