如何用C++实现自己的Tensorflow

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

原文:How To Write Your Own Tensorflow in C++
作者:Ray Zhang
翻译:无阻我飞扬

摘要:TensorFlow是由谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理,它完全开源,作者通过自己的一个小项目,阐述了如何用C++实现自己的TensorFlow,这篇文章看起来可能会有点晦涩,你需要对相关知识有所了解。以下是译文。

在我们开始之前,以下是代码:

  1. Branch with Eigen backend
  2. Branch that only supports scalars

我和Minh Le一起做了这个项目。

为什么?

如果你是CS专业的人员,可能听过这句“不要使自己陷入_”的话无数次。CS有加密、标准库、解析器等等。我觉得现在还应该包含ML库。

不管事实如何,它仍然是一个值得学习的惊人的教训。人们现在认为TensorFlow和类似的库是理所当然的;把它们当成是一个黑盒子,让其运行。没有多少人知道后台发生了什么。这真是一个非凸的优化问题!不要停止搅拌那堆东西,直到它看起来合适为止(结合下图及机器学习系统知识去理解这句话)。

这里写图片描述

Tensorflow

TensorFlow是由Google开源的一个深度学习库。在TensorFlow的内核,有一个大的组件,将操作串在一起,行成一个叫做 运算符图 的东西。这个运算符图是一个有向图 G=(V,E) ,在某些节点 u1,u2,…,un,v∈V 和 e1,e2,…,en∈E,ei=(ui,v) 存在某些运算符将 u1,…,un 映射到 v 。

例如,如果我们有x + y = z,那么 (x,z),(y,z)∈E 。

这对于评估算术表达式非常有用。我们可以通过寻找运算符图中的 sinks来得到结果。 Sinks是诸如 v∈V,∄e=(v,u) 这样的顶点。换句话说,这些顶点没有到其它顶点的有向边。同样的, sources是 v∈V,∄e=(u,v) 。

对我们来说, 总是把值放在sources,值会传播到Sinks。

反向模式求导

如果认为我的解释不够好,这里有一些幻灯片。

求导是TensorFlow所需的许多模型的核心要求,因为需要它来运行 梯度下降算法。每个高中毕业的人都知道什么是求导; 它只是获取函数的导数,如果函数是由基本函数组成的复杂组合,那么就做 链式法则。

超级简单的概述

如果有一个这样的函数:

f(x,y) = x * y

那么关于X的求导将产生:

df(x,y)dx=y

关于Y的求导将产生:

df(x,y)dy=x

另外一个例子:

f(x1,x2,...,xn)=f(x)=xTx

这个导数是:

df(x)dxi=2xi

所以梯度就是:

∇xf(x)=2x

链式法则,譬如应用于复杂的函数 f(g(h(x))) :

df(g(h(x)))dx=df(g(h(x)))dg(h(x))dg(h(x))dh(x)dh(x)x

5分钟内反向模式

现在记住运算符图的DAG结构,以及上一个例子中的链式法则。如果要评估,我们可以看到:

x -> h -> g -> f

作为图表。会给出答案f。但是,我们也可以采取反向求解:

dx <- dh <- dg <- df

这看起来像链式法则!需要将导数相乘在一起,以获得最终结果。

下图是一个运算符图的例子:

这里写图片描述

所以这基本上退化成图遍历问题。 有谁发觉拓扑排序和DFS / BFS吗?

所以要支持双向拓扑排序的话,需要包含一组父节点和一组子节点,Sinks是另一个方向的Sources, 反之亦然。

实施

在开学之前,Minh Le和我开始设计这个项目。我们决定使用Eigen 库后台进行线性代数运算。它们有一个称为MatrixXd的矩阵类。我们在这里使用它。

每个变量节点由var类表示:

class var {
// Forward declaration
struct impl;

public:
// For initialization of new vars by ptr
var(std::shared_ptr<impl>);

var(double);
var(const MatrixXd&);
var(op_type, const std::vector<var>&);    
...

// Access/Modify the current node value
MatrixXd getValue() const;
void setValue(const MatrixXd&);
op_type getOp() const;
void setOp(op_type);

// Access internals (no modify)
std::vector<var>& getChildren() const;
std::vector<var> getParents() const;
...
private: 
// PImpl idiom requires forward declaration of the     class:
std::shared_ptr<impl> pimpl;
};

struct var::impl{
public:
impl(const MatrixXd&);
impl(op_type, const std::vector<var>&);
MatrixXd val;
op_type op; 
std::vector<var> children;
std::vector<std::weak_ptr<impl>> parents;
};

