哇塞,好久么有跟进mxnet啦,python改版了好多好多啊,突然发现C++用起来才是最爽的. 贴一个mxnet中的C++Example中的mlp网络和实现,感觉和python对接毫无违和感。真是一级棒呐.

//
// Created by xijun1 on 2017/12/8.
// #include <iostream>
#include <vector>
#include <string>
#include <mxnet/mxnet-cpp/MxNetCpp.h>
#include <mxnet/mxnet-cpp/op.h> namespace mlp{ template < typename T , typename U >
class MLP{
public:
static mx_float OutputAccuracy(mx_float* pred, mx_float* target) {
int right = ;
for (int i = ; i < ; ++i) {
float mx_p = pred[i * + ];
float p_y = ;
for (int j = ; j < ; ++j) {
if (pred[i * + j] > mx_p) {
mx_p = pred[i * + j];
p_y = j;
}
}
if (p_y == target[i]) right++;
}
return right / 128.0;
}
static bool train(T x , U y);
static bool predict(T x);
static bool net() {
using mxnet::cpp::Symbol;
using mxnet::cpp::NDArray; Symbol x = Symbol::Variable("X");
Symbol y = Symbol::Variable("label"); std::vector<std::int32_t> shapes({ , });
//定义一个两层的网络. wx + b
Symbol weight_0 = Symbol::Variable("weight_0");
Symbol biases_0 = Symbol::Variable("biases_0"); Symbol fc_0 = mxnet::cpp::FullyConnected("fc_0",x,weight_0,biases_0
,); Symbol output_0 = mxnet::cpp::LeakyReLU("relu_0",fc_0,mxnet::cpp::LeakyReLUActType::kLeaky); Symbol weight_1 = Symbol::Variable("weight_1");
Symbol biases_1 = Symbol::Variable("biases_1");
Symbol fc_1 = mxnet::cpp::FullyConnected("fc_1",output_0,weight_1,biases_1,);
Symbol output_1 = mxnet::cpp::LeakyReLU("relu_1",fc_1,mxnet::cpp::LeakyReLUActType::kLeaky);
Symbol pred = mxnet::cpp::SoftmaxOutput("softmax",output_1,y); //目标函数,loss函数 //定义使用计算驱动
mxnet::cpp::Context ctx = mxnet::cpp::Context::cpu( );
NDArray arr_x(mxnet::cpp::Shape( , ) , ctx , false);
NDArray arr_y(mxnet::cpp::Shape() , ctx , false ); //定义输入数据
std::shared_ptr< mx_float > aptr_x(new mx_float[*] , [](mx_float* aptr_x){ delete [] aptr_x ;});
std::shared_ptr< mx_float > aptr_y(new mx_float[] , [](mx_float * aptr_y){ delete [] aptr_y ;}); //初始化数据
for(int i= ; i< ; i++){
for(int j=;j< ; j++){
//定义x
aptr_x.get()[i*+j]= i % +0.1f;
} //定义y
aptr_y.get()[i]= i % ;
} //将数据转换到NDArray中
arr_x.SyncCopyFromCPU(aptr_x.get(),*);
arr_x.WaitToRead(); arr_y.SyncCopyFromCPU(aptr_y.get(),);
arr_y.WaitToRead(); //定义各个层参数的数组
NDArray arr_w_0(mxnet::cpp::Shape(,),ctx, false);
NDArray arr_b_0(mxnet::cpp::Shape( ),ctx,false);
NDArray arr_w_1(mxnet::cpp::Shape( , ) , ctx , false);
NDArray arr_b_1(mxnet::cpp::Shape( ) , ctx , false); //初始化权重参数
arr_w_0 = 0.01f;
arr_b_1 = 0.01f;
arr_w_1 = 0.01f;
arr_b_1 = 0.01f; //求解梯度 NDArray arr_w_0_g(mxnet::cpp::Shape( , ),ctx, false);
NDArray arr_b_0_g(mxnet::cpp::Shape( ) , ctx , false);
NDArray arr_w_1_g(mxnet::cpp::Shape( , ) , ctx , false);
NDArray arr_b_1_g(mxnet::cpp::Shape( ) , ctx , false); //将数据绑定到网络图中. //输入数据参数
std::vector< NDArray > bind_data;
bind_data.push_back( arr_x );
bind_data.push_back( arr_w_0 );
bind_data.push_back( arr_b_0 );
bind_data.push_back( arr_w_1 );
bind_data.push_back( arr_b_1 );
bind_data.push_back( arr_y ); //所有的梯度参数
std::vector< NDArray > arg_grad_store;
arg_grad_store.push_back( NDArray() ); //不需要输入的梯度
arg_grad_store.push_back( arr_w_0_g );
arg_grad_store.push_back( arr_b_0_g );
arg_grad_store.push_back( arr_w_1_g );
arg_grad_store.push_back( arr_b_1_g );
arg_grad_store.push_back( NDArray() ); //不需要输出 loss 的梯度 //如何操作梯度.
std::vector< mxnet::cpp::OpReqType > grad_req_type; grad_req_type.push_back(mxnet::cpp::kNullOp);
grad_req_type.push_back(mxnet::cpp::kWriteTo);
grad_req_type.push_back(mxnet::cpp::kWriteTo);
grad_req_type.push_back(mxnet::cpp::kWriteTo);
grad_req_type.push_back(mxnet::cpp::kWriteTo);
grad_req_type.push_back(mxnet::cpp::kNullOp); //定义一个状态数组
std::vector< NDArray > aux_states; std::cout<<" make the Executor"<<std::endl; std::shared_ptr<mxnet::cpp::Executor > executor
= std::make_shared<mxnet::cpp::Executor>(
pred,
ctx,
bind_data,
arg_grad_store,
grad_req_type,
aux_states );
//训练
std::cout<<" Training "<<std::endl; int max_iters = ; //最大迭代次数
mx_float learning_rate = 0.0001; //学习率 for (int iter = ; iter < max_iters ; ++iter) {
executor->Forward(true);
if(iter % == ){
std::vector<NDArray> & out = executor->outputs;
std::shared_ptr<mx_float> tp_x( new mx_float[*] ,
[](mx_float * tp_x){ delete [] tp_x ;});
out[].SyncCopyToCPU(tp_x.get(),*);
NDArray::WaitAll();
std::cout<<"epoch "<<iter<<" "<<"Accuracy: "<< OutputAccuracy(tp_x.get() , aptr_y.get())<<std::endl;
}
//依据梯度更新参数
executor->Backward();
for (int i = ; i < ; ++i) {
bind_data[i] -= arg_grad_store[i]*learning_rate;
}
NDArray::WaitAll();
} }
static bool SetDriver();
}; template <typename T , typename U >
bool MLP<T,U>::SetDriver() {
return true;
}
template <typename T , typename U >
bool MLP<T,U>::train(T x, U y) {
return true;
}
template <typename T , typename U >
bool MLP<T,U>::predict(T x) {
return true;
} } int main(int argc , char * argv[]){
mlp::MLP<mx_float ,mx_uint>::net();
MXNotifyShutdown();
return ;
}

结果:

poch 18900 Accuracy: 0.703125
epoch 19000 Accuracy: 0.703125
epoch 19100 Accuracy: 0.703125
epoch 19200 Accuracy: 0.703125
epoch 19300 Accuracy: 0.703125
epoch 19400 Accuracy: 0.703125
epoch 19500 Accuracy: 0.703125
epoch 19600 Accuracy: 0.703125
epoch 19700 Accuracy: 0.703125
epoch 19800 Accuracy: 0.703125
epoch 19900 Accuracy: 0.703125

mxnet框架样本,使用C++接口的更多相关文章

  1. 可变卷积Deforable ConvNet 迁移训练自己的数据集 MXNet框架 GPU版

    [引言] 最近在用可变卷积的rfcn 模型迁移训练自己的数据集, MSRA官方使用的MXNet框架 环境搭建及配置:http://www.cnblogs.com/andre-ma/p/8867031. ...

  2. 基于MXNET框架的线性回归从零实现(房价预测为例)

    1.基于MXNET框架的线性回归从零实现例子 下面博客是基于MXNET框架下的线性回归从零实现,以一个简单的房屋价格预测作为例子来解释线性回归的基本要素.这个应用的目标是预测一栋房子的售出价格(元). ...

  3. 使用Thinkphp框架开发移动端接口

     本文给大家分享的是使用thinkphp框架开发移动端接口的2种方法,一种是开发API,另外一种是实现移动端访问自动切换移动主题模板,从而实现伪app访问,下面我们就来详细看下如何实现吧. 方案一:给 ...

  4. Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...

  5. 集合框架的类和接口均在java.util包中。 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换。

    集合框架的类和接口均在java.util包中. 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换.

  6. Java:concurrent包下面的Map接口框架图(ConcurrentMap接口、ConcurrentHashMap实现类)

    Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...

  7. Net系列框架-Dapper+AutoFac 基于接口

    Net系列框架-Dapper+AutoFac 基于接口 工作将近6年多了,工作中也陆陆续续学习和搭建了不少的框架,后续将按由浅入深的方式,整理出一些框架源码,所有框架源码本人都亲自调试通过,如果有问题 ...

  8. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

  9. Mxnet框架搭建

    Mxnet框架搭建 小书匠 kindle  Mxnet是亚马逊开发的深度学习框架,和谷歌Tensorflow是同类型的框架. 1.安装Mxnet 这里只展示在线安装,源码编译安装等不演示:GPU安装与 ...

