【手撸神经网络】深度学习环境搭建与简单神经网络实现图片分类

手撸神经网络 深度学习环境搭建与简单神经网络实现图片分类


大家好,我是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就行。
img

等待。。。。。。
在这里插入图片描述
继续等待。。。。。。
在这里插入图片描述

点击同意并继续
在这里插入图片描述
如果不知道怎么选,就选择精简安装。
在这里插入图片描述
我也不知道按那个,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)]在这里插入图片描述

老规矩了关注我的公众号,一起进入AI知识星球吧

猜你喜欢

转载自blog.csdn.net/qq_46098574/article/details/113383390
今日推荐