本课程主要介绍基于R的语言的深度学习,主要会介绍的是keras 这个包,或者说这个框架。本课程不会过多的介绍深度学习的理论只是,而是侧重于基于R语言的深度学习的实现以及应用。
最近,人工智能,机器学习,数据挖掘,深度学习这些概念都非常的火,人人都听说过这些词语,人人也都想把这些东西应用起来,但是鲜少有人能够很好的理解这些东西到底是什么,能够干什么原理是什么。
人工智能,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()
深度学习是层数比较多的神经网络(简单这么理解),我们首先来做一个神经网络的例子,在这个例子我们来实现手写数字识别。
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
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)
持续更新…..