日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pytorch dropout_PyTorch初探MNIST数据集

發布時間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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数据集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。