近年来深度学习在人工智能领域飞速发展,各行业的学者、研究职员纷纷涌入研究高潮。本文将从 R 语言角度来先容深度学习并解决以下几个问题:
- 什么是深度学习?
- 相干深度学习包有哪些?
- 怎样设置工作环境?
- 怎样使用神经网络建立模子?
本文主要解决:怎样使用神经网络建立模子?,其他推文可见:基于 R 语言的深度学习——设置环境;基于 R 语言的深度学习——简介及资料分享。
简单神经网络建模
本节将从一个简单的回归例子[1]来先容怎样在 R 中使用 keras 包进行深度学习。
该案例是在 CPU 下进行的。如果你的装备有 GPU,并想用 GPU 训练模子。你不必要修改以下的代码,只需前期安装 GPU 版本的 TensorFlow,默认情况下,运算会优先使用 GPU。
知识点包括:
- 数据导入与数据处置处罚。
- 构建神经网络。
- 训练神经网络。
- 评估模子的准确性。
- 生存并规复创建的模子。
加载包
- library(keras)
- library(mlbench) #使用内部数据
- library(dplyr)
- library(magrittr)
复制代码 加载数据
使用 1970 年波士顿 506 个生齿普查区的住房数据作为例子。该数据集一共有 14 列,506 行。其中,因变量为 medv(自有住房的中位数报价, 单位 1000 美元),自变量为其他 13 个变量,包括:CRIM (城镇人均犯罪率)、ZN(占地面积凌驾 25000 平方英尺的住宅用地比例)、INDUS (每个城镇非零售业务的比例)等。
- data("BostonHousing")
- data <- BostonHousing
- data %<>% mutate_if(is.factor, as.numeric)
- knitr::kable(head(data[,1:12])) #由于呈现不了所有列,这里只展示 12 列的前 6 行数据。
复制代码 crimzninduschasnoxrmagedisradtaxptratiob0.0063182.3110.5386.57565.24.090129615.3396.90.027307.0710.4696.42178.94.967224217.8396.90.027307.0710.4697.18561.14.967224217.8392.80.032402.1810.4586.99845.86.062322218.7394.60.069002.1810.4587.14754.26.062322218.7396.90.029902.1810.4586.43058.76.062322218.7394.1 数据处置处罚
首先,对 506 条数据进行划分。随机选择其中的 70% 数据作为训练样本,别的 30% 数据作为测试样本。
- # 构建矩阵
- data <- as.matrix(data)
- dimnames(data) <- NULL
- # 数据集划分
- set.seed(1234)
- ind <- sample(2, nrow(data), replace = T, prob = c(.7, .3)) #从 1,2 中有放回抽取一个数,概率分别为(0.7,0.3)。
- training <- data[ind==1,1:13]
- test <- data[ind==2, 1:13]
- trainingtarget <- data[ind==1, 14]
- testtarget <- data[ind==2, 14]
复制代码 别的,由于各个特征的数据范围不同,直接输入到神经网络中,会让网络学习变得困难。以是在进行网络训练之前,先将该数据集进行特征尺度化:输入数据中的每个特征,将其减去特征均匀值并除以尺度差,使得特征值以 0 为中央,且具有单位尺度差。在 R 中可以使用 scale() 函数实现该效果。
数据集 BostonHousing 也可以直接通过 keras 包中的 dataset_boston_housing() 进行加载,并且已经提前划分好了训练集和测试集。本文使用的是 mlbench 包中数据集进行加载,主要是呈现划分数据集的过程。
- # 数据标准化
- m <- colMeans(training)
- s <- apply(training, 2, sd)
- training <- scale(training, center = m, scale = s)
- test <- scale(test, center = m, scale = s)
复制代码 构建模子
由于可用样本量很少,这里构建一个非常小的网络。使用 keras_model_sequential() 界说模子,并设置了 1 个隐藏层和 1 个输出层。激活函数为 relu。
- model <- keras_model_sequential() %>%
- layer_dense(units = 10, activation = 'relu', input_shape = c(13)) %>%
- layer_dense(units = 1)
复制代码 通过 summary() 查察模子个层外形和参数,可以看到,统共包罗 151 个参数。
- summary(model)
- ## Model: "sequential"
- ## ________________________________________________________________________________
- ## Layer (type) Output Shape Param #
- ## ================================================================================
- ## dense_1 (Dense) (None, 10) 140
- ##
- ## dense (Dense) (None, 1) 11
- ##
- ## ================================================================================
- ## Total params: 151
- ## Trainable params: 151
- ## Non-trainable params: 0
- ## ________________________________________________________________________________
复制代码 编译模子
编译主要必要设定三个部分:
- 损失函数:训练期间必要最小化的目的函数;
- 优化器:对数据和损失函数进行自我更新;
- 监控度量:训练和测试期间的评价尺度。
该例子是一个典范的回归问题,我们使用的损失函数是均方偏差(Mean Square Error,MSE),即预测和目的之间差异的平方。使用均方根传播方法(Root Mean Squared Propagation,RMSProp)作为该模子的优化器。使用均匀绝对偏差(Mean Absolute Error,MAE)来监控网络。
- model %>% compile(loss = 'mse', #损失函数
- optimizer = 'rmsprop', #优化器
- metrics = 'mae'#监控度量
- )
复制代码 优化器有很多种,详细先容可参考:理论[2]、实践[3];损失函数和评价度量的选择,可以参考这篇博客[4]。
拟合模子
拟合模子时,RStudio 的 Viewer 会出现:随着迭代变化的损失函数值。如下所示:
- mymodel <- model %>%
- fit(training,
- trainingtarget,
- epochs = 200,
- batch_size = 32,
- validation_split = 0.2)
复制代码
图中的 loss 是指损失函数,val_loss 是指验证集下的损失函数(代码中设置的验证集划分比例为 0.2)。mae 表示均匀绝对偏差,而 val_mae 表示验证集下的均匀绝对偏差。图中可以看到,随着训练轮数的增长,mae 与 loss 在不断减小并趋于稳定。
评估模子
使用 evaluate() 评估模子,给出预测效果。计算真实值和预测值的均方偏差。
- model %>% evaluate(test, testtarget)
- ## loss mae
- ## 42.571 4.185
- pred <- predict(model,test) #预测结果
- mean((testtarget-pred)^2) #计算均方误差
- ## [1] 42.57
复制代码 通过 ggplot2[5] 包将预测效果和真实效果可视化。
- library(ggplot2)
- library(viridis)
- library(ggsci)
- ev_data = data.frame("Item" = seq(1,length(pred)),
- "Value" = c(testtarget,pred),
- "Class" = rep(c("True","Pred"),each = length(pred)))
- ggplot(ev_data) +
- geom_line(aes(Item,Value,col = Class,lty = Class)) +
- scale_color_aaas() +
- theme_bw() +
- theme(panel.grid = element_blank())
复制代码
总体来看,预测效果还算不错,但是也有一些预测效果和真实值相差甚远。主要缘故原由是,我们没有调解参数来使模子到达最优的效果。读者可以使用 K 折验证的方法来探求最有的参数,例如:训练轮数,神经网络层数,各层神经元数等。具体案例可以见 《Deep Learning with R》的第 3.6.4 节[6]。
存储 / 加载模子
为了生存 Keras 模子以供将来使用,使用 save_model_tf() 函数生存模子。
- save_model_tf(object = model, filepath = "BostonHousing_model") #保存模型
复制代码 使用 load_model_tf() 函数加载模子,并对新数据集(下面使用测试集)进行预测。
- reloaded_model <- load_model_tf("BostonHousing_model") #加载模型
- predict(reloaded_model, test) #对新数据集进行预测
复制代码 相干拓展
以上例子先容了怎样使用神经网络来处置处罚简单问题(数据量较小的回归问题),但在实际过程中可能面对种种困难,包括:怎样对数据进行预处置处罚,怎样进行特征筛选,怎样解决过拟合问题,怎样调解参数等。
由于笔者时间和能力有限,这篇推文不能一一给出系统的解决方案。相干资源可见:基于 R 语言的深度学习——简介及资料分享,以供读者翻阅。
该系列还会继承写下去,欢迎来我的公众号《庄闪闪的 R 语言手册》关注新内容。
参考资料
[1]
回归例子: https://github.com/fmmattioni/deep-learning-with-r-notebooks/blob/master/notebooks/3.6-predicting-house-prices.Rmd
[2]
理论: http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf
[3]
实践: https://keras.io/api/optimizers/
[4]
博客: https://machinelearningmastery.com/how-to-choose-loss-functions-when-training-deep-learning-neural-networks/
[5]
ggplot2: https://ggplot2.tidyverse.org/
[6]
3.6.4 节: https://github.com/fmmattioni/deep-learning-with-r-notebooks/blob/master/notebooks/3.6-predicting-house-prices.Rmd
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |