Tensorflow c++ 实践及各种坑

TensorFlow C++笔记:安装、模型加载推理及构建计算图,test ok Tensor类的构造函数无法指定张量值,如需用特定值定义一个张量可以使用Input::Initializer,文档描述:Initializer能够从C++基本类型常量或初始化列表(initializer lists)构建Input对象,代表一个多维数组。文档描述:一个Input类代表一个能作为算子的操作数(operand)的张量,一个Output类代表算子输出的张量。想要以特定模式赋值的张量,可以考虑在array_ops.h里查找想要的算子,例如Fill算子以特定值赋给张量的所有元素。 阅读详情

Tensorflow c++ 实践及各种坑

Tensorflow当前官网仅包含python、C、Java、Go的发布包,并无C++ release包,并且tensorflow官网也注明了并不保证除python以外库的稳定性,在功能方面python也是最完善的。众所周知,python在开发效率、易用性上有着巨大的优势,但作为一个解释性语言,在性能方面还是存在比较大的缺陷,在各类AI服务化过程中,采用python作为模型快速构建工具,使用高级语言(如C++,java)作为服务化程序实现是大势所趋。本文重点介绍tensorflow C++服务化过程中实现方式及遇到的各种问题。

实现方案

对于tensorflow c++库的使用,有两种方法:

(1) 最佳方式当然是直接用C++构建graph,但是当前c++tensorflow库并不像python api那样full-featured。可参照builds a small graph in c++ here, C++ tensorflow api中还包含cpu和gpu的数字内核实现的类,可用以添加新的op。可参照https://www.tensorflow.org/extend/adding_an_op

(2) 常用的方式,c++调用python生成好的graph。本文主要介绍该方案。

实现步骤

(1) 编译tensorflow源码C++ so(2) 模型训练输出结果(3) 模型固化(4) 模型加载及运行(5) 运行问题

(1) 源码编译

环境要求: 公司tlinux2.2版本, GCC版本 >= 4.8.5安装组件: protobuf 3.3.0 bazel 0.5.0 python 2.7 java8机器要求: 4GB内存

a. 安装java8
yum install java
b. 安装protobuf 3.3.0

下载https://github.com/google/protobuf/archive/v3.3.0.zip

./configure  &&  make  &&  make install
c. 安装bazel
download  https://github.com/bazelbuild/bazel/releases
sh bazel-0.5.0-installer-linux-x86_64.sh
d. 编译源码

最好采用最新release版本:https://github.com/tensorflow/tensorflow/releases

bazel build //tensorflow:libtensorflow_cc.so

编译过程中可能遇到的问题:问题一: fatal error: unsupported/Eigen/CXX11/Tensor: No such file or directory

安装Eigen3.3或以上版本问题二: java.io.IOException: Cannot run program "patch"

  yum install patch

问题三: 内存不够

(2) 模型训练与输出

模型训练输出可参照改用例去实践https://blog.metaflow.fr/tensorflow-saving-restoring-and-mixing-multiple-models-c4c94d5d7125, google上也很多,模型训练保存好得到下面文件:

(3) 模型固化

模型固化方式有三种:

a. freeze_graph 工具
bazel build tensorflow/python/tools:freeze_graph && bazel-bin/tensorflow/python/tools/freeze_graph 
        --input_graph=graph.pb 
        --input_checkpoint=checkpoint 
        --output_graph=./frozen_graph.pb 
        --output_node_names=output/output/scores
b. 利用freeze_graph.py工具
# We save out the graph to disk, and then call the const conversion
# routine.
checkpoint_state_name = "checkpoint"
input_graph_name = "graph.pb"
output_graph_name = "frozen_graph.pb"

input_graph_path = os.path.join(FLAGS.model_dir, input_graph_name)
input_saver_def_path = ""
input_binary = False
input_checkpoint_path = os.path.join(FLAGS.checkpoint_dir, 'saved_checkpoint') + "-0"

# Note that we this normally should be only "output_node"!!!
output_node_names = "output/output/scores" 
restore_op_name = "save/restore_all"
filename_tensor_name = "save/Const:0"
output_graph_path = os.path.join(FLAGS.model_dir, output_graph_name)
clear_devices = False