随机推荐

  1. IntelliJ IDEA 左侧列表设置忽略文件格式

    什么问题 idea 中设置忽略文件 Unity开发过程中使用Lua做逻辑开发 Unity会自动生成xx.meta文件 这种文件再使用Idea开发过程中没有用处 显示文件列表中会看着比较乱 如何设置 F ...

  2. Web服务器、应用服务器、Web容器、反向代理服务器区别与联系

    作者: 帅虫哥 出处:www.cnblogs.com/vipyoumay/p/7455431.html(点击尾部阅读原文前往) 我们知道,不同肤色的人外貌差别很大,而双胞胎的辨识很难.有意思的是Web ...

  3. sqlserver 存储过程 递归查询分组+hierarchyid重建会员关系

    CREATE PROCEDURE [dbo].[GetGroupInfo] @s_code NVARCHAR() = --会员卡号 AS BEGIN declare @p int; --查询唯一性结果 ...

  4. Fiori缓存与它的清除

    最近在修改已有的Fiori应用,遇到了缓存上的一点问题,导致对Fiori应用的代码修改不能在前端页面生效.现将自己查到的一篇好资料翻译过来,以供参考.以下为正文. 2017.12.19更新:最近又遇到 ...

  5. spring boot + Thymeleaf开发web项目

    "Spring boot非常适合Web应用程序开发.您可以轻松创建自包含的HTTP应用.web服务器采用嵌入式Tomcat,或者Jetty等.大多数情况下Web应用程序将使用 spring- ...

  6. 什么是WAL?

    在写完上一篇<Pull or Push>之后,原本计划这一片写<存储层设计>,但是临时改变主意了,想先写一篇介绍一下消息中间件最最基础也是最核心的部分:write-ahead ...

  7. 学习Object.assign()

    Object.assign()用于将所有可枚举的值从一个或多个源对象复制到目标对象.它将返回目标对象. 语法 Object.assign(target, ...source); var obj = { ...

  8. Lambda表达式补充

    l“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式树类型. lLambda 表达式的运算符 =>,该运算符读为“goes to”. l=> 运算符 ...

  9. [经验分享]Linux网络连接-VMware+CentOS 7

    VMware虚拟机中安装CentOS,进行网络连接,分为两步,内网连接,与外网连接. 前提: 当你正确安装VMware后,网络适配器会增加2个新的网卡:(可在设备管理器->网络适配器中查看) 第 ...

  10. Chrome不支持本地Ajax请求,解决办法

    Chrome不支持本地Ajax请求,当我在.html文件中访问.json文件时就会出现这个问题,就是说这个时候不能加载这个.html文件. 解决方式 打开Chrome快捷方式的属性中设置: 右击Chr ...