使用卷積神經網絡識別MNIST數據集

卷積神經網絡

卷積神經網絡本質是共享權重+稀疏鏈接的全連接網絡

編寫步驟

構建一個神經網絡,步驟是幾乎不變的,大概有以下幾步

  • 準備數據集
#更高級的CNN網絡
import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
import torchvision.transforms as transforms
import torch.optim as optim
#準備數據集
batch_size = 64transforms = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,),(0.3081,))])trainset = torchvision.datasets.MNIST(root=r'../data/mnist',train=True,download=True,transform=transforms)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, shuffle=True)testset = torchvision.datasets.MNIST(root=r'../data/mnist',train=False,download=True,transform=transforms)
testloader = torch.utils.data.DataLoader(testset, batch_size=batch_size, shuffle=False)

不使用官方數據集讀取方法,可以自己繼承Dataset類重寫

class Mydataset(Dataset):def __init__(self,filepath):xy=np.loadtxt(filepath,delimiter=',',dtype=np.float32)self.len=xy.shape[0]self.x_data=torch.from_numpy(xy[:,:-1])self.y_data=torch.from_numpy(xy[:,[-1]])#魔法方法,容許用戶通過索引index得到值def __getitem__(self,index):return self.x_data[index],self.y_data[index]def __len__(self):return self.len
  • 構建模型
class CNN_net(nn.Module):def __init__(self):super(CNN_net, self).__init__()self.conv1 = nn.Conv2d(1, 10, kernel_size=3, bias=False)#輸出存為[10,26,26]self.conv2 = nn.Conv2d(10, 20, kernel_size=3, bias=False)#輸出為【20,5,5】self.pooling = nn.MaxPool2d(2, 2)#輸出為將其中尺寸減半self.fc1 = nn.Linear(500, 10)def forward(self, x):batch_size = x.size(0)x = F.relu(self.pooling(self.conv1(x)))x = F.relu(self.pooling(self.conv2(x)))#x = x.view(batch_size, -1)#(x.size())x = F.relu(self.fc1(x))return x

如果想使用殘差網絡可以定義殘差網絡塊兒

# 定義殘差網絡塊兒
class ResidualBlock(nn.Module):def __init__(self, channels):super(ResidualBlock, self).__init__()self.conv1 = nn.Conv2d(channels, kernel_size=3, padding=1, bias=False)self.conv2 = nn.Conv2d(channels,channels, kernel_size=3, padding=1, bias=False)def forward(self, x):out = F.relu(self.conv1(x))out = self.conv2(out)return F.relu(out + x)

那么對應的forward哪里可以添加進去殘差塊


class CNN_net(nn.Module):def __init__(self):super(CNN_net, self).__init__()self.conv1 = nn.Conv2d(1, 10, kernel_size=3, bias=False)#輸出存為[10,26,26]self.conv2 = nn.Conv2d(10, 20, kernel_size=3, bias=False)#輸出為【20,5,5】self.resblock1 = ResidualBlock(10)self.resblock2 = ResidualBlock(20)self.pooling = nn.MaxPool2d(2, 2)#輸出為將其中尺寸減半self.fc1 = nn.Linear(500, 10)def forward(self, x):batch_size = x.size(0)x = F.relu(self.pooling(self.conv1(x)))x=self.resblock1(x)x = F.relu(self.pooling(self.conv2(x)))x = self.resblock2(x)x = x.view(batch_size, -1)#(x.size())x = F.relu(self.fc1(x))return x
  • 構建模型和損失函數
# 構建模型和損失
model=CNN_net()# 定義一個設備,如果我們=有能夠訪問的CUDA設備
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(torch.cuda.is_available())
#將模型搬移到CUDA支持的GPU上面
model.to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
  • 訓練(和測試)模型
def train(epoch):running_loss = 0.0for batch_idx, (inputs, targets) in enumerate(trainloader):inputs,targets = inputs.to(device),targets.to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, targets)loss.backward()optimizer.step()#需要將張量轉換為浮點數運算running_loss += loss.item()if batch_idx % 100 == 0:print('Train Epoch: {}, Loss: {:.6f}'.format(epoch, loss.item()))running_loss = 0
def test(epoch):correct = 0total = 0with torch.no_grad():for batch_idx, (inputs, targets) in enumerate(testloader):inputs,targets = inputs.to(device),targets.to(device)outputs = model(inputs)_, predicted = torch.max(outputs.data, 1)total += targets.size(0)correct=correct+(predicted.eq(targets).sum()*1.0)print('Accuracy of the network on the 10000 test images: %d %%' % (100*correct/total))

全部代碼