freeze_graph.freeze_graph(input_graph_path, input_saver_def_path,
                          input_binary, input_checkpoint_path,
                          output_node_names, restore_op_name,
                          filename_tensor_name, output_graph_path,
                          clear_devices)
c. 利用tensorflow python
import os, argparse

import tensorflow as tf
from tensorflow.python.framework import graph_util

dir = os.path.dirname(os.path.realpath(__file__))

def freeze_graph(model_folder):
    # We retrieve our checkpoint fullpath
    checkpoint = tf.train.get_checkpoint_state(model_folder)
    input_checkpoint = checkpoint.model_checkpoint_path

    # We precise the file fullname of our freezed graph
    absolute_model_folder = "/".join(input_checkpoint.split('/')[:-1])
    output_graph = absolute_model_folder + "/frozen_model.pb"
    print output_graph
    # Before exporting our graph, we need to precise what is our output node
    # This is how TF decides what part of the Graph he has to keep and what part it can dump
    # NOTE: this variable is plural, because you can have multiple output nodes
    output_node_names = "output/output/scores"

    # We clear devices to allow TensorFlow to control on which device it will load operations
    clear_devices = True

    # We import the meta graph and retrieve a Saver
    saver = tf.train.import_meta_graph(input_checkpoint + '.meta', clear_devices=clear_devices)

    # We retrieve the protobuf graph definition
    graph = tf.get_default_graph()
    input_graph_def = graph.as_graph_def()

    # fix batch norm nodes
    for node in input_graph_def.node:
        if node.op == 'RefSwitch':
            node.op = 'Switch'
            for index in xrange(len(node.input)):
                if 'moving_' in node.input[index]:
                    node.input[index] = node.input[index] + '/read'
        elif node.op == 'AssignSub':
            node.op = 'Sub'
            if 'use_locking' in node.attr: del node.attr['use_locking']

    # We start a session and restore the graph weights
    with tf.Session() as sess:
        saver.restore(sess, input_checkpoint)

        # We use a built-in TF helper to export variables to constants
        output_graph_def = graph_util.convert_variables_to_constants(
            sess, # The session is used to retrieve the weights
            input_graph_def, # The graph_def is used to retrieve the nodes 
            output_node_names.split(",") # The output node names are used to select the usefull nodes
        ) 

        # Finally we serialize and dump the output graph to the filesystem
        with tf.gfile.GFile(output_graph, "wb") as f:
            f.write(output_graph_def.SerializeToString())
        print("%d ops in the final graph." % len(output_graph_def.node))


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("--model_folder", type=str, help="Model folder to export")
    args = parser.parse_args()

    freeze_graph(args.model_folder)

坑 BatchNorm bug

在具体实际项目,用方式一与方式二将生成的模型利用tensorflow c++ api加载,报以上错误,采用tensorflow python加载模型报同样错:

原因是模型中用到了BatchNorm,修复方式如上面c中给出的方案

(4) 模型加载及运行

构建输入输出

模型输入输出主要就是构造输入输出矩阵,相比python的numpy库,tensorflow提供的Tensor和Eigen::Tensor还是非常难用的,特别是动态矩阵创建,如果你的编译器支持C++14,可以用xTensor库,和numpy一样强大,并且用法机器类似。如果是C++11版本就好好看看eigen库和tensorflow::Tensor文档吧。例举集中简单的用法:

矩阵赋值:

tensorflow::Tensor four_dim_plane(DT_FLOAT, tensorflow::TensorShape({1, MODEL_X_AXIS_LEN, MODEL_Y_AXIS_LEN, fourth_dim_size}));
auto plane_tensor = four_dim_plane.tensor<float, 4>();
for (uint32_t k = 0; k < array_plane.size(); ++k)
{
    for (uint32_t j = 0; j < MODEL_Y_AXIS_LEN; ++j)
    {
        for (uint32_t i = 0; i < MODEL_X_AXIS_LEN; ++i)
        {
            plane_tensor(0, i, j, k) = array_plane[k](i, j); 
        }
    }
}

