PyTorch基础-使用卷积神经网络CNN实现手写数据集识别-07
生活随笔
收集整理的這篇文章主要介紹了
PyTorch基础-使用卷积神经网络CNN实现手写数据集识别-07
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
import numpy as np
import torch
from torch import nn,optim
from torch.autograd import Variable
from torchvision import datasets,transforms
from torch.utils.data import DataLoader
# 訓練集
train_data = datasets.MNIST(root="./", # 存放位置train = True, # 載入訓練集transform=transforms.ToTensor(), # 把數據變成tensor類型download = True # 下載)
# 測試集
test_data = datasets.MNIST(root="./",train = False,transform=transforms.ToTensor(),download = True)
# 批次大小
batch_size = 64
# 裝載訓練集
train_loader = DataLoader(dataset=train_data,batch_size=batch_size,shuffle=True)
# 裝載測試集
test_loader = DataLoader(dataset=test_data,batch_size=batch_size,shuffle=True)
for i,data in enumerate(train_loader):inputs,labels = dataprint(inputs.shape)print(labels.shape)break
??in_channel: 輸入數據的通道數,例RGB圖片通道數為3,灰色圖通道數為1;
out_channel: 輸出數據的通道數,這個根據模型調整;
kennel_size: 卷積核大小,可以是int,或tuple;kennel_size=2,意味著卷積大小2, kennel_size=(2,3),意味著卷積在第一維度大小為2,在第二維度大小為3;
stride:步長,默認為1,與kennel_size類似,stride=2,意味在所有維度步長為2, stride=(2,3),意味著在第一維度步長為2,意味著在第二維度步長為3;
padding: 零填充 如:3X3的卷積窗口就填充1圈零,5X5的卷積窗口就填充2圈零,7X7的卷積窗口就填充3圈零
# 定義網絡結構 class Net(nn.Module):def __init__(self):super(Net,self).__init__()# 初始化# nn.Conv2d(1,32,5,1,2): 通道數,輸出,卷積窗口 步長,填充幾圈0 激活函數relu 最大池化窗口2*2self.conv1 = nn.Sequential(nn.Conv2d(1,32,5,1,2),nn.ReLU(),nn.MaxPool2d(2,2)) # 卷積層self.conv2 = nn.Sequential(nn.Conv2d(32,64,5,1,2),nn.ReLU(),nn.MaxPool2d(2,2)) # 卷積層self.fc1 = nn.Sequential(nn.Linear(64*7*7,500),nn.Dropout(p=0.5),nn.ReLU()) # 全連接層 全連接層 features_in其實就是輸入的神經元個數,features_out就是輸出神經元個數 64*7*7,1000 64個特征圖 大小7*7 輸出500個特征圖self.fc2 = nn.Sequential(nn.Linear(500,10),nn.Softmax(dim=1)) # 全連接層def forward(self,x):# torch.Size([64, 1, 28, 28]) # 卷積中需要傳入4維 批次大小 圖像通道數 圖片大小x = self.conv1(x)x = self.conv2(x)# torch.Size([64, 1, 28, 28]) -> (64,784)x = x.view(x.size()[0],-1) # 4維變2維 (在全連接層做計算只能2維)x = self.fc1(x)x = self.fc2(x)return x # 定義模型 model = Net() # 定義代價函數 mse_loss = nn.CrossEntropyLoss()# 交叉熵 # 定義優化器 optimizer = optim.Adam(model.parameters(),lr=0.5)# 隨機梯度下降 # 定義模型訓練和測試的方法 def train():# 模型的訓練狀態model.train()for i,data in enumerate(train_loader):# 獲得一個批次的數據和標簽inputs,labels = data# 獲得模型預測結果(64,10)out = model(inputs)# 交叉熵代價函數out(batch,C:類別的數量),labels(batch)loss = mse_loss(out,labels)# 梯度清零optimizer.zero_grad()# 計算梯度loss.backward()# 修改權值optimizer.step()def test():# 模型的測試狀態model.eval()correct = 0 # 測試集準確率for i,data in enumerate(test_loader):# 獲得一個批次的數據和標簽inputs,labels = data# 獲得模型預測結果(64,10)out = model(inputs)# 獲得最大值,以及最大值所在的位置_,predicted = torch.max(out,1)# 預測正確的數量correct += (predicted==labels).sum()print("Test acc:{0}".format(correct.item()/len(test_data)))correct = 0for i,data in enumerate(train_loader): # 訓練集準確率# 獲得一個批次的數據和標簽inputs,labels = data# 獲得模型預測結果(64,10)out = model(inputs)# 獲得最大值,以及最大值所在的位置_,predicted = torch.max(out,1)# 預測正確的數量correct += (predicted==labels).sum()print("Train acc:{0}".format(correct.item()/len(train_data))) # 訓練 for epoch in range(10):print("epoch:",epoch)train()test()總結
以上是生活随笔為你收集整理的PyTorch基础-使用卷积神经网络CNN实现手写数据集识别-07的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyTorch基础-Adam优化器使用-
- 下一篇: PyTorch基础-使用LSTM神经网络