最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PyTorch實現手寫數字識別的示例代碼

 更新時間:2022年05月31日 09:56:25   作者:B.Bz  
本文主要介紹了PyTorch實現手寫數字識別的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下<BR>

加載手寫數字的數據

組成訓練集和測試集,這里已經下載好了,所以download為False

import torchvision

# 是否支持gpu運算
# device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# print(device)
# print(torch.cuda.is_available())


# 加載訓練集的數據  使用torchvision自帶的MNIST數據集
train_dataset = torchvision.datasets.MNIST(root='./data1',
                                           train=True,
                                           transform=torchvision.transforms.ToTensor(),
                                           download=False
                                           )

# 加載測試集的數據  創(chuàng)建測試集
test_dataset = torchvision.datasets.MNIST(root='./data1',
                                          train=False,
                                          transform=torchvision.transforms.ToTensor(),
                                          download=False
                                          )

數據加載器(分批加載)

# 加載數據的批次 一批有多少條數據
batch_size = 100
# 創(chuàng)建數據加載器shuffle為True 加載時打亂
train_loader = DataLoader(dataset=train_dataset,
                          batch_size=batch_size,
                          shuffle=True
                          )
test_loader = DataLoader(dataset=test_dataset,
                         batch_size=batch_size,
                         shuffle=True
                         )
# 數據加載器生成的對象轉為迭代器
examples = iter(test_loader)
# 使用next方法獲取到一批次的數據
example_data, example_targets = examples.next()
# 遍歷獲取到6條數據 展示觀察一下
for i in range(6):
    plt.subplot(2, 3, i + 1)
    plt.imshow(example_data[i][0], cmap='gray')
    # 查看圖片的大小 方便建立模型時輸入的大小
    print(example_data[i][0].shape)

plt.show()

建立模型

建立模型之前定義輸入大小和分類類別輸出大小

通過上邊查看圖片的大小為28*28*1,所以輸入大小為784

數字識別只有0~9所以為10個類別的多分類問題

input_size = 784
num_classes = 10

創(chuàng)建模型類

class NeuralNet(torch.nn.Module):
    def __init__(self, n_input_size, hidden_size, n_num_classes):
        """
        神經網絡類初始化
        :param n_input_size: 輸入
        :param hidden_size: 隱藏層
        :param n_num_classes: 輸出
        """
        # 調用父類__init__方法
        super(NeuralNet, self).__init__()
        self.input_size = input_size
        # 第一層線性模型 傳入輸入層和隱藏層
        self.l1 = torch.nn.Linear(n_input_size, hidden_size)
        # relu激活函數層
        self.relu = torch.nn.ReLU()
        # 第二層線性模型 傳入隱藏層和輸出層
        self.l2 = torch.nn.Linear(hidden_size, n_num_classes)

    def forward(self, x):
        """
        重寫正向傳播函數  獲取到預測值
        :param x: 數據
        :return: 預測值
        """
        # 線性模型
        out = self.l1(x)
        # 激活函數
        out = self.relu(out)
        # 線性模型2
        out = self.l2(out)
        # 返回預測值
        return out