SOFTMAX:

Eigen::Tensor<float, 1> ModelApp::TensorSoftMax(const Eigen::Tensor<float, 1>& tensor)
{
    Eigen::Tensor<float, 0> max = tensor.maximum();
    auto e_x = (tensor - tensor.constant(max())).exp();
    Eigen::Tensor<float, 0> e_x_sum = e_x.sum();
    return e_x / e_x_sum();
}
模型加载及session初始化:
int32_t ModelApp::Init(const std::string& graph_file, Logger *logger)
{
    auto status = NewSession(SessionOptions(), &m_session); 
    if (!status.ok())
    {
        LOG_ERR(logger, "New session failed! %s", status.ToString().c_str());
        return Error::ERR_FAILED_NEW_TENSORFLOW_SESSION;
    }

    GraphDef graph_def;
    status = ReadBinaryProto(Env::Default(), graph_file, &graph_def);
    if (!status.ok()) 
    {
        LOG_ERR(logger, "Read binary proto failed! %s", status.ToString().c_str());
        return Error::ERR_FAILED_READ_BINARY_PROTO;
    }

    status = m_session->Create(graph_def);
    if (!status.ok()) 
    {
        LOG_ERR(logger, "Session create failed! %s", status.ToString().c_str());
        return Error::ERR_FAILED_CREATE_TENSORFLOW_SESSION;
    }

    return Error::Success;
}
运行:

0.10以上的tensorflow库是线程安全的,因此可多线程调用predict

int32_t ModelApp::Predict(const Action& action, std::vector<int>* info, Logger *logger)
{
    ...
    auto tensor_x = m_writer->Generate(action, logger);

    Tensor phase_train(DT_BOOL, TensorShape());
    phase_train.scalar<bool>()() = false;
    std::vector<std::pair<std::string, Tensor>> inputs = {
        {"input_x", tensor_x},
        {"phase_train", phase_train}
    }; 

    std::vector<Tensor> result;
    auto status = m_session->Run(inputs, {"output/output/scores"}, {}, &result);
    if (!status.ok())
    {
        LOG_ERR(logger, "Session run failed! %s", status.ToString().c_str());
        return Error::ERR_FAILED_TENSORFLOW_EXECUTION;
    }
    ...
    auto scores = result[0].flat<float>() ;
    ...
    return Error::SUCCESS;
}

(5) 运行问题

问题一:运行告警

2017-08-16 14:11:14.393295: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
2017-08-16 14:11:14.393324: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
2017-08-16 14:11:14.393331: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
2017-08-16 14:11:14.393338: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations.

是因为在编译tensorflow so库的时候没有把这些CPU加速指令编译进去,因此可以在编译的时候加入加速指令,在没有GPU条件下,加入这些库实测可以将CPU计算提高10%左右。

bazel build -c opt --copt=-mavx --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 -k //tensorflow:libtensorflow_cc.so

需要注意的是并不是所有CPU都支持这些指令,一定要实机测试,以免abort。

问题二: C++ libtensorflow和python tensorflow混用

为验证C++加载模型调用的准确性,利用swig将c++ api封装成了python库供python调用,在同时import tensorflow as tf和import封装好的python swig接口时,core dump

该问题tensorflow官方并不打算解决

TensorFlow C++版编译及VS2017环境配置 新手向Tensorflow C++动态库编译全流程详解,让C++也可以写出流畅的TensorFlow代码,让你的深度学习模型更快更强。 阅读详情

相关推荐

【ONNXRuntime】C++ GPU部署实战:从模型导出到工程集成的避坑指南

本文详细介绍了使用ONNXRuntime进行C++ GPU部署的完整流程与关键技巧。内容涵盖从TensorFlow模型导出ONNX、环境版本精确对齐、Visual Studio工程配置,到编写健壮C++推理类的实战代码。重点解析了CUDA版本匹配、数据预处理内存布局、性能调优及常见错误排查等核心难点,旨在帮助开发者高效、稳定地将深度学习模型集成到C++生产环境中。

g9h0i1的博客 582

Tensorflow 模型 C++部署实战

