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
CUDA Toolkit 10.0 Download:https://developer.nvidia.com/cuda-downloads
按图下载。(可以离线安装[local],也可在线下载安装[network])。
下载完成后,打开安装程序:
安装路径可以默认也可以自定义。之后点击ok就行。
等待。。。。。。
继续等待。。。。。。
点击同意并继续
如果不知道怎么选,就选择精简安装。
我也不知道按那个,so 我全部安装??
可以选择默认路径或者自定义安装路径,记下安装的路径。
最终“下一步”,然后“完成”就行。
配置系统环境变量,选择path:
如图:
检查是否有下图中的两个环境变量
验证安装:nvcc -V
cuDNN Download:https://developer.nvidia.com/rdp/cudnn-download
(进入网页下载当然要注册账号,如果有就不用了)
注意要打勾才显示下载列表,按照自己的需要下载安装:
下载后,将下载文件解压,然后 copy------》past
按照自己的情况来,图中是我的解压和安装路径:(注意是路径中的文件)
添加环境变量:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\lib\x64
输入nvcc -V 测试即可
其他内容请看视频~
再上一张测试集:
老规矩了关注我的公众号,一起进入AI知识星球吧