具有mxnetR的前馈神经网络

mxnetR是一个深度学习软件包,可与所有深度学习类型一起使用,包括前馈神经网络(FNN)。FNN具有隐藏层的简单处理单元。

这是我们的深度学习系列的第三部分。本系列的第一本是“深入深度学习”,重点介绍深度学习的基础知识。第二个是使用H2O Deep Learning软件包作为自动编码器来创建一个异常检测器

在这篇文章中,我们将向您介绍前馈神经网络。本部分将重点讨论mxnetR,这是一个开放源代码的深度学习软件包,可与所有深度学习类型一起使用:前馈神经网络(FNN),卷积神经网络(CNN)和递归神经网络(RNN)。

前馈神经网络

为了从一个正式的定义开始,一个前馈神经网络(即一个多层感知器或MLP)由大量简单的处理单元组成,这些处理单元称为以多个隐藏层组织的感知器。

重申一下我在前一篇文章中所描述的内容。

输入层由接受输入值的神经元组成。这些神经元的输出与输入预测器相同。

输出层是神经网络的最后一层,将结果返回给用户环境。基于神经网络的设计,它也表示以前的层次在学习资讯方面有何表现,并据此改善功能。

隐藏的图层位于输入图层和输出图层之间。通常,隐藏层的数量从一个到多个不等。这些中央计算层具有将输入映射到节点输出的功能。

我们可以说感知器是人工神经网络的基本处理单元。感知器需要几个输入并产生一个输出,如下图所示。

通常,这些感知器的输入与权重相关。感知器计算输入的加权和并对其应用特定的函数。这个功能被称为激活或传递函数。传递函数使用数学函数将求和输出的结果转换为工作输出。

大多数情况下,传递函数是微分函数,可以连续纠错并计算局部梯度(如Sigmoid函数或tanh函数)。这类似于输出所有输出类别概率的真实神经元。但是,它们通常也可以是基于某个阈值将输出设置在两个级别的阶梯函数。线性单位也有第三类,其中输出与总加权输出成正比。维基百科有一个完整的激活功能列表

神经网络的最好的部分是神经元能适应从错误中学习并改善其结果。各种方法被纳入神经网络,使其具备适应性。最常用的是Delta规则(Delta rule)和误差反向传播算法(back error propagation)。前者用于前馈网络,基于梯度下降学习,后者用于反馈网络,如递归神经网络。

在我的书Data Science Using Oracle Data Miner and Oracle R Enterprise(由Apress出版)中,我已经介绍了更多关于神经网络的内容。

从MXNet开始使用R

如前所述,MXNet是包含前馈神经网络(FNN),卷积神经网络(CNN)和递归神经网络(RNN)的深度神经网络。使用MXNet的CNN和RNN是未来文章讨论的一部分。

MXNet R软件包为R提供了灵活高效的GPU计算和最先进的深度学习。虽然我们使用R来演示MXNet,但它也得到Python,Julia,C ++和Scala等其他语言的支持。所以,如果你对R不感兴趣,可以用你最喜欢的编程语言来尝试这个例子。

R中的MXNet安装非常直接。您可以直接在R环境中运行以下脚本进行设置。

# Installation
 install.packages("drat", repos="https://cran.rstudio.com")
 drat:::addRepo("dmlc")
 install.packages("mxnet")

但是,对于Windows 7用户,DiagrammeR的其中一个组件存在版本问题。您可以使用以下命令将其降级到v 0.8.1。如果遇到任何其他问题,MXNet网站会列出常见的安装问题。

install_version("DiagrammeR", version = "0.8.1", repos = "http://cran.us.r-project.org")

使用MXNet创建深度学习模型

我们都准备在R中探索MXNet。我正在使用Kaggle的HR分析数据集进行演示。数据集是大约14,999行的小样本。学习如何使用MXNet构建前馈网络后,你可以使用其他数据集进行试用。我们在本文中的目的是帮助您了解和使用MXNet。

library(mxnet)
hr_data <- read.csv("F:/git/deep_learning/mxnet/hrdata/HR.csv")
head(hr_data)
str(hr_data)
summary(hr_data)

接下来,我们将执行一些必要的数据预处理,并将数据划分为训练集和测试集。训练数据集将用于训练模型和测试数据集,以验证新训练模型的准确性。

#将一些变量转换为因素
 hr_data$sales<-as.factor(hr_data$sales)
 hr_data$salary<-as.factor(hr_data$salary)
 hr_data$Work_accident <-as.factor(hr_data$Work_accident)
 hr_data$promotion_last_5years <-as.factor(hr_data$promotion_last_5years)
 smp_size <- floor(0.70 * nrow(hr_data))
## 设置种子,使您的分区变成可被复制的
 set.seed(1)
 train_ind <- sample(seq_len(nrow(hr_data)), size = smp_size)
 train <- hr_data[train_ind, ]
 test <- hr_data[-train_ind, ]
 train.preds <- data.matrix(train[,! colnames(hr_data) %in% c("left")])
 train.target <- train$left
 head(train.preds)
 head(train.target)
 test.preds <- data.matrix(test[,! colnames(hr_data) %in% c("left")])
 test.target <- test$left
 head(test.preds)
 head(test.target)

要创建一个前馈网络,您可以直接使用mx.mlp,这是一个方便的用来创建多层感知器的界面。参数描述在每个使用的参数的注释中。

#设置种子来重现结果
 mx.set.seed(1)
  mlpmodel <- mx.mlp(data = train.preds
   ,label = train.target
   ,hidden_node = c(3,2) #2层——第1、2层分别3、2个节点
   ,out_node = 2 #设置输出节点的数量
   ,activation="sigmoid" #隐藏层的激活函数
   ,out_activation = "softmax" 
   ,num.round = 10 #迭代次数
   ,array.batch.size = 5 #更新权重批量大小
   ,learning.rate = 0.03 #和步长相同
   ,eval.metric= mx.metric.accuracy
   ,eval.data = list(data = test.preds, label = test.target))

一旦训练完成,您可以使用预测方法对测试数据集进行预测:

#做出预测
 preds <- predict(mlpmodel, test.x)
 dim(preds)

函数mx.mlp()本质上是使用MXNet定义神经网络的更灵活但冗长的符号系统的替代品。该符号是MXNet中的构件块神经网络。它是一种功能对象,可以接受多个输入变量并产生多个输出变量。各个符号可以堆叠在一起以产生复杂的符号。这有助于形成具有各层的复杂神经网络,每层被定义为彼此堆叠的单个符号。

符号定义中前一个网络的等价物将是:

#配置网络结构
 data <- mx.symbol.Variable("data")
 fc1 <- mx.symbol.FullyConnected(data, name = "fc1", num_hidden=3) #first hidden layer with activation function sigmoid
 act1 <- mx.symbol.Activation(fc1, name = "sig", act_type="sigmoid") 
 fc2 <- mx.symbol.FullyConnected(act1, name = "fc2", num_hidden=2) #second hidden layer with activation function relu
 act2 <- mx.symbol.Activation(fc2, name = "relu", act_type="relu") 
 out <- mx.symbol.SoftmaxOutput(act2, name = "soft")
#训练网络
 dp_model <- mx.model.FeedForward.create(symbol = out
  ,X = train.preds
  ,y = train.target
  ,ctx = mx.cpu()
  ,num.round = 10
  ,eval.metric = mx.metric.accuracy
  ,array.batch.size = 50
  ,learning.rate = 0.005
  ,eval.data = list(data = test.preds, label = test.target))

这种类型的配置可以灵活地为多个隐藏层配置具有不同参数的网络。例如,我们可以使用第1层的sigmoid激活函数,第2层使用ReLu(Rectified Linear Units)激活函数,等等。

你也可以通过使用下面的代码片段来可视化地检查创建的神经网络:

graph.viz(mlpmodel$symbol$as.json())

计算图显示了定义的神经网络的结构。我们可以看到第一个带有三个节点和sigmoid激活函数的隐藏层,第二个隐藏层带有两个节点和Relu激活函数,最后的输出带有softmax函数。

最后,我们可以使用相同的预测应用程序编程接口(API)来创建预测,并创建一个混淆矩阵来确定新数据集上预测的准确性。

#做出预测
preds <- predict(dp_model, test.preds)
preds.target <- apply(data.frame(preds[1,]), 1, function(x) {ifelse(x >0.5, 1, 0)})
table(test.target,preds.target)

你可以从我的GitHub页面上下载代码,也可以学习MXNet的优秀教程,因为我们在MXNet上有更多关于创建CNN和RNN的文章。

原文链接:https://dzone.com/articles/feed-forward-neural-network-with-mxnetr

原文作者:Sibanjan Das

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SDNLAB

国外主流SD-WAN产品对比

Lasted Updated: July 12, 2017 (Juniper added) Velocloud ViptelaVersa Silver ...

3984
来自专栏搞前端的李蚊子

Html5模拟通讯录人员排序(sen.js)

// JavaScript Document  var PY_Json_Str = ""; var PY_Str_1 = ""; var PY_Str_...

4576
来自专栏运维一切

apache正向代理配置 原

873
来自专栏Ryan Miao

ehcache报错

jfinal2.0+tomcat7+ehcache2.6.11+Linux Linux version 2.6.18-164.el5 (mockbuild@x8...

3589
来自专栏测试开发架构之路

分享一本关于稀疏信号处理的书给大家,也是我曾读过的教材[附下载链接]

Sparse Signal Processing 作者/authors M Azghani, F Marvasti 摘要/abstract Convention...

3307
来自专栏技术之路

QTableView 添加进度条

记录一下QTableView添加进度条 例子很小,仅供学习 使用QItemDelegate做的实现 有自动更新进度 ? 要在.pro文件里添加  CONFIG ...

2305
来自专栏一个会写诗的程序员的博客

ClassMetadataReadingVisitor has interface org.springframework.asm.ClassVisitor as super class

ClassMetadataReadingVisitor has interface org.springframework.asm.ClassVisitor a...

855
来自专栏文武兼修ing——机器学习与IC设计

关于空难数据集的探索分析导入数据集伤亡分析机型处理时间分析

写在前面: 这是我见过的最严肃的数据集,几乎每一行数据背后都是生命和鲜血的代价。这次探索分析并不妄图说明什么,仅仅是对数据处理能力的锻炼。因此本次的探索分析...

3625
来自专栏吴伟祥

Apache POI总结 原

Apache POI  是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格...

651
来自专栏吉浦迅科技

NVIDIA Jetson TX2到底支持哪些摄像头?

NVIDIA Jetson TX2都支持哪些摄像头?——这个问题一直被问起,Lady我今天汇整了一下,当然可以支持的摄像头或者相机并不局限在这里,也欢迎各位宝宝...

2152

扫码关注云+社区