因公司要求个人不得授课和兼职原因,麻烦请把我的课程全部下架,联系不到你们的客服,谢谢!

c++调用tensorflow

目前深度学习越来越火,学习、使用tensorflow的相关工作者也越来越多。但是目前绝大部分的python都是拥有着丰富的python的API,而c++的API不够完善。这就导致绝大多是使用tensorflow的项目都是基于python。 如果项目是由c++编写,想调用python下的tensorflow?可参考本教程(tensorflow模型是CNN卷积神经网络): 具体步骤: 1.pyt...

Panda 2万+

C++部署TensorFlow模型

安装好C++版的TensorFlow之后,我们就可以用C++来部署python训练好的TensorFlow模型了。安装C++版的TensorFlow的教程可以参考这里。部署TensorFlow模型主要分为两步,第一步是用python训练模型,然后保存模型为.pb格式的二进制文件;第二步则是在C++中加载python保存的模型并进行预测。 1、python训练模型并保存 2、使用C++加...

蓬莱道人的博客 1万+

从源码求证tensorflow中os.environ["TF_CPP_MIN_LOG_LEVEL"]的值的含义

看代码时遇到了os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'这样一句话,于是开始百度,是设置log输出信息的,也就是程序运行时系统打印的信息。 &amp;amp;amp;nbsp; 但是发现有两种答案: 一种是这样说的 还有一种是这样说的 … … 一脸懵逼

mrzrx的博客 2万+

tensorflow新建算子(cpp)

为什么使用cpp新建算子 1. 一些操作表示成现有操作的组合不好实现或者无法实现。 2. 已有操作的组合效率不高。 3. 想要自定义一些基本操作的组合,因为未来编译器做这种融合可能会比较困难。

qq_62825352的博客 1280

Android端集成whisper.cpp与VAD的高效语音处理方案

基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。架构理解:掌握实时语音应用的完整技术链路(ASR→LLM→TTS)技能提升:学会申请、配置与调用火山引擎AI服务定制能力:通过代码修改自定义角色性格与音色,实现“从使用到创造”从0到1构建生产级别应用,脱离Demo,点击打开。

2600_94960003的博客 385

TensorFlow GPU C++库编译与部署实战指南

在深度学习部署领域,高性能推理是核心需求,尤其是在实时视频分析、游戏AI等对延迟敏感的场景中。其原理在于通过GPU并行计算加速模型推理,这需要底层库的紧密配合。从技术价值看,直接使用C++集成推理引擎能避免Python环境依赖,实现更低的延迟和更高的资源利用率。应用场景广泛,包括边缘计算、嵌入式系统和服务器端高性能服务。本文聚焦于TensorFlow GPU版C++库的编译与部署,深入解析了版本矩阵规划、Bazel构建系统配置、CUDA/cuDNN依赖管理等关键环节,并提供了CMake项目集成和SavedM

weixin_29062613的博客 235

TensorFlow 2.0自定义操作实战:从Lambda层到C++内核的三种实现路径

在深度学习框架中,自定义操作(Custom Operations)是扩展模型能力、突破性能瓶颈的关键技术。其核心原理在于允许开发者向计算图注入自定义的高效执行逻辑,从而在保持高层API易用性的同时,实现算法创新与极致性能优化。这项技术的核心价值在于,它使得研究者能够将前沿论文中的新颖计算单元(如新型注意力机制)或特定领域的变换操作(如自定义频域滤波器)无缝集成到现有框架中,解决了标准层无法满足复杂、高性能计算需求的痛点。在TensorFlow 2.0的工程实践中,实现自定义操作主要有三种路径:使用Lambd

weixin_30694389的博客 272

CPU版的tensorflow1.10.0编译出C++API的库文件VS2015

经过1天的编译,将CPU版的tensorflow1.10.0成功编译出C++API的库文件,可以使用C++编写调用tensorflow跑例程,跑训练出来的模型,并支持GPU训练出的模型,本人亲试没有问题,需要的可以下载,环境为VS2015-64位

【自动驾驶规划】Lattice Planner