在这里,我们采用 pImpl惯用法,这意味着“通过指针来实现”。这在许多方面是非常好的,例如接口解耦实现, 当在堆栈上有一个本地shell接口时,允许在堆栈上实例化。pImpl的副作用是运行时间稍慢,但是编译时间缩短了很多。这让我们通过多个函数调用/返回来保持数据结构的持久性。像这样的树状数据结构应该是持久的。

有几个 枚举,告诉我们目前正在执行哪些操作:

enum class op_type {
plus,
minus,
multiply,
divide,
exponent,
log,
polynomial,
dot,
...
none // no operators. leaf.
};

执行该树评价的实际类称为expression:

class expression {
public:
expression(var);
...
// Recursively evaluates the tree.
double propagate();
...
// Computes the derivative for the entire graph.
// Performs a top-down evaluation of the tree.
void backpropagate(std::unordered_map<var, double>& leaves);
...    
private:
var root;
};

在 反向传播的内部,有一些类似于此的代码:

backpropagate(node, dprev):
derivative = differentiate(node)*dprev
for child in node.children:
    backpropagate(child, derivative)    

这相当于做一个DFS; 你看到了吗?

为什么选择C ++?

事实上,C ++语言用于此不是特别合适。我们可以花 更少的时间用OCaml等功能性语言来开发。现在我明白了为什么Scala被用于机器学习,主要看你喜欢;)。

然而,C ++有明显的好处:

Eigen

例如,可以直接使用tensorflow的线性代数库,称之为Eigen。这是一个多模板惰性计算的线性代数库。类似于表达式树的样子,构建表达式,只有在需要时才会对表达式进行评估。然而,对于Eigen来说, 在编译的时候就确定何时使用模板,这意味着运行时间的减少。我特别赞赏写Eigen的人,因为审视模板的错误,让我的眼睛充血。

Eigen的代码看起来像:

Matrix A(...), B(...);
auto lazy_multiply = A.dot(B);
typeid(lazy_multiply).name(); // the class name is something like Dot_Matrix_Matrix.
Matrix(lazy_multiply); // functional-style casting forces evaluation of this matrix.

Eigen库是非常强大的,这就是为什么它是tensorflow自我使用的主要后台。这意味着除了这种惰性计算技术之外,还有其他方面的优化。

运算符重载

用Java开发这些库会非常好—没有shared_ptrs, unique_ptrs, weak_ptrs代码;我们可以采取 实际的,能胜任的,GC算法。使用Java开发可以节省许多开发时间,更不用说执行速度也会变得更快。可是,Java不允许运算符重载,因而它们就不能这样:

// These 3 lines code up an entire neural network!
var sigm1 = 1 / (1 + exp(-1 * dot(X, w1)));
var sigm2 = 1 / (1 + exp(-1 * dot(sigm1, w2)));
var loss = sum(-1 * (y * log(sigm2) + (1-y) * log(1-sigm2)));

顺便说一下,上面的是实际代码。这不是很漂亮吗?我认为 这比用于TensorFlow的python包装更漂亮。只想让你知道,这些也都是矩阵。

在Java语言中,这将是极其丑陋的,有着一堆add(), divide()…等等代码。更为重要的是, 用户将被隐式强制使用PEMDAS(括号 ,指数、乘、除、加、减),这一点上,C++的运算符表现的很好。

性能,而不是Bug

有一些东西,你可以在这个库中实际指定,TensorFlow没有明确的API,或者我不知道。比如,如果想训练某个特定子集的权重,可以只反向传播到感兴趣的具体来源。这对于卷积神经网络的 转移学习非常有用,一些大的网络,如VGG19网络,很容易用TensorFlow实现,其附加的几个额外的层的权重是根据新的域样本进行训练的。

基准

用Python的Tensorflow库,在Iris数据集上对10000个历史纪元进行分类训练,这些历史纪元具有相同的超参数,结果是:

  1. Tensorflow的神经网络 23812.5 ms
  2. Scikit的神经网络库: 22412.2 ms
  3. Autodiff的神经网络,迭代,优化: 25397.2 ms
  4. Autodiff的神经网络,具有迭代,无优化: 29052.4 ms
  5. Autodiff的神经网络,具有递归,无优化: 28121.5 ms

如此看来,令人惊讶的是,Scikit在所有这些中运行最快。这可能是因为我们没有做大量的矩阵乘法运算。也可能是因为tensorflown不得不通过变量初始化采用额外的编译步骤。或者,也许可能不得不在python中运行循环,而不是在C语言中(python循环 真的很糟糕!)。我自己也不确定这到底是因为什么。

我完全意识到这绝对不是一个全面的基准测试,因为它只适用于在特定情况下的单个数据点。不过,这个库的性能并不是最先进的技术,因为我们不希望把自己卷进TensorFlow。

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

相关推荐

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

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

Tensorflow 模型 C++部署实战

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

STM32+A4988控制步进电机

基于A4988芯片驱动42步进电机,在STM32F1上进行测试,最高可以实现16细分。

个人博客 4万+

Tensorflow的C++部署系列(一):环境配置

tensorflow作为一个著名的开源深度学习框架,其在python平台的神经网络模型搭建、训练和测试等是很齐全的,但其在C++端的设计方面性能相对较差。在实际工程中,C++项目具有更省时的优点,因此基于C++的tensorflow的开发是很重要的。 一些比较知名的网络模型,例如yolo-v3系列等的C++代码较为全面,一定程度属于定制的。 然而对于一些自己编写的网络模型的支持方面,我们往往需要自己来配置环境。坦白说,笔者在配置环境方面花费了很多时间,参考了很多优秀的资料,但最后都不尽如意。作为一个小白

weixin_41068770的博客 6003

从PWM到正弦波:RC低通滤波器的魔法转换之旅

本文详细介绍了如何利用RC低通滤波器将STM32F103生成的PWM信号转换为高质量正弦波的技术原理与实践方法。通过分析滤波器设计、参数计算、硬件实现及Proteus仿真验证,为嵌入式开发者提供了一套完整的PWM转正弦波解决方案,适用于电机控制、音频信号生成等多种应用场景。

jupi8的博客 382

DataCastle-租金预测

ID:编号;时间:房屋信息采集的时间;小区名:房屋所在小区,已脱敏处理;小区房屋出租数量:小区出租房屋数量,已脱敏处理;楼层:0、1、2分别表示楼层低,中,高;总层数:房屋所在建筑的总楼层数,已脱敏处理;房屋面积:房屋面积数值,已脱敏处理;房屋朝向:房屋的朝向;居住状态:房屋的居住状态,表示是否已出租或居住中,已脱敏处理;卧室数量:户型信息,数字表示卧室的个数;卫的数量:户型信息,数字表示卫生间的个数;厅的数量:户型信息,数字表示厅的个数;

优快云 精品推荐 3458

Android 调用Tensorflow C++实现

Android 调用Tensorflow C++调用实现 概述 功能:Android 端调用Tensorflow分为Java接口和C接口调用,本文主要说明C接口的调用。通过JNI方式将结果返回给Android上层并对数据渲染处理,实现对象检测功能。其中数据内容包括left,top,right,bottom坐标及标签内容和分数等)。如果想了解如何通过训练得到最优模型及推理过程,可以通过官网了解其原理。 Tensorflow官网. 效果如图: 调用过程 1.添加OpenCV,Tensorflow 动态库,配

u014165756的博客 596

基于 ESP32 的宿舍洗浴热水余量预测与智能排队提醒系统设计与实现

本系统以 ESP32 为主控核心,通过超声波液位传感器实时监测储热水箱剩余水量,配合 DS18B20 温度传感器采集水温数据,建立热水余量预测模型估算可用洗浴时长;同时通过红外人体传感器统计浴室排队人数,结合人均洗浴时长计算预计等待时间,并通过 OLED 屏本地显示 + WiFi Web 服务器远程推送的方式实现排队提醒功能。

weixin_42300449的博客 45

TensorFlow对象检测C++实现指南

TensorFlow对象检测C++实现指南 项目介绍 本项目TensorFlow对象检测C++版由 lysukhin 开发维护,旨在提供一个基于C++的 TensorFlow 物体检测解决方案。它封装了TensorFlow的预测接口,使得开发者能够在C++环境中高效地执行预训练的对象检测模型,从而为嵌入式设备或对性能要求较高的C++应用提供了便利。 项目快速启动 环境准备 确保你的开发环境已安装好...

gitblog_00683的博客 494

深入解析:武汉光庭信息技术 Android CarPlay 开发岗位的技术要求与面试准备(大连)

