前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >具有mxnetR的前馈神经网络

具有mxnetR的前馈神经网络

作者头像
大数据弄潮儿
发布2017-12-20 15:58:03
1.5K0
发布2017-12-20 15:58:03
举报
文章被收录于专栏:大数据大数据

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环境中运行以下脚本进行设置。

代码语言:txt
复制
# Installation
代码语言:txt
复制
 install.packages("drat", repos="https://cran.rstudio.com")
代码语言:txt
复制
 drat:::addRepo("dmlc")
代码语言:txt
复制
 install.packages("mxnet")

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

代码语言:txt
复制
install_version("DiagrammeR", version = "0.8.1", repos = "http://cran.us.r-project.org")

使用MXNet创建深度学习模型

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

代码语言:txt
复制
library(mxnet)
代码语言:txt
复制
hr_data <- read.csv("F:/git/deep_learning/mxnet/hrdata/HR.csv")
代码语言:txt
复制
head(hr_data)
代码语言:txt
复制
str(hr_data)
代码语言:txt
复制
summary(hr_data)

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

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

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

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

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

代码语言:txt
复制
#做出预测
代码语言:txt
复制
 preds <- predict(mlpmodel, test.x)
代码语言:txt
复制
 dim(preds)

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

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

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

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

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

代码语言:txt
复制
graph.viz(mlpmodel$symbol$as.json())

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

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

代码语言:txt
复制
#做出预测
代码语言:txt
复制
preds <- predict(dp_model, test.preds)
代码语言:txt
复制
preds.target <- apply(data.frame(preds[1,]), 1, function(x) {ifelse(x >0.5, 1, 0)})
代码语言:txt
复制
table(test.target,preds.target)

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

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档