# 獲取到gpu設備
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# 創(chuàng)建模型并把模型放到當前支持的gpu設備中
model = NeuralNet(input_size, 500, num_classes).to(device)
print(model)

  • 可以看出模型一共三層
  • 輸入層(節(jié)點數量和圖小大小相同)
  • 隱藏層(節(jié)點數為500)
  • 輸出層(輸出節(jié)點數量為10 0~9

定義損失函數和優(yōu)化器

  • 因為是多分類問題,所以使用交叉熵函數的多分類損失函數
  • 因為傳統(tǒng)的梯度下降存在一定缺陷,比如學習速率一直不變,所以使用PyTorch中梯度下降的優(yōu)化算法Adam算法
# 定義學習率
learning_rate = 0.01
# 損失函數
criterion = torch.nn.CrossEntropyLoss()
# 定義優(yōu)化器 參數1為模型的參數 lr為學習率
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

模型訓練

訓練步驟:

  • 通過模型類正向傳播獲取到預測結果
  • 通過損失函數傳入預測結果和真實值計算損失
  • 通過反向傳播獲取梯度
  • 通過梯度下降更新模型參數的權重
  • 梯度清空,防止下次梯度累加
  • 循環(huán),降低損失為我們想要的結果(提高模型精度)
# 定義訓練的次數
num_epochs = 10
# 訓練集數據的總長度
total_steps = len(train_loader)
# 遍歷訓練次數
for epoch in range(num_epochs):
    # 每次從數據加載器中取出一批數據  每批次100條
    for i, (images, labels) in enumerate(train_loader):
        # 把圖片降維到一維數組  加載到gpu
        images = images.reshape(-1, 28 * 28).to(device)
        # 真實值加載到gpu
        labels = labels.to(device)
        # 正向傳播 獲取到預測值
        outputs = model(images)
        # 通過損失函數獲取到損失值
        loss_val = criterion(outputs, labels)
        # 清空梯度
        optimizer.zero_grad()
        # 進行反向傳播
        loss_val.backward()
        # 梯度下降更新參數
        optimizer.step()
        # 打印每次訓練的損失值
        if i % 100 == 0:
            print(f'Loss:{loss_val.item():.4f}')

print('訓練完成')
# 訓練完之后保存模型
torch.save(model.state_dict(), './last.pt')

  • 損失值很明顯的在收斂
  • 生成了pt模型文件

測試集抽取數據,查看預測結果

# 把測試集的數據加載器轉為生成器
examples = iter(test_loader)
# next()方法獲取一批數據
example_data, example_targets = examples.next()

# 拿出前三條
for i in range(3):
    # 畫圖展示
    plt.subplot(1, 3, i + 1)
    plt.imshow(example_data[i][0], cmap='gray')
plt.show()

images = example_data
# 圖片將為加載到GPU
images = images.reshape(-1, 28 * 28).to(device)
# 正向傳播獲取預測結果
outputs = model(images)
# 打印結果 detach()方法結果不會計算梯度更新 轉為numpy
print(f'真實結果:{example_targets[0:3].detach().numpy()}')
# 預測完的結果為10個數字的概率 使用argmax()根據行歸一化并求自變量的概率最大值
print(f'預測結果:{np.argmax(outputs[0:3].cpu().detach().numpy(), axis=1)}')

計算模型精度

# 用測試集的數據,校驗模型的準確率
with torch.no_grad():
    n_correct = 0
    n_samples = 0
    # 取出測試集數據
    for images, labels in test_loader:
        # 和訓練代碼一致
        images = images.reshape(-1, 28 * 28).to(device)
        labels = labels.to(device)
        outputs = model(images)

        # 返1 最大值 返2 索引                0每列最大值  1每行最大值
        _, predicted = torch.max(outputs.data, 1)
        n_samples += labels.size(0)
        n_correct += (predicted == labels).sum().item()
    # 計算模型精度
    acc = 100.0 * n_correct / n_samples
    print(f"準確率:{acc}%")

自己手寫數字進行預測

import cv2
import numpy as np

import torch

from 手寫數字神經網絡結構 import NeuralNet

# 獲取到gpu設備
device = torch.device('cuda')
# 加載保存好的模型
input_size = 784
num_classes = 10
model = NeuralNet(input_size, 500, num_classes)
# 因為保存模型時在GPU所以要指定map_location='cuda:0'
model.load_state_dict(torch.load('./last.pt', map_location='cuda:0'))
# 加載到gpu上
model.to(device)

# 局域內不計算梯度
with torch.no_grad():
    # cv2讀取圖片 灰度方式
    images = cv2.imread('./number_four.png', cv2.IMREAD_GRAYSCALE)
    # 使用大津算法進行二值化處理 并反轉
    ret, thresh_img = cv2.threshold(images, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
    # 展示處理過后的圖片
    cv2.imshow('png1', thresh_img)
    cv2.waitKey()
    # 圖片降維 把拍的圖片降維到和訓練時的圖片大小一樣
    my_image = cv2.resize(thresh_img, (28, 28))
    # 轉為numpy
    my_image = np.array(my_image, np.float32)
    # 轉為torch的張量
    my_image = torch.from_numpy(my_image)
    # 降維
    my_image = my_image.reshape(-1, 28 * 28).to(device)
    # 正向傳播獲取預測值
    outputs = model(my_image)
    # 取出預測結果
    pred = np.argmax(outputs.cpu().detach().numpy(), axis=1)
    print(f'預測結果為:{pred[0]}')

 到此這篇關于PyTorch實現手寫數字識別的示例代碼的文章就介紹到這了,更多相關PyTorch 手寫數字識別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python如何計算兩個不同類型列表的相似度

    Python如何計算兩個不同類型列表的相似度

    在編程中,經常需要比較兩個列表的相似度,尤其是當這兩個列表包含不同類型的元素時,下面小編就來講講如何使用Python計算兩個不同類型列表的相似度吧
    2025-02-02
  • python django下載大的csv文件實現方法分析

    python django下載大的csv文件實現方法分析

    這篇文章主要介紹了python django下載大的csv文件實現方法,結合實例形式分析了Django框架下載csv大文件的相關操作技巧與注意事項,需要的朋友可以參考下
    2019-07-07
  • Python封裝adb命令的操作詳解

    Python封裝adb命令的操作詳解

    在日常的 Android 項目開發(fā)中,我們通常會使用 adb 命令來獲取連接設備的內存、屏幕、CPU等信息,這些信息的獲取,每次都在command 中輸入相關命令進行重復的操作讓人感到厭倦和疲乏,現在,可以嘗試使用 python 來簡化這一部分工作,所以本文介紹了Python封裝adb命令的操作
    2024-01-01
  • python 實現Flask中返回圖片流給前端展示

    python 實現Flask中返回圖片流給前端展示

    今天小編就為大家分享一篇python 實現Flask中返回圖片流給前端展示,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python中requirements.txt簡介(推薦)

    Python中requirements.txt簡介(推薦)

    Python項目中必須包含一個?requirements.txt?文件,用于記錄所有依賴包及其精確的版本號,以便新環(huán)境部署,這篇文章主要介紹了Python中requirements.txt簡介,需要的朋友可以參考下
    2022-11-11
  • 淺談tensorflow語義分割api的使用(deeplab訓練cityscapes)

    淺談tensorflow語義分割api的使用(deeplab訓練cityscapes)

    這篇文章主要介紹了淺談tensorflow語義分割api的使用(deeplab訓練cityscapes),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python get獲取頁面cookie代碼實例

    Python get獲取頁面cookie代碼實例

    利用Python get獲取頁面cookie代碼實例,簡單易懂
    2018-09-09
  • python虛擬機之描述器實現原理與源碼分析

    python虛擬機之描述器實現原理與源碼分析

    在本篇文章當中主要給大家介紹描述器背后的實現原理,通過分析?cpython對應的源代碼了解與描述器相關的字節(jié)碼的指令,我們就可以真正了解到描述器背后的原理,需要的朋友可以參考下
    2023-05-05
  • python 操作excel表格的方法

    python 操作excel表格的方法

    這篇文章主要介紹了python 操作excel表格的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • 簡單學習Python多進程Multiprocessing

    簡單學習Python多進程Multiprocessing

    這篇文章主要和大家一起簡單的學習Python多進程Multiprocessing ,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評論

昆明市| 通化县| 宜黄县| 嘉兴市| 齐齐哈尔市| 临澧县| 米脂县| 华池县| 南宫市| 万荣县| 福建省| 万荣县| 南昌市| 奈曼旗| 赤水市| 鹤山市| 宁陵县| 葵青区| 桑日县| 浦江县| 突泉县| 温州市| 大竹县| 全椒县| 汉中市| 宁阳县| 阳东县| 福贡县| 湟源县| 巴南区| 曲麻莱县| 班戈县| 天柱县| 聂荣县| 绥芬河市| 泸溪县| 鄂州市| 玛曲县| 延寿县| 邢台市| 靖远县|