手擼神經網路 深度學習環境搭建與簡單神經網路實作圖片分類
文章目錄
- 手擼神經網路 深度學習環境搭建與簡單神經網路實作圖片分類
- 大家可以通過我的公眾號視頻詳細了解:
- 手擼神經網路 全代碼 如下
- 官方安裝教程
- WIN10安裝CUDA10
- CUDA安裝成功!
- WIN10安裝cuDNN
- cuDNN安裝完成!!
大家好,我是cv君 周小夏 從現在開始開啟一個手擼神經網路模塊,和大家一起不做調包俠,自己全手擼神經網路,帶領大家實作各種任務,解決各種問題,尤其是知道神經網路底層原理,讓神經網路更可解釋~ 我所有代碼會開源到github以及各人公眾號 :DeepAI 視界 ,并且我會提交所有的ppt和講解視頻,并且我的視頻已上傳,與一位朋友合作上傳至其他平臺,歡迎大家關注公眾號,了解更多資訊~
大家可以通過我的公眾號視頻詳細了解:
https://mp.weixin.qq.com/s/9HAuQl8MOcfjIBqn8kacvA
先上ppt截圖

















手擼神經網路 全代碼 如下
# -*- coding: utf-8 -*-
# cv君 周小夏
import argparse
from tqdm import tqdm
import torch
import torchvision
from torchvision import datasets, transforms
import numpy as np
import matplotlib.pyplot as plt
class mnist_cls():
def __init__(self):
pass
# 1. 加載MNIST手寫數字資料集資料和標簽
def load_data(self):
"""
資料集較小時(小于2W)建議num_works不用管默認就行,因為用了反而比沒用慢,
當資料集較大時建議采用,num_works一般設定為(CPU執行緒數+-1)為最佳,
可以用以下代碼找出最佳num_works(注意windows用戶如果要使用多核多執行緒
必須把訓練放在if __name__ == '__main__':下才不會報錯)
"""
transform = transforms.Compose([transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))])
trainset = datasets.MNIST(root='./data', train=True,
download=True, transform=transform)
self.trainsetloader = torch.utils.data.DataLoader(trainset, batch_size=20000, shuffle=True, pin_memory=True)
testset = datasets.MNIST(root='./data', train=True,
download=True, transform=transform)
self.testsetloader = torch.utils.data.DataLoader(testset, batch_size=20000, shuffle=True, pin_memory=True)
"""
圖片可視化
"""
def show_images(self, trainsetloader):
dataiter = iter(trainsetloader)
images, labels = dataiter.next()
plt.imshow(images[0].numpy().squeeze())
plt.show()
print(images.shape)
print(labels.shape)
def define_NN(self):
# 2. 設計神經網路結構
first_in, first_out, second_out = 28 * 28, 128, 10
self.model = torch.nn.Sequential(
torch.nn.Linear(first_in, first_out),
torch.nn.ReLU(),
torch.nn.Linear(first_out, second_out),
).to(args.device)
# 3. 定義損失函式
self.loss_fn = torch.nn.CrossEntropyLoss()
# 4. 設定用于自動調節神經網路引數的優化器
learning_rate = 1e-4 # 1.5e-4
self.optimizer = torch.optim.Adam(self.model.parameters(), lr=learning_rate)
# self.optimizer = torch.optim.SGD(self.model.parameters(), lr=learning_rate)
# 5. 訓練神經網路(10個epochs)
def train(self):
self.load_data()
self.define_NN()
tq = tqdm(range(args.epochs))
best = 1000
for t in tq:
for i, one_batch in enumerate(self.trainsetloader, 60):
data, label = one_batch
data = data.to(args.device)
label = label.to(args.device)
data[0].view(1, 784) # 將28x28的圖片變成784的向量
data = data.view(data.shape[0], -1)
# 讓神經網路根據現有的引數,根據當前的輸入計算一個輸出
model_output = self.model(data)
# 5.1 用所設計算損失(誤差)函式計算誤差
loss = self.loss_fn(model_output, label)
tq.set_description("Loss %.4f" % float(loss.item()))
tq.set_postfix({"Best_loss": best})
tq.update(1)
# if i% 500 == 0:
# print('loss:', loss)
# 5.2 每次訓練前清零之前計算的梯度(導數)
self.optimizer.zero_grad()
# 5.3 根據誤差反向傳播計算誤差對各個權重的導數
loss.backward()
# 5.4 根據優化器里面的演算法自動調整神經網路權重
self.optimizer.step()
# 保存下訓練好的模型,省得下次再重新訓練
if loss <= best:
best = loss.item()
torch.save(self.model.state_dict(), args.weights)
print('Best model saved! Epoch:', t)
def detect(self):
self.load_data()
self.define_NN()
self.model.load_state_dict(torch.load(args.weights))
# 6. 用這個神經網路解決你的問題,比如手寫數字識別,輸入一個圖片矩陣,然后模型回傳一個數字
testdataiter = iter(self.testsetloader)
testimages, testlabels = testdataiter.next()
plt.imshow(testimages[0].numpy().squeeze())
plt.show()
testimages = testimages.to(args.device)
testlabels = testlabels.to(args.device)
img_vector = testimages[0].squeeze().view(1, -1)
# 模型回傳的是一個1x10的矩陣,第幾個元素值最大那就是表示模型認為當前圖片是數字幾
result_digit = self.model(img_vector)
print("該手寫數字圖片識別結果為:", result_digit.max(1)[1].item(), "標注的標簽為:", testlabels[0].item())
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--epochs', default=300, help='training epochs')
parser.add_argument('--method', default='test', help='train to run, test or val')
parser.add_argument('--weights', default='./my_handwrite_recognize_model.pt', help='save the weight')
parser.add_argument('--device', default='cuda', help='cuda or cpu')
args = parser.parse_args()
mnist = mnist_cls()
if 'test' in args.method:
mnist.detect()
elif 'train' in args.method:
mnist.train()
else:
print('please check the argparse!')
主要是使用的兩層全連接,直接就能得到不錯的準確率~ 我們目的是走一套簡單完整的應用,實測可用,歡迎大家關注~
資料會自動下載,如果覺得下載過慢,歡迎關注我的公眾號下載:公眾號回復:手擼神經網路 獲取哦~
另外附帶一下詳細的ppt介紹的內容~
官方安裝教程
CUDA:https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html
cuDNN:https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html#installwindows
WIN10安裝CUDA10
CUDA Toolkit 10.0 Download:https://developer.nvidia.com/cuda-downloads
按圖下載,(可以離線安裝[local],也可在線下載安裝[network]),
下載完成后,打開安裝程式:
安裝路徑可以默認也可以自定義,之后點擊ok就行,
等待,,,,,,
繼續等待,,,,,,
點擊同意并繼續
如果不知道怎么選,就選擇精簡安裝,
我也不知道按那個,so 我全部安裝??
可以選擇默認路徑或者自定義安裝路徑,記下安裝的路徑,
最終“下一步”,然后“完成”就行,
配置系統環境變數,選擇path:
如圖:
檢查是否有下圖中的兩個環境變數
驗證安裝:nvcc -V
CUDA安裝成功!
WIN10安裝cuDNN
cuDNN Download:https://developer.nvidia.com/rdp/cudnn-download
(進入網頁下載當然要注冊賬號,如果有就不用了)
注意要打勾才顯示下載串列,按照自己的需要下載安裝:
下載后,將下載檔案解壓,然后 copy------》past
按照自己的情況來,圖中是我的解壓和安裝路徑:(注意是路徑中的檔案)
添加環境變數:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\lib\x64
cuDNN安裝完成!!
輸入nvcc -V 測驗即可
其他內容請看視頻~
再上一張測驗集:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NaIGQfQO-1611899164428)(D:\CSDN\pic_new\ai\1611898507185.png)]](https://img.uj5u.com/2021/01/30/2199533013584118.png)

老規矩了關注我的公眾號,一起進入AI知識星球吧
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/254497.html
標籤:AI