Lattice Planner简介 LatticePlanner算法属于一种局部轨迹规划器,输出轨迹将直接输入到控制器,由控制器完成对局部轨迹的跟踪控制。因此,Lattice Planner输出的轨迹是一条光滑无碰撞满足车辆运动学约束和速度约束的平稳安全的局部轨迹。Lattice Planner的输入端主要由三部分组成,感知及障碍物信息、参考线信息及定位信息。局部规划模块的输出是带有速度信息的一系列轨迹点组成的轨迹,其保证了车辆控制器在车辆跟踪控制过程中的平稳性和安全性。 局部规划模块的输出是带有速

uytguytgf的博客 6497

从Python到STM32:一个AIoT全栈工程师的实战技能树与避坑指南

本文详细介绍了从Python到STM32的AIoT全栈开发技能树,涵盖设备层、通信层、平台层和应用层的核心技术。通过实战案例和避坑指南,帮助开发者掌握AI与物联网的融合技术,提升在边缘计算和嵌入式系统开发中的实战能力。

weixin_33691700的博客 190

在PLC中将十六进制数据转换为浮点数(通常遵循IEEE 754标准)需要理解数据存储格式,并按以下步骤操作:

通过以上步骤,您可以在PLC中实现十六进制到浮点数的转换。T DBD20 // 将数据传送到浮点数变量(如DB1.DBD20)指数位(8位):实际指数 = 存储值 - 127(偏移量)。:必须确认PLC的存储顺序(大端或小端),否则结果错误。将两个16位寄存器合并为32位数据,需注意。尾数位(23位):隐含前导1,实际值为。:确保32位数据在寄存器中连续且对齐。符号位(1位):0表示正,1表示负。:高位寄存器在前(如西门子PLC)。:低位寄存器在前(如三菱FX系列)。,误差因截断导致)。

K11mvp的博客 4418

Keras2cpp vs TensorFlow C API:哪个更适合你的模型部署需求?

在深度学习模型部署领域,选择合适的工具直接影响项目的性能和开发效率。Keras2cpp作为一款轻量级工具,专注于将Keras神经网络模型转换为纯C++代码,而TensorFlow C API则提供了官方的底层接口支持。本文将从核心功能、适用场景、性能表现等维度,为你深入对比两者的差异,助你做出更优的技术选型。 ## 📌 核心功能对比:轻量转换 vs 官方生态 ### Keras2cpp:专注

gitblog_00806的博客 747

NSGA-III相关笔记

NSGA-III目录目的区别NSGA-III的算法流程非支配排序详解归一化详解 目录 NSGA-III基于matlab的实现 参考文献 1.An Evolutionary Many-Objective Optimization Algorithm Using Reference-point Based Non-dominated Sorting Approach,Part I: Solving P...

weixin_42555400的博客 1万+

Win10管理员权限的‘暗门’:从mmc.exe被阻止,聊聊UAC与自动提权那些事儿

本文深入解析Windows 10中UAC(用户账户控制)与自动提权机制,探讨mmc.exe被阻止的深层原因及解决方案。从UAC工作原理到自动提权机制,再到具体诊断与修复步骤,帮助用户理解并解决权限管理问题,同时平衡安全性与便利性。

weixin_30521161的博客 419

探索 TensorFlow 对象检测的 C++ 实践 —— tensorflow-object-detection-cpp

探索 TensorFlow 对象检测的 C++ 实践 —— tensorflow-object-detection-cpp 在深度学习与计算机视觉领域,对象检测一直是研究与应用的热点。对于那些追求效率与灵活性的开发者来说,tensorflow-object-detection-cpp 这一开源项目无疑是将 TensorFlow 强大的对象检测能力融入 C++ 应用的理想选择。虽然项目维护者已转投 ...

gitblog_00027的博客 516

高通跃龙QCS6490部署yolov11_obb实战:QNN SDK工具链全解析与避坑指南

本文详细解析了在高通跃龙QCS6490平台上部署yolov11_obb模型的实战过程,重点介绍了QNN SDK工具链的使用与优化技巧。从环境配置、模型转换到性能调优,提供了全面的避坑指南和DSP加速配置建议,帮助开发者高效实现旋转框检测任务在边缘设备上的部署。