#更高級的CNN網絡
import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
import torchvision.transforms as transforms
import torch.optim as optim
#準備數據集
batch_size = 64
transforms = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,),(0.3081,))])trainset = torchvision.datasets.MNIST(root=r'../data/mnist',train=True,download=True,transform=transforms)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, shuffle=True)testset = torchvision.datasets.MNIST(root=r'../data/mnist',train=False,download=True,transform=transforms)
testloader = torch.utils.data.DataLoader(testset, batch_size=batch_size, shuffle=False)# 定義殘差網絡塊兒
class ResidualBlock(nn.Module):def __init__(self, channels):super(ResidualBlock, self).__init__()self.conv1 = nn.Conv2d(channels,channels, kernel_size=3, padding=1, bias=False)self.conv2 = nn.Conv2d(channels,channels, kernel_size=3, padding=1, bias=False)def forward(self, x):out = F.relu(self.conv1(x))out = self.conv2(out)return F.relu(out + x)
# 定義卷積神經網絡class CNN_net(nn.Module):def __init__(self):super(CNN_net, self).__init__()self.conv1 = nn.Conv2d(1, 10, kernel_size=3, bias=False)#輸出存為[10,26,26]self.conv2 = nn.Conv2d(10, 20, kernel_size=3, bias=False)#輸出為【20,5,5】self.resblock1 = ResidualBlock(10)self.resblock2 = ResidualBlock(20)self.pooling = nn.MaxPool2d(2, 2)#輸出為將其中尺寸減半self.fc1 = nn.Linear(500, 10)def forward(self, x):batch_size = x.size(0)x = F.relu(self.pooling(self.conv1(x)))x=self.resblock1(x)x = F.relu(self.pooling(self.conv2(x)))x = self.resblock2(x)x = x.view(batch_size, -1)#(x.size())x = F.relu(self.fc1(x))return x# 構建模型和損失
model=CNN_net()# 定義一個設備,如果我們=有能夠訪問的CUDA設備
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(torch.cuda.is_available())
#將模型搬移到CUDA支持的GPU上面
model.to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)def train(epoch):running_loss = 0.0for batch_idx, (inputs, targets) in enumerate(trainloader):inputs,targets = inputs.to(device),targets.to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, targets)loss.backward()optimizer.step()#需要將張量轉換為浮點數運算running_loss += loss.item()if batch_idx % 100 == 0:print('Train Epoch: {}, Loss: {:.6f}'.format(epoch, loss.item()))running_loss = 0
def test(epoch):correct = 0total = 0with torch.no_grad():for batch_idx, (inputs, targets) in enumerate(testloader):inputs,targets = inputs.to(device),targets.to(device)outputs = model(inputs)_, predicted = torch.max(outputs.data, 1)total += targets.size(0)correct=correct+(predicted.eq(targets).sum()*1.0)print('Accuracy of the network on the 10000 test images: %d %%' % (100*correct/total))
if __name__ == '__main__':for epoch in range(10):train(epoch)test(epoch)

運行結果如下所示:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75212.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75212.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75212.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣125.驗證回文串

如果在將所有大寫字符轉換為小寫字符、并移除所有非字母數字字符之后,短語正著讀和反著讀都一樣。則可以認為該短語是一個 回文串 。 字母和數字都屬于字母數字字符。 給你一個字符串 s,如果它是 回文串 ,返回 true ;否則&#…

UR機械臂sim2real推薦包

推薦一個和ur機械臂配套的interface: ur_rtde Universal Robots RTDE C Interface — ur_rtde 1.6.0 documentation 也歡迎大家提供新想法和bug

CST學習筆記(三)MATLAB與CST聯合仿真-遠場數據批量導出

CST學習筆記(三)MATLAB與CST聯合仿真-遠場數據批量導出 一、直接數據導出 (1)打開遠場,調至笛卡爾坐標系 (2)然后點擊post processing → Import/Export → Plot Data (ASCII) ,即…

藍橋杯---BFS解決FloofFill算法1---圖像渲染

文章目錄 1.算法簡介2.題目概述3.算法原理4.代碼分析 1.算法簡介 這個算法是關于我們的floodfill的相關的問題,這個算法其實從名字就可以看出來:洪水灌溉,其實這個算法的過程就和他的名字非常相似,下面的這個圖就生動的展示了這個…

我與數學建模之啟程

下面的時間線就是從我的大二上開始 9月開學就迎來了本科階段最重要的數學建模競賽——國賽,這個比賽一般是在9月的第二周開始。 2021年國賽是我第一次參加國賽,在報名前我還在糾結隊友,后來經學長推薦找了另外兩個學長。其實第一次國賽沒啥…

利用 SSRF 和 Redis 未授權訪問進行內網滲透

目錄 環境搭建 ?編輯 發現內網存活主機 ?編輯 掃描內網端口 ?編輯 利用 Redis 未授權訪問進行 Webshell 寫入 步驟1:生成 payload 方式1:使用python生成 payload 方式二:使用 Gopher 工具 步驟 2:寫入 Webshell&#xf…

【Vue2插槽】

Vue2插槽 Vue2插槽默認插槽子組件代碼(Child.vue)父組件代碼(Parent.vue) 命名插槽子組件代碼(ChildNamed.vue)父組件代碼(ParentNamed.vue) 代碼解釋 Vue2插槽 Vue2插槽 下面為你詳…

ORB-SLAM學習感悟記錄

