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

相关文章

来自专栏计算机视觉战队

深度学习——感受野

最近在组会讲解框架时,在感受野这个小知识点,大家开始产生歧义,今天我就简单的给大家讲解下这个小知识点,也给初学者带来一个对Receptive Field崭新的认...

4317
来自专栏小鹏的专栏

tensorflow_cookbook--preface

Preface         TensorFlow在2015年11月由Google开放,从此,它已经成为GitHub上最受欢迎的机器学习库。 TensorFl...

18110
来自专栏机器之心

学界 | 斯坦福论文提出MoleculeNet:分子机器学习新基准

选自arXiv 机器之心编译 参与:路雪、李泽南 分子机器学习快速发展,但是缺少用于对比不同方法性能的标准基准,算法进步因此受到限制。斯坦福的研究者提出一种适合...

3037
来自专栏计算机视觉战队

如何成为一名成功的“炼丹师”——DL训练技巧

---- ---- 今天给大家讲讲DNN(深度神经网络)在训练过程中遇到的一些问题,然后我们应该怎么去注意它,并学会怎么去训练它。 1、数据集的准备: 必须要...

3074
来自专栏人工智能

使用TensorFlow自动识别验证码(三)

先知安全技术社区独家发表本文,如需要转载,请先联系先知案件技术社区授权;未经授权请勿转载。 0X000 前言 这是该 系列的第三篇文章, 本系列最后一篇。前面几...

2427
来自专栏社区的朋友们

[ I am Jarvis ] :聊聊 FaceID 背后的深度学习视觉算法

在苹果用 FaceID 取代 TouchID 的背后,是强大的视觉算法支持,让 iPhoneX 有能力识别各种欺骗和伪装,从而敢于将 FaceID 作为最重要的...

9982
来自专栏BestSDK

Google发布Tensorflow物体识别API ,自动识别视频内容

做图像识别有很多不同的途径。谷歌最近发布了一个使用Tensorflow的物体识别API,让计算机视觉在各方面都更进了一步。 ? API概述 这个API是用COC...

6485
来自专栏人工智能头条

如何通过机器学习还原图像色彩

1432
来自专栏计算机视觉战队

简单理解感受野

最近在组会讲解框架时,在感受野这个小知识点,大家开始产生歧义,今天我就简单的给大家讲解下这个小知识点,也给初学者带来一个对Receptive Field崭新的认...

2774
来自专栏机器之心

学界 | Ian Goodfellow等人提出对抗重编程,让神经网络执行其他任务

作者:Gamaleldin F. Elsayed、Ian Goodfellow、Jascha Sohl-Dickstein

1123

扫码关注云+社区