本课程主要介绍基于R的语言的深度学习,主要会介绍的是keras 这个包,或者说这个框架。本课程不会过多的介绍深度学习的理论只是,而是侧重于基于R语言的深度学习的实现以及应用。

资料:

  1. https://keras.io/examples/ -python
  2. https://keras.rstudio.com/ - R keras
  3. Tensorflow:https://tensorflow.rstudio.com/
  4. https://tensorflow.rstudio.com/tutorials/ 教程
  5. https://blogs.rstudio.com/ai/ 里面有很多相关文章 6 keras cheatsheet

1 什么是深度学习

最近,人工智能,机器学习,数据挖掘,深度学习这些概念都非常的火,人人都听说过这些词语,人人也都想把这些东西应用起来,但是鲜少有人能够很好的理解这些东西到底是什么,能够干什么原理是什么。

人工智能,artificial intelligence ,也就是AI,想必大多数人曾经通过文艺作品对AI这个概念有过不准确的了解。人工智能,AI起源于1950年代,其属于计算机科学的一个领域,这个领域的起源思想其实也非常的朴素,就是计算机能不能像人一样的思考。不过很遗憾,到今天位置,计算机离像人那样能思考的那一天还非常的遥远。

关于这个领域的一个定义是:the effort to automate intellectual tasks normally performed by humans。

人工智能领域包含了机器学习(machine leaning )和深度学习(deep learning),除此之外,还有很多其他内容属于人工只能这个领域,例如强化学习。

机器学习,有时候也叫统计机器学习,主要是解决两类问题,分类(classification)和回归(regression)。分类指的是将目标划分成为某一个类别,例如,图片中的动物是不是狗(二分类),或者图片中的数字是几(多酚类)。回归指的是预测出一个数值,例如预测某个区域的房价。二者本质上都是构建一个映射,数据到(data)目标(label)的一个映射

深度学习其实是深度学习中的一个特殊的领域,深度学习模型通过层(layer)构成,

神经网络本质上也是构建这样的映射,我们通过一个图来了解深度学习的工作原理。

深度学习在图片识别,语音识别,自然语言处理等领域有非常成功的应用,但是深度学习不是万能的,在很多场景深度学习也不是必要的,不要为了用某个技术而用某个技术。

安装keras

install.packages("keras")
library(keras)
install_keras()

2 神经网络

深度学习是层数比较多的神经网络(简单这么理解),我们首先来做一个神经网络的例子,在这个例子我们来实现手写数字识别。

library(keras)
mnist <- dataset_mnist() 
## Loaded Tensorflow version 2.6.0
train_images  <-   mnist$train$x 
train_labels <-  mnist$train$y 
test_images <-  mnist$test$x 
test_labels <- mnist$test$y

首先大家需要安装好keras包,代码如下

install.packages("kreas")

手写数字图片相关的数据在网上很容易找到,keras这个自带了这个数据集。 在这里稍微提一下,图片数据在编程中是怎样体现的,图片转换成为数据的方式其实有很多种。过在这个例子中,图片数据用一张图片也可以表示,因为手写数字图片是黑白的,因此只需要一个矩阵记录不同像素点的亮度即可,我们可以查看一下图片数据。

plot(as.raster(train_images[1,,], max = 255))