武汉光庭信息大连分部招聘Android CarPlay开发工程师,要求专科以上学历及2年以上Android开发经验,需精通CarPlay集成技术与车载系统开发。该职位涉及Android底层框架修改、CarPlay协议实现及车规级系统开发,需处理USB/HID驱动、图形合成等技术难点,并确保通过Apple严格认证。求职者需具备扎实的Android开发能力,熟悉车载环境特殊性,包括系统稳定性保障、人机交互适配等技术要点。文章深度解析了职位技术内涵,并提供面试问题与参考答案,帮助求职者全面准备这一复合型技术岗位。

郑伟强dev的专栏 402

Raspberry Pi Pico SDK开发-Timer-定时

RP2040 由 Raspberry Pi 设计,具有双核 Arm Cortex-M0+ 处理器和 264KB 内部 RAM,并支持高达 16MB 的片外闪存。 广泛的灵活 I/O 选项包括 I2C、SPI 和独特的可编程 I/O (PIO)。 本实例将演示如何使用Timer的定时功能。

视觉与物联智能 2042

如何实现Visual Studio C++调用TensorFlow代码

对机器学习感兴趣的VS老司机们,在Windows上搭建好TensorFlow开发环境后,应该会迫不及待地想要编写一个C++程序调用TensorFlow代码。只要能调用成功,你就可以将机器学习融入到你的C++程序,给你的程序装上人工智能的翅膀!想想都很兴奋! (Win搭建TensorFlow环境的操作步骤可参考我的另一篇博文:http://blog.youkuaiyun.com/shadown1ght/art

ShadowN1ght的博客 1万+

使用 MATLAB/Simulink 构建一个基于PID控制的直流电机速度调节系统模型

直流电机(DC Motor)因其结构简单、成本低廉、易于控制等特点,广泛应用于各种工业自动化和家用电器中。PID控制器作为最常用的控制策略之一,在直流电机的速度调节系统中具有重要应用价值。通过合理调整比例(P)、积分(I)、微分(D)三个参数,可以实现对电机速度的精确控制。本教程将带你使用构建一个基于PID控制的直流电机速度调节系统模型,涵盖电机模型构建、PID控制器设计、系统仿真与调试等多个方面。本文介绍了如何使用构建一个基于PID控制的直流电机速度调节系统模型。

amy_mhd的博客 218

C++实现推理, 基于Tensorflow,OpenCV,NCNN,OpenVINO平台

** 环境安装 深度学习模型推理, 为啥需要学习tensorflow, 因为 需要C++部署, 为啥又需要学习opencv的深度学习推理, 因为超级简单; 1: Tensorflow C++环境配置 源码编译版本相关文件下载 参考进行核对: 相关环境配置的文件, 可用提取下载好 如下参考: protobuf-all-3.7.0 eigen3.3 tensorflow1.14.1 bazel-0.24.1-installer-linux-x86_64.sh cuda-repo-ubuntu1604

人生得意须尽欢 3116

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

TensorFlow Quantum性能优化秘籍:如何利用C++ TensorFlow Ops实现极致效率

TensorFlow Quantum是一个开源的Python框架,专为混合量子-经典机器学习设计。在处理复杂量子电路模拟时,性能往往成为瓶颈。本文将揭示如何通过C++ TensorFlow Ops实现极致效率,让你的量子机器学习模型运行速度飙升!🚀 ## 为什么C++ TensorFlow Ops是性能优化的关键? 量子计算模拟涉及大量复杂的数学运算,尤其是在处理多量子比特系统时,计算量呈指

gitblog_00165的博客 1061

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++实现tensorflow线上服务

tensorflow_service tensorflow是被广泛应用的深度学习框架,提供丰富的API接口,可以省去很多自己的开发工作。python版本的tensorflow是被应用最多的。但是python的执行效率偏低。有很多公司后台是用C++编写的,为了更好的将深度模型应用到线上,通常需要进行模型在线inference。 最近在做tensorflow模型的C++线上inference, 模型训练仍然利用python tensorflow验证效果,实际上线时,采用更加高效的C++ API进行服务。将经

TURING.DT 1105

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

如何用C++实现自己的Tensorflow-----whatwhat

摘要:TensorFlow是由谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理,它完全开源,作者通过自己的一个小项目,阐述了如何用C++实现自己的TensorFlow,这篇文章看起来可能会有点晦涩,你需要对相关知识有所了解。以下是译文。 在我们开始之前,以下是代码: Branch with Eigen backend Branch that only ...

lusic01的专栏 358

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

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

gitblog_00027的博客 517
上一篇: 成为一名合格软件工程师的7点建议
下一篇: Go语言如何实现遗传算法
csdn研发技术
博客等级 码龄9年 1381粉丝 90原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值