具有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 条评论
登录 后参与评论

相关文章

来自专栏大数据文摘

数据挖掘比赛通用框架

2178
来自专栏机器学习算法与Python学习

视频 | Yann LeCun:人工智能下一站——无监督学习

关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第二 【Python】:排名第三 【算法】:排名第四 ?

2896
来自专栏大数据挖掘DT机器学习

基于libsvm的中文文本分类原型

李海波 http://blog.csdn.net/marising/article/details/5844063 支持向量机(Support Vector...

4508
来自专栏机器学习之旅

python开发:特征工程代码模版(二)

正题开始: 这篇文章是入门级的特征处理的打包解决方案的python实现汇总,如果想get一些新鲜血液的朋友可以叉了,只是方便玩数据的人进行数据特征筛选的代码集...

963
来自专栏CDA数据分析师

机器学习实战:8大分类器识别树叶带源码

今天我想送给大家两句话:1:在这个浮躁的社会中,每个人都想找到捷径,那么我想认真踏实地做好一件事也便是最大的捷径了。2:不要管别人做什么,有自己的目标,可能你现...

1905
来自专栏专知

基于TensorFlow的机器学习速成课程25讲视频全集(19-20讲)

1632
来自专栏机器之心

资源 | GitHub新开放项目FoolNLTK:一个便捷的中文处理工具包

34511
来自专栏hadoop学习笔记

处理数据缺失的结构化解决办法

数据缺失是数据科学家在处理数据时经常遇到的问题,本文作者基于不同的情境提供了相应的数据插补解决办法。没有完美的数据插补法,但总有一款更适合当下情况。

120
来自专栏CDA数据分析师

怎样入手学习R的算法?

文 | 陆勤 来源 | 数据人网 R是目前学习R语言中应用最广泛的平台。当你认真起来学习R的时候你会找到学习R的窍门。 它之所以功能强大是因为很多机器学习的算法...

1929
来自专栏人工智能的秘密

研究中文文本相似度能解决很多NLP领域文本相关的问题

人与计算机的交互过程中,如果能提供人类的自然语言形式来进行交流,那人与计算机就能更加亲密友好。而要实现这一机制就需要自然语言处理来处理,一般来说自然语言处理会涉...

3020

扫码关注云+社区