train_images[1,,]
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
##  [1,]    0    0    0    0    0    0    0    0    0     0     0     0     0
##  [2,]    0    0    0    0    0    0    0    0    0     0     0     0     0
##  [3,]    0    0    0    0    0    0    0    0    0     0     0     0     0
##  [4,]    0    0    0    0    0    0    0    0    0     0     0     0     0
##  [5,]    0    0    0    0    0    0    0    0    0     0     0     0     0
##  [6,]    0    0    0    0    0    0    0    0    0     0     0     0     3
##  [7,]    0    0    0    0    0    0    0    0   30    36    94   154   170
##  [8,]    0    0    0    0    0    0    0   49  238   253   253   253   253
##  [9,]    0    0    0    0    0    0    0   18  219   253   253   253   253
## [10,]    0    0    0    0    0    0    0    0   80   156   107   253   253
## [11,]    0    0    0    0    0    0    0    0    0    14     1   154   253
## [12,]    0    0    0    0    0    0    0    0    0     0     0   139   253
## [13,]    0    0    0    0    0    0    0    0    0     0     0    11   190
## [14,]    0    0    0    0    0    0    0    0    0     0     0     0    35
## [15,]    0    0    0    0    0    0    0    0    0     0     0     0     0
## [16,]    0    0    0    0    0    0    0    0    0     0     0     0     0
## [17,]    0    0    0    0    0    0    0    0    0     0     0     0     0
## [18,]    0    0    0    0    0    0    0    0    0     0     0     0     0
## [19,]    0    0    0    0    0    0    0    0    0     0     0     0     0
## [20,]    0    0    0    0    0    0    0    0    0     0     0     0    39
## [21,]    0    0    0    0    0    0    0    0    0     0    24   114   221
## [22,]    0    0    0    0    0    0    0    0   23    66   213   253   253
## [23,]    0    0    0    0    0    0   18  171  219   253   253   253   253
## [24,]    0    0    0    0   55  172  226  253  253   253   253   244   133
## [25,]    0    0    0    0  136  253  253  253  212   135   132    16     0
## [26,]    0    0    0    0    0    0    0    0    0     0     0     0     0
## [27,]    0    0    0    0    0    0    0    0    0     0     0     0     0
## [28,]    0    0    0    0    0    0    0    0    0     0     0     0     0
##       [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
##  [1,]     0     0     0     0     0     0     0     0     0     0     0     0
##  [2,]     0     0     0     0     0     0     0     0     0     0     0     0
##  [3,]     0     0     0     0     0     0     0     0     0     0     0     0
##  [4,]     0     0     0     0     0     0     0     0     0     0     0     0
##  [5,]     0     0     0     0     0     0     0     0     0     0     0     0
##  [6,]    18    18    18   126   136   175    26   166   255   247   127     0
##  [7,]   253   253   253   253   253   225   172   253   242   195    64     0
##  [8,]   253   253   253   253   251    93    82    82    56    39     0     0
##  [9,]   253   198   182   247   241     0     0     0     0     0     0     0
## [10,]   205    11     0    43   154     0     0     0     0     0     0     0
## [11,]    90     0     0     0     0     0     0     0     0     0     0     0
## [12,]   190     2     0     0     0     0     0     0     0     0     0     0
## [13,]   253    70     0     0     0     0     0     0     0     0     0     0
## [14,]   241   225   160   108     1     0     0     0     0     0     0     0
## [15,]    81   240   253   253   119    25     0     0     0     0     0     0
## [16,]     0    45   186   253   253   150    27     0     0     0     0     0
## [17,]     0     0    16    93   252   253   187     0     0     0     0     0
## [18,]     0     0     0     0   249   253   249    64     0     0     0     0
## [19,]     0    46   130   183   253   253   207     2     0     0     0     0
## [20,]   148   229   253   253   253   250   182     0     0     0     0     0
## [21,]   253   253   253   253   201    78     0     0     0     0     0     0
## [22,]   253   253   198    81     2     0     0     0     0     0     0     0
## [23,]   195    80     9     0     0     0     0     0     0     0     0     0
## [24,]    11     0     0     0     0     0     0     0     0     0     0     0
## [25,]     0     0     0     0     0     0     0     0     0     0     0     0
## [26,]     0     0     0     0     0     0     0     0     0     0     0     0
## [27,]     0     0     0     0     0     0     0     0     0     0     0     0
## [28,]     0     0     0     0     0     0     0     0     0     0     0     0
##       [,26] [,27] [,28]
##  [1,]     0     0     0
##  [2,]     0     0     0
##  [3,]     0     0     0
##  [4,]     0     0     0
##  [5,]     0     0     0
##  [6,]     0     0     0
##  [7,]     0     0     0
##  [8,]     0     0     0
##  [9,]     0     0     0
## [10,]     0     0     0
## [11,]     0     0     0
## [12,]     0     0     0
## [13,]     0     0     0
## [14,]     0     0     0
## [15,]     0     0     0
## [16,]     0     0     0
## [17,]     0     0     0
## [18,]     0     0     0
## [19,]     0     0     0
## [20,]     0     0     0
## [21,]     0     0     0
## [22,]     0     0     0
## [23,]     0     0     0
## [24,]     0     0     0
## [25,]     0     0     0
## [26,]     0     0     0
## [27,]     0     0     0
## [28,]     0     0     0

这里数据是通过数组array进行存储的,我们查看一下数组的维度。

dim(train_images)
## [1] 60000    28    28

可以看到,这个数据集包含了60000条数据,也就是60000个图片,每个图片由28*28个像素组成。

然后,我们要开始定义我们模型的结构。

network <- keras_model_sequential() %>%
layer_dense(units = 512, activation = "relu", input_shape = c(28 * 28)) %>%layer_dense(units = 10, activation = "softmax")

上面呢的代码中,keras_model_sequential函数表示我们要定一个深度学习模型了,layer_函数用于定义深度学习模型中的层。units用于指定这一层有多少输出,activation用于指定激活函数,在人工神经网络中,节点的激活函数定义了给定输入或一组输入的节点的输出。一个标准的集成电路可以被看作是一个激活函数的数字网络,它可以是“ON”或“OFF”,这取决于输入,input_shape用于指定数据的维度,我们书的图片是28*28,因此这里也指定为28乘以28 。其他层同理。

到这里我们那已经指定好了模型的结构,然后我们要开始编译模型呢,在编译模型的过程中,我们需要指定几个参数: 1. loss function ,损失函数 2. optimiser ,优化器 3. Metrics ,指标

network %>% compile(
optimizer = "rmsprop",
loss = "categorical_crossentropy", metrics = c("accuracy")
)

编译好模型之后,我们可以开始训练模型,但是在训练模型之前,我们对数据进行简单的处理:

train_images <- array_reshape(train_images, c(60000, 28 * 28)) 
dim(train_images)
## [1] 60000   784
train_images <- train_images / 255
test_images <- array_reshape(test_images, c(10000, 28 * 28)) 
test_images <- test_images / 255

这里首先讲数组转换成为矩阵,然后这里还将数据除以了255,这是为了讲数据转换到0-1之间,原始数据的最大值是255。

train_labels <- to_categorical(train_labels)
test_labels <- to_categorical(test_labels)

这里是对目标变量进行了转换,转换前后的结果我们进行一个对比。

mnist$train$y[1]
## [1] 5
train_labels[1,]
##  [1] 0 0 0 0 0 1 0 0 0 0

数据准备好之后就可以开始训练模型了。

network %>% fit(train_images,train_labels,epochs=5,batch_size= 128)

其中,batch_size是一次训练选取的样本个数,epoch是指使用全部样本训练模型的次数。 举个例子说,假设样本量为100,batch_size为10,那么每次训练模型用10个样本。如果epoch为10,那表示要将全部样本训练10次,但是每次训练只用10个样本,因此一共训练了100次,这个100就是iteration。

训练好模型之后,可以使用测试数据测试模型。

metrics <- network %>% evaluate(test_images, test_labels)
metrics
##       loss   accuracy 
## 0.07650146 0.97770000

有了新数据之后,我们就可以使用新数据来进行预测。

network %>% predict(test_images[1:2,])
##              [,1]         [,2]        [,3]         [,4]         [,5]
## [1,] 3.296447e-09 2.959386e-11 1.02828e-06 1.949906e-05 8.510357e-13
## [2,] 2.440722e-10 3.210155e-07 9.99999e-01 6.337621e-07 2.370720e-20
##              [,6]         [,7]         [,8]         [,9]        [,10]
## [1,] 1.103082e-07 1.080658e-14 9.999788e-01 2.124868e-07 2.188494e-07
## [2,] 3.315445e-08 3.698149e-10 1.206297e-16 3.980492e-08 1.272094e-15

通过这个简单的例子之后,我们进行一个简单的总结。

(1)可用的optimiser

Available optimizers
- SGD
- RMSprop
- Adam
- Adadelta
- Adagrad
- Adamax
- Nadam
- Ftrl

(2)可用的损失函数

Probabilistic losses
- BinaryCrossentropy class
- CategoricalCrossentropy class
- SparseCategoricalCrossentropy class
- Poisson class
- binary_crossentropy function
- categorical_crossentropy function
- sparse_categorical_crossentropy function
- poisson function
- KLDivergence class
- kl_divergence function
Regression losses
- MeanSquaredError class
- MeanAbsoluteError class
- MeanAbsolutePercentageError class
- MeanSquaredLogarithmicError class
- CosineSimilarity class
- mean_squared_error function
- mean_absolute_error function
- mean_absolute_percentage_error function
- mean_squared_logarithmic_error function
- cosine_similarity function
- Huber class
- huber function
- LogCosh class
- log_cosh function
Hinge losses for "maximum-margin" classification
- Hinge class
- SquaredHinge class
- CategoricalHinge class
- hinge function
- squared_hinge function
- categorical_hinge function

(3)可用的指标

Accuracy metrics
- Accuracy class
- BinaryAccuracy class
- CategoricalAccuracy class
- SparseCategoricalAccuracy class
- TopKCategoricalAccuracy class
- SparseTopKCategoricalAccuracy class
Probabilistic metrics
- BinaryCrossentropy class
- CategoricalCrossentropy class
- SparseCategoricalCrossentropy class
- KLDivergence class
- Poisson class
Regression metrics
- MeanSquaredError class
- RootMeanSquaredError class
- MeanAbsoluteError class
- MeanAbsolutePercentageError class
- MeanSquaredLogarithmicError class
- CosineSimilarity class
- LogCoshError class
Classification metrics based on True/False positives & negatives
- AUC class
- Precision class
- Recall class
- TruePositives class
- TrueNegatives class
- FalsePositives class
- FalseNegatives class
- PrecisionAtRecall class
- SensitivityAtSpecificity class
- SpecificityAtSensitivity class
Image segmentation metrics
- MeanIoU class
Hinge metrics for "maximum-margin" classification
- Hinge class
- SquaredHinge class
- CategoricalHinge class
  1. 可用的激活函数

relu,sigmoid,softmax,softplus,softsign,tanh,selu,elu,exponential,

在了解了第一个简单的例子之后,我们了解一下深度学习框架中的一些基本概念。

1D tensor,一维数组就是1D tensor,关于tensor 的解释是:Tensors are a generalization of vectors and matrices to an arbitrary number of dimensions 。简单理解就是数组或者矩阵。

x <- rep(1:10)
as.array(x)
##  [1]  1  2  3  4  5  6  7  8  9 10

2D tensor 就是矩阵

x <- matrix(rep(0, 3*5), nrow = 3, ncol = 5)
dim(x)
## [1] 3 5

3D tensor 就是高维向量

x <- array(rep(0, 2*3*2), dim = c(2,3,2))
dim(x)
## [1] 2 3 2

在现实中,大多数表格数据使用2D tensor来表示,也就是(samples, features),大数据机器学习模型处理的也是这一类数据,也称为表格数据。

时间数据或者序列数据通常用3D tensor来表示,(samples, timesteps, features)

图片数据通常用4D tensor来表示,(samples, height, width, channels)or (samples, channels, height, width),

视频数据使用5D tensor 来表示。(samples, frames, height, width, channels)or(samples, frames, channels, height, width)

持续更新…..