CNN 卷積神經網絡 手寫數字 圖像識別 (深度學習)


@


✌ 卷積神經網絡手寫數字圖像識別

1、✌ 導入相關庫

# pytorch框架
import torch
from torch import nn,optim
from torchvision import datasets,transforms
from torch.utils.data import DataLoader

# 加載圖片
from PIL import Image
from torchvision import models

2、✌ 導入手寫數據集

# 從指定路徑加載數據集,不下載,並將其轉化為Tensor格式
train_dataset = datasets.MNIST(root='./',
                train=True,
                transform=transforms.ToTensor(),
                download=False)

test_dataset = datasets.MNIST(root='./',
               train=False,
               transform=transforms.ToTensor(),
               download=False)

3、✌ 定義數據包裝器

# 每批的數據為64個,用於數據加載,shuffle為打亂數據
batch_size=64
train_loader=DataLoader(dataset=train_dataset,
                       batch_size=batch_size,
                       shuffle=True)
test_loader=DataLoader(dataset=test_dataset,
                      batch_size=batch_size,
                      shuffle=True)

4、✌ 查看數據維度

# 該維度表示64張圖片,每張的channel為1,寬高為28,28
for i, data in enumerate(train_loader):
    inputs, labels = data
    print(inputs.shape)
    print(labels.shape)
    break

在這里插入圖片描述

5、✌ 定義卷積網絡層

# nn.Module
class CNN(nn.Module):
	# 初始化相關網絡層
    def __init__(self):
    	# 初始化父類
        super(CNN,self).__init__()
        # 定義第一個卷積層
        self.conv1=nn.Sequential(nn.Conv2d(1,64,5,1,2),nn.ReLU(),nn.MaxPool2d(2,2))
        # 定義第二個卷積層
        self.conv2=nn.Sequential(nn.Conv2d(64,128,5,1,2),nn.ReLU(),nn.MaxPool2d(2,2))
        # 定義全連接層
        self.fc1=nn.Sequential(nn.Linear(128*7*7,1000),nn.Dropout(p=0.2),nn.ReLU())
        self.fc2=nn.Sequential(nn.Linear(1000,10),nn.Softmax(dim=1))
    # 定義傳播函數
    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = x.reshape(x.shape[0], -1)
        x = self.fc1(x)
        x = self.fc2(x)
        return x

6、✌ 定義模型與損失函數、優化器

# 學習率
LR=0.0003
# 定義模型
model=CNN()
# 定義損失函數:交叉熵
loss_fn=nn.CrossEntropyLoss()
# 定義優化器
optimizer=optim.Adam(model.parameters(),LR)

7、✌ 訓練、測試函數

def train():
    model.train()
    for i,data in enumerate(train_loader):
        x,y=data
        # 預測結果
        y_pred=model(x)
        # 計算損失
        loss=loss_fn(y_pred,y)
        # 梯度清0
        optimizer.zero_grad()
        # 計算梯度
        loss.backward()
        # 修改權值
        optimizer.step()
def test():
    model.eval()
    correct=0
    for i,data in enumerate(train_loader):
        x,y=data
        y_pred=model(x)
        _,pred=torch.max(y_pred,1)
        correct+=(pred==y).sum()
    print('准確率:',correct.item()/len(train_dataset))
    correct = 0
    for i, data in enumerate(test_loader):
        x,y=data
        y_pred=model(x)
        _,pred=torch.max(y_pred,1)
        correct+=(pred==y).sum()
    print('准確率:',correct.item()/len(test_dataset))

8、✌ 網絡迭代訓練

# 訓練10次模型,不斷修改權重
for epoch in range(1,11):
    print('epoch:',epoch)
    train()
    test()

在這里插入圖片描述

9、✌ 保存模型

# 將模型的參數保存到D盤
torch.save(model.state_dict(),r'D:\res.pth')

10、✌ 加載模型

# 重新定義模型,加載保存的參數
model=CNN()
model.load_state_dict(torch.load(r'D:\res.pth'))
loss_fn=nn.CrossEntropyLoss()
optimizer=optim.Adam(model.parameters(),LR)

11、✌ 模型測試

在這里插入圖片描述

# 將圖片轉化為Tensor
transform = transforms.Compose([
    transforms.ToTensor() 
])
# 打開圖片
img=Image.open(r'C:\Users\HUAWEI\Desktop\7.jpg')
# 改變圖片大小
img=img.resize((28,28))
# 圖片灰度化
img=img.convert('L')
# 將圖片增加一個維度,卷積層需要4維
img=transform(img).unsqueeze(0)
out=model(img)
_,pred=torch.max(out,1)
print('該數字為:',pred.item())

在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM