首页 > 编程语言 >C++ 深度学习简单示例

C++ 深度学习简单示例

时间:2023-12-29 14:02:37浏览次数:33  
标签:std trainingData 示例 double C++ 神经网络 深度 size

这是一个简单的C++控制台程序示例,用于实现一个简单的神经网络,进行二进制分类任务。请注意,这只是一个基本示例,没有使用任何深度学习库,因此它可能不具备高度优化和效率。

#include <iostream>
#include <vector>
#include <cmath>

// 定义神经网络的层
struct Layer {
    std::vector<double> weights;
    double bias;
};

// 定义激活函数(这里使用sigmoid函数)
double sigmoid(double x) {
    return 1 / (1 + exp(-x));
}

// 前向传播函数
double forwardPropagation(const std::vector<double>& input, const Layer& layer) {
    double sum = 0.0;
    for (size_t i = 0; i < input.size(); ++i) {
        sum += input[i] * layer.weights[i];
    }
    sum += layer.bias;
    return sigmoid(sum);
}

int main() {
    // 定义训练数据
    std::vector<std::vector<double>> trainingData{
        {0, 0},
        {0, 1},
        {1, 0},
        {1, 1}
    };

    // 定义标签(对应每个训练数据的期望输出)
    std::vector<int> labels{ 0, 1, 1, 0 };

    // 定义神经网络的结构
    Layer hiddenLayer{ {1, 1}, 0 }; // 隐藏层
    Layer outputLayer{ {1, -1}, 0 }; // 输出层

    // 训练神经网络
    for (size_t epoch = 0; epoch < 1000; ++epoch) {
        for (size_t i = 0; i < trainingData.size(); ++i) {
            // 前向传播
            double hiddenOutput = forwardPropagation(trainingData[i], hiddenLayer);
            double output = forwardPropagation({ hiddenOutput }, outputLayer);

            // 计算误差
            double error = labels[i] - output;

            // 反向传播更新权重和偏置
            double delta = error * output * (1 - output);
            outputLayer.bias += delta;
            for (size_t j = 0; j < hiddenLayer.weights.size(); ++j) {
                hiddenLayer.weights[j] += delta * hiddenOutput * (1 - hiddenOutput) * trainingData[i][j];
            }
        }
    }

    // 测试神经网络
    std::cout << "Testing neural network:" << std::endl;
    for (size_t i = 0; i < trainingData.size(); ++i) {
        double hiddenOutput = forwardPropagation(trainingData[i], hiddenLayer);
        double output = forwardPropagation({ hiddenOutput }, outputLayer);
        std::cout << "Input: " << trainingData[i][0] << ", " << trainingData[i][1]
            << " Output: " << output << std::endl;
    }

    return 0;
}

运行结果

 

标签:std,trainingData,示例,double,C++,神经网络,深度,size
From: https://www.cnblogs.com/lizhiqiang0204/p/17934722.html

相关文章

  • 深度学习高效训练指南
    深度学习是人工智能领域中一种重要的技术,它通过模拟人脑神经网络的工作方式,使得计算机能够自动学习和识别各种数据模式。在深度学习中,模型训练是至关重要的一个环节,它直接决定了模型性能的好坏。因此,如何高效地进行深度学习模型训练,成为了一个备受关注的话题。一、选择合适的模型结......
  • 重庆中烟:事项会计驱动业财深度融合
    他们是国内最年轻的中烟公司,同时也是最具发展活力、成长性最快的烟草企业;他们以战略高度积极践行企业数字化转型,寻求信创快速突破,铺设了企业高质量发展的快速路。它就是重庆中烟工业有限责任公司(简称“重庆中烟”)。重庆中烟是中国烟草总公司的下属公司之一,于2015年建成。其前身是香......
  • 在Python中,如果你想查找特定的SQLite数据库文件(例如'mydatabase.db'),你可以使用os模块
    这是Python中os.walk()函数的常见用法¹²⁴⁵⁶。os.walk()函数用于递归遍历指定目录及其子目录,并返回一个生成器,每次迭代都会返回一个包含三个元素的元组:当前目录的路径、当前目录下所有子目录的列表和当前目录下所有文件的列表¹²⁴⁵⁶。在fordirpath,dirnames,filenamesi......
  • C++ 有用的网站
    C++StandardLibraryheaders −C++标准库。C++Programming −这本书涵盖了C++语言编程、软件交互设计、C++语言的现实生活应用。C++FAQ −C++常见问题FreeCountry −FreeCountry提供了免费的C++源代码和C++库,这些源代码和库涵盖了压缩、存档、游戏编......
  • lncLocator 2.0:具有可解释深度学习的长链非编码rna的细胞系特异性亚细胞定位预测器
    lncLocator2.0:acell-line-specificsubcellularlocalizationpredictorforlongnon-codingRNAswithinterpretabledeeplearnin关键词:长链非编码RNA亚细胞定位预测;可解释模型;词嵌入;端对端;作者:YangLin,XiaoyongPan*andHong-BinShen期刊:Bioinformatics年份:2022......
  • MacOS - Xcode新建C++项目导入QT库
    在项目BuildPhases>LinkBinaryWithLibraries点击+点击AddOther...选择QT安装路径下的framework在文件中使用#include<>导入QT,例如#include<QtWidgets>,如果报错,那么需要在BuildSettings>HeaderSearchPaths中添加你的QT安装路径下相应的framework路径,例如:/usr/l......
  • Qt/C++音视频开发62-电子放大/按下选择区域放大显示/任意选取区域放大
    一、前言电子放大这个功能思考了很久,也是一直拖到近期才静下心来完整这个小功能,这个功能的前提,主要得益于之前把滤镜打通了,玩出花样来了,只要传入对应的滤镜字符串,就可以实现各种各样的效果,然后查阅滤镜手册过程中,发现有个裁剪crop的滤镜,和要做的电子放大效果完全一样,就是将指定的......
  • 轻量级力量:深入MiniZip库,实现C++中ZIP文件的简便压缩与解压
     MiniZip是一个轻量级的压缩库,它是zlib库的一部分,用于在C++中进行ZIP文件的压缩和解压缩操作。以下是MiniZip的一些功能和优点:功能:创建ZIP文件: MiniZip可以用于创建包含一个或多个文件的ZIP归档。压缩: MiniZip支持使用不同的压缩算法对文件进行压缩,例如DEFLATE。解压缩......
  • c++教程2操作符
    2操作符算数运算赋值比较逻辑运算条件检查size优先级数据类型转换2.1算数运算arithmetic.cpp#include<iostream>usingnamespacestd;intmain(){inta=8,b=4;cout<<"Additionresult:"<<(a+b)<<endl;cout<<"Subt......
  • C++常用的无序的关联容器
    常用的无序关联容器在实际问题场景中,除了常见的线性表结构,字符串,排序操作之外,散列表和红黑树也是非常常见的,有很多应用场景都会用到它们。散列表虽然比较占空间,但是它的增删查的都很快,趋近于O(1);红黑树也是一颗二叉排序树,所以入红黑树的数据都是经过排序的,它的增删查时间复杂度都是......