首页 > 其他分享 >libtorch实现一个数码管数字识别网络

libtorch实现一个数码管数字识别网络

时间:2024-03-18 09:56:56浏览次数:26  
标签:1.0 Tensor libtorch int 0.0 torch 数码管 forward 识别

这里的数字范围是0~9共10个数字,用5×3的数字矩阵表示,把它当成图像那么可以看成5×3的图片。如下图中的数字0,用“1”代表有颜色(亮),“0”代表没颜色(灭)。

网络是经典的BP神经网络,15个输入,10个输出。当输入是形状“0”时,输出索引为0的数字最大接近于1;当输入是形状“1”时,输出索引为1的数字最大接近于1,以此类推,以达到识别数字的功能。这个网络是我随便设置的参数没有任何优化就可以训练使用。测试环境是VS2017和libtorch1.13.1。下面是头文件:

class LinearSigImpl : public torch::nn::Module
{
public:
    LinearSigImpl(int intput, int output);
    torch::Tensor forward(torch::Tensor x);

private:
    torch::nn::Linear ln;
    torch::nn::Sigmoid sn;
};

TORCH_MODULE(LinearSig);

class Mlp : public torch::nn::Module
{
public:
    Mlp(int input, int outputCount);
    torch::Tensor forward(torch::Tensor x);

private:
    LinearSig ln1;
    LinearSig ln2;
    LinearSig ln3;
    LinearSig output;
};

CPP文件如下。这里换了1个损失函数,用的是SmoothL1Loss函数。在libtorch里有非常多的损失函数和优化方法可以选择,只要合适都可以使用。代码最后我加了个手输5×3的数字识别结果,经过验证,对于有较小干扰的数字可以正确识别:

LinearSigImpl::LinearSigImpl(int input, int output) : 
    ln(nullptr), sn(nullptr)
{
    ln = register_module("ln", torch::nn::Linear(input, output));
    sn = register_module("sn", torch::nn::Sigmoid());
}

torch::Tensor LinearSigImpl::forward(torch::Tensor x)
{
    x = ln->forward(x);
    x = sn->forward(x);
    return x;
}

Mlp::Mlp(int input, int outputCount) : 
    ln1(nullptr), ln2(nullptr), ln3(nullptr), output(nullptr)
{
    const int layer[] = { 30, 30, 20 }; 
    ln1 = register_module("ln1", LinearSig(input, layer[0]));
    ln2 = register_module("ln2", LinearSig(layer[0], layer[1]));
    ln3 = register_module("ln3", LinearSig(layer[1], layer[2]));
    output = register_module("output", LinearSig(layer[2], outputCount));
}

torch::Tensor Mlp::forward(torch::Tensor x)
{
    x = ln1->forward(x);
    x = ln2->forward(x);
    x = ln3->forward(x);
    x = output->forward(x);
    return x;
}

static torch::Tensor inputSample = torch::tensor({
        { 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f }, /* 0 */
        { 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f },
        { 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f },
        { 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f },
        { 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f }, /* 4 */
        { 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f },
        { 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f },
        { 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f },
        { 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f },
        { 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f }, /* 9 */
    });

static torch::Tensor outputSample = torch::tensor({
        { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f },
        { 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f },
        { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f },
        { 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f },
        { 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f },
        { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f },
        { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f },
        { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f },
        { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f },
        { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
    });

int main()
{
    Mlp mechine(15, 10);

    /* 训练过程 */
    torch::optim::SGD optim(mechine.parameters(), torch::optim::SGDOptions(0.2));
    torch::nn::SmoothL1Loss lossFunc;
    mechine.train();
    for (int i = 0; i < 500000; i++)
    {
        torch::Tensor predict = mechine.forward(inputSample);
        torch::Tensor loss = lossFunc(predict, outputSample);
        optim.zero_grad();
        loss.backward();
        optim.step();
        if (i % 5000 == 0)
        {
            /* 每5000次循环输出一次损失函数值 */
            cout << "LOOP:" << i << ",LOSS=" << loss.item() << endl;
        }
    }

    /* 做个测试 */
    at::Tensor x = torch::tensor({
            { 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.1f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f }, /* 1 */
            { 1.0f, 0.9f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f }, /* 0 */
            { 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.9f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f }, /* 2 */
        });
    at::Tensor y = mechine.forward(x);
    std::tuple<torch::Tensor, torch::Tensor> maxValue = y.max(1);
    for (int i = 0; i < 3; i++)
    {
        cout << "第" << i << "形状预测输出=" << std::get<1>(maxValue)[i].item().toInt() << endl;
    }

    vector<float> inputs;
    cout << "输入5*3的数字[每个数字0~1之间]:" << endl;
    for (int i = 0; i < 15; i++)
    {
        float number;
        cin >> number;
        inputs.push_back(number);
    }
    x = torch::from_blob(inputs.data(), { 1, 15 }, c10::TensorOptions(c10::ScalarType::Float));
    y = mechine.forward(x);
    maxValue = y.max(1);
    cout << "预测输出=" << std::get<1>(maxValue)[0].item().toInt() << endl;

    return 0;
}

控制台输出是:

...
LOOP:475000,LOSS=0.000606246
LOOP:480000,LOSS=0.000572149
LOOP:485000,LOSS=0.000541376
LOOP:490000,LOSS=0.000513536
LOOP:495000,LOSS=0.000488265
第0形状预测输出=1
第1形状预测输出=0
第2形状预测输出=2
输入5*3的数字[每个数字0~1之间]:
1       0.9     1
0.1     0       0.98
0       0.1     0.97
0.3     0       0.92
0       0       1
预测输出=7

 

标签:1.0,Tensor,libtorch,int,0.0,torch,数码管,forward,识别
From: https://www.cnblogs.com/mengxiangdu/p/18025672

相关文章

  • m基于深度学习网络的手势识别系统matlab仿真,包含GUI界面
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要        随着人工智能和机器学习技术的飞速发展,手势识别技术在人机交互、虚拟现实、智能家居等领域的应用越来越广泛。基于深度学习网络的手势识别系统凭借其强大的特征提取和......
  • opencv 人脸识别简单尝试
    opencv人脸识别简单尝试闲来无事,尝试着按照网上的教程和代码来实现简单的人脸识别 参考:基于OpenCv的人脸识别(Python完整代码)-CSDN博客 以下为快速配置 (具体的过程请参阅参考链接所提供的原文章) 1、环境搭建实验环境:python3.6+opencv-python3.4.14.51建......
  • 毕业设计:基于计算机视觉的遛狗牵绳识别系统 目标检测
    目录前言课题背景和意义实现技术思路一、 算法理论基础1.1 卷积神经网络1.2 注意力机制二、 数据集2.1数据集2.2数据扩充三、实验及结果分析3.1 实验环境搭建3.2 模型训练最后前言  ......
  • 毕业设计:基于机器学习的工地员工安全着装识别系统 目标检测
    目录前言课题背景和意义实现技术思路一、算法理论基础1.1 Mobilenet算法1.2 人脸检测模型二、 数据集2.1数据集2.2数据扩充三、实验及结果分析3.1 实验环境搭建3.2 模型训练最后前言  ......
  • 微调大型语言模型进行命名实体识别
    大型语言模型的目标是理解和生成与人类语言类似的文本。它们经过大规模的训练,能够对输入的文本进行分析,并生成符合语法和语境的回复。这种模型可以用于各种任务,包括问答系统、对话机器人、文本生成、翻译等。命名实体识别(NamedEntityRecognition,简称NER)是一种常见的应用方法,可......
  • 新一代 Kaldi: 支持 JavaScript 进行本地语音识别和语音合成啦!
    简介新一代 Kaldi 部署框架 sherpa-onnx 支持的编程语言 API 大家庭中,最近增加了一个新成员: JavaScript。为了方便大家查看,我们把目前所有支持的编程语言汇总成如下一张图。注:这个家庭还在不断的扩充,总有一款适合你!后续我们会增加 Dart、Rust、WebAssembly 等支持......
  • 如何针对机械表进行识别读数
    识别机械表的读数通常涉及到图像处理和模式识别技术。以下是一个简单的例子,使用Python和OpenCV库来识别机械表的读数。这个例子假设表盘是静止的,并且有一个清晰的背景。首先,你需要安装OpenCV库(如果你还没有安装的话):pipinstallopencv-python然后,你可以使用以下代码来尝......
  • 金鸣表格识别大师如何实现多人登录同一账户?
    在使用金鸣表格识别大师时,有时我们可能需要多人同时登录同一账户进行操作,以提高团队协作效率,如何实现呢?下面将详细介绍如何使用金鸣表格识别大师实现多人同时登录同一账户。首先,确保你的金鸣表格识别大师版本支持多人同时登录功能。如果版本较旧,建议升级到最新版本,以获得最佳......
  • 基于EP4CE6F17C8的FPGA数码管动态显示实例
    一、电路模块1、数码管开发板板载了6个数码管,全部为共阳型,原理图如下图所示,段码端引脚为DIG[0]~DIG[7]共8位(包含小数点),位选端引脚为SEL[0]~SEL[5]共6位。端口均为低电平有效。其实物图如下所示。数码管引脚分配见下表。2、时钟晶振开发板板载了一个50MHz的有源晶振,为系统......
  • LabVIEW多表位数字温湿度计图像识别系统
    LabVIEW多表位数字温湿度计图像识别系统解决数字温湿度计校准过程中存在的大量需求和长时间校准问题,通过LabVIEW开发平台设计了一套适用于20多个表位的数字温度计图像识别系统。该系统能够通过图像采集、提取和处理,进行字符训练,从而实现对不同型号数字温湿度计的温度和湿度字......