orb特征點的旋轉不變性 利用灰度質心法求出的質心后,與形心連線所形成的角度如下圖所示: 這里容易對上圖進行誤解: 為了保證旋轉不變性,這里注意ORB-slam是利用這個角度旋轉坐標系,以新坐標系為標準從圖像中采點進行…

搜索算法------深度優先搜索

1. 介紹 深度優先搜索(Depth-First Search,DFS)是一種用于遍歷或搜索樹或圖的算法。這種算法通過盡可能深地搜索圖的分支來探索解決方案空間,直到達到一個沒有分支的點,然后回溯 1.1 原理 選擇起始點:從…

4.2 單相機引導機器人放料-僅考慮角度變化

【案例說明】 本案例產品在托盤中,角度變化不大(<15度);抓取沒有問題,只是放的穴位只能容許3度的角度偏差,因此需要測量產品的角度。 思路是:機器人抓料后、去固定拍照位拍照(找到與標準照片的角度偏差),機器人在放料的位置上多旋轉這個角度偏差,把產品放進去。 …

六級詞匯量積累day13

commend 表揚 exhaust 耗盡&#xff0c;用盡 weary 疲憊的&#xff0c;勞累的 fatigue 疲憊&#xff0c;勞累 obese 臃腫的&#xff0c;肥胖的 adopt 采納&#xff0c;收養 adapt 適應 accomplish 完成&#xff0c;實現 accomplishment 成就 achieve 實現&#xff0c;完成 achi…

醫院信息系統與AI賦能的介紹

隨著醫療行業的不斷發展&#xff0c;醫院信息系統&#xff08;HIS&#xff0c;Hospital Information System&#xff09;已經成為現代醫療服務不可或缺的一部分。醫院信息系統通過數字化、信息化手段&#xff0c;有效地整合了醫院內部的醫療、財務、后勤等各個業務環節&#xf…

突發,國行 iPhone 17,支持 eSIM

古人云“無心生大用”&#xff0c;往往你感到絕望的時候&#xff0c;轉機就莫名其妙的來了。 根據供應鏈的最新消息&#xff0c;國行 iPhone 17 Air&#xff0c;有望用上 eSIM。 不僅如此&#xff0c;國產手機廠商&#xff0c;也計劃推出類似iPhone 17 Air的超薄機型&#xf…

【C++項目】從零實現RPC框架「三」:項?抽象層實現

?? 個人主頁:Zfox_ ?? 系列專欄:C++從入門到精通 目錄 一:?? 常?的零碎功能接?類實現?? 簡單?志宏實現?? Json 序列化/反序列化?? UUID ?成二:?? 項?消息類型字段信息定義 ?? 請求字段宏定義?? 消息類型定義?? 響應碼類型定義?? RPC 請求類型定…

Hadoop集群常用指令詳解

在大數據處理領域&#xff0c;Hadoop作為分布式計算和存儲的開源框架&#xff0c;已經成為不可或缺的工具。掌握Hadoop集群的常用指令對于集群的日常管理和操作至關重要。本文將詳細介紹Hadoop集群的常用指令&#xff0c;幫助讀者更好地理解和使用Hadoop。 一、Hadoop集群的啟…

幾種常見的.NET單元測試模擬框架介紹

目錄 1. Moq 2. NSubstitute 3. AutoFixture 4. FakeItEasy 總結對比 單元測試模擬框架是一種在軟件開發中用于輔助單元測試的工具。 它的主要作用是創建模擬對象來替代真實對象進行測試。在單元測試中&#xff0c;被測試的代碼可能依賴于其他組件或服務&#xff0c;如數…

藍橋杯備賽之枚舉

用循環等方式依次去枚舉所有的數字組合&#xff0c;一一驗證是否符合題目的要求 題目鏈接 0好數 - 藍橋云課 題目解析 好數的概念: 數的奇數位位奇數,偶數位為偶數,就是一個好數 求輸入n里面有多少個好數 題目原理 1> 遍歷每個數 2> 每次遍歷判斷是不是好數 把這…

9、tlm 事務交互通信

1、TLM&#xff08;Transaction-Level Modeling&#xff09; 是 SystemC 的高級建模方法&#xff0c;用于描述系統的通信行為&#xff0c;特別是在硬件設計和驗證中。TLM 是 SystemC 的一部分&#xff0c;用于提高仿真的效率和抽象性。以下是 TLM 的核心知識以及關鍵概念。 2、…

小白入門機器學習概述

文章目錄 一、引言二、機器學習的基礎概念1. 機器學習的定義2. 機器學習的類型&#xff08;1&#xff09;監督學習&#xff08;Supervised Learning&#xff09;&#xff08;2&#xff09;無監督學習&#xff08;Unsupervised Learning&#xff09;&#xff08;3&#xff09;半…

smartdns 在企業場景中的應用心得

smartdns 是一款優秀的本地dns服務器&#xff0c;默認開啟的配置在小型環境下足夠使用(50臺終端)&#xff0c;在面對中大型網絡環境時&#xff08;100臺終端&#xff0c;且有多層網絡結構&#xff09;&#xff0c;需要增加更多的配置來確保穩定運行。 一、刪除注釋&#xff0c;…