weixin_29232121的博客 305

llama.cpp与PyTorch、TensorFlow

特性llama.cpp主要功能模型训练 + 推理轻量化模型推理硬件要求高性能硬件(GPU/TPU 优化)普通设备(CPU 优化,支持 ARM/x86)适用场景企业级大规模应用、研究开发个人和小型团队的本地化部署复杂性依赖多、配置复杂无需依赖,开箱即用生态系统广泛覆盖多个领域专注于语言模型推理,生态仍在扩展隐私支持适合云端部署完全离线运行,数据隐私友好支持的模型类型所有主流模型量化后的语言模型(支持 GGUF、GGML 格式)

qq_43819568的博客 1538

心理学量表汇总 50多个 附下载

目录一、心理健康与精神病态量表二、行为问题量表三、人格评估量表四、智力测验一、心理健康与精神病态量表1.一般症状自评量表(SCL-90)症状自评量表 (The self-report symptom inventory ,Symptom checklist ,90,简称 SCL90) 有 90 个评定项目 , 每个项目分五级评分 , 包含了比较广泛的精神病症状学内容, 从感觉、 情 感、思维、意识、行为直至生活习惯、人际关系、饮食等均有涉及,能准确刻划被试的自觉 症状,能较好地反映被试的问题及其严重程度和变

南七小僧的学海无涯 1904

第076篇:大涡模拟进阶

大涡模拟(Large Eddy Simulation, LES)是介于直接数值模拟(DNS)和雷诺平均方法(RANS)之间的重要湍流模拟方法。本文深入介绍动态Smagorinsky模型、尺度相似模型、WALE模型和隐式LES等高级亚格子模型。通过Python实现槽道湍流和圆柱绕流的LES求解器,详细展示近壁面处理、动态系数计算和亚格子应力建模技术。大涡模拟,亚格子模型,动态模型,Smagorinsky,WALE模型,尺度相似模型,近壁面处理,槽道湍流LES的核心思想是对Navier-Stokes方程进行空间

2401_87715305的博客 740

tensorflow c++ api + windwos + vs部署 详细避坑

不能使用vs2022配置tensorflow c++ api,即使要安装 2.10.0版本,也尽量使用vs2019提示:以下是本篇文章正文内容,下面案例可供参考。

weixin_46005626的博客 2527

innovus中如何设置cts参数

上面是设置cts的一般设置,如果需要对某些skew group或者某些clock tree设置不一样的参数,如需要对clk1这个clock设置不一样的inverter,可以使用。需要查询已经设置过的ccopt参数,可以使用get_ccopt_property去查询,方法和set_ccopt_property一致。言归正传,cts的设置命令是set_ccopt_property,获取命令是get_ccopt_property。另外,set_ccopt_property提供一套命令查询方法。

芯冰乐 544

C++ 调用tensorflow

1.安装protobuf 3.6 # 安装依赖软件 sudo apt-get install autoconf automake libtool curl make g++ unzip # 克隆版本为3.6.0的protobuf源码 git clone -b v3.6.0 https://github.com/protocolbuffers/protobuf.git # 下载 protobuf...

koibiki的博客 4745

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

TensorFlow C++ 编译札记

TensorFlow C++ 编译札记硬件环境备注 最近因为工作需要,要将很久都没有碰过的 TF 框架重新用起来,而且还需要使用 C++ 端口做一些工程开发工作。鉴于这些工作实在是太多坑,不同版本的软件相互间又不兼容。如果考虑到要在有墙的情况下 debug 简直雪上加霜。因此决定记录自己在安装和使用过程中碰到的问题。 这篇文章会持续更新,大家可以根据更新时间来确认这篇文章的内容是否还使用,我想一般3-6个月内问题不大。网络上很多 17/18 的文章可以看,但就不要尽信了。 硬件环境 使用的是 MacOS 1

u014469896的博客 418

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: C++函数的三种传递方式为:值传递、指针传递和引用传递
下一篇: 使用TensorFlow C++ API构建线上预测服务 - 第一篇
青松愉快
博客等级 码龄14年 71粉丝 14原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值