R配置Keras

TensorFlow基本上成为了深度学习的标配。但是为了学习主要的内容(忽略底层实现细节)或者快速实现一个神经网络模型,Keras是一个很好的选择。

Keras中文版文档

环境准备

安装步骤

安装RKeras需要用到devtools::install_github()命令,因此需要安装devtools包。

但是笔者用的Windows 10,直接安装包不会报错,但是使用该包下的命令会出一些奇怪的错误,例如在装R-Keras时就报超时。

所以建议在Windows下使用该包时,先去安装Rtools

同时需要安装好Anaconda,不然在后续步骤中会报错。

安装好Rtools之后,打开R命令行,在其中再安装一遍devtools包:

1
install.packages("devtools")

然后安装RKeras接口:

1
devtools::install_github("rstudio/keras")

在命令行或者第一次运行Keras的脚本下输入:

1
2
library(keras)
install_keras()

然后会调用AnacondaR-Keras建立一个环境,成功初始化,在以后的R脚本就不需要再使用install_keras()命令了。

安装GPU支持

事实上这部分操作是属于Anaconda那边的操作,毕竟R-Keras用的还是PythonTensorFlow后端。

中文文档里面就已经很详细地介绍了如何准备GPU环境:

文档写的时候上述Keras尚未支持高版本的CUDAcuDNN,经笔者测试,是可以支持最新版的CUDAcuDNN的。

安装好后,打开Anaconda Navigator管理软件,或者命令行模式:

1
$ activate r-tensorflow

切换到r-tensorflow环境,安装gpuKeras

1
$ conda install keras-gpu

等待安装过程(可能因为墙导致下载出问题,要么上梯子,要么辛苦一点重试几次安装命令吧)后,就可以开始使用了。

测试R-Keras

官网给了MNIST测试集作为Demo,然而AWS被墙了,整个Demo直接卡在下载数据集步骤就挂了。

笔者写了个简单的脚本用于测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
library(keras)
library(ggplot2)

script_dir <- dirname(sys.frame(1)$ofile)
setwd(script_dir)

# 产生sample.size * num_props的矩阵, 默认80%数据作为训练集,20%作为验证集
gensam <- function(sample.size = 10000, num_props = 30, val_portion = 0.2)
{
all.x <- array(dim = c(sample.size, num_props))

all.y <- array(dim = c(sample.size, 1))

for(i in (1 : sample.size))
{
all.x[i, ] <- array(round(runif(num_props, 0, 9)))
if(sum(all.x[i, ]) >= 100)
{
all.y[i, 1] <- 1
}
else
{
all.y[i, 1] <- 0
}
}

split_point <- (1 - val_portion) * sample.size

list(
train = list(
x = all.x[c(1 : split_point), ],
y = all.y[c(1 : split_point)]
),
test = list(
x = all.x[c((split_point + 1) : sample.size), ],
y = all.y[c((split_point + 1) : sample.size)]
)
)
}

# 产生一个数据集
dataset <- gensam()

# 准备训练一个LSTM网络,重塑数据集变成维度为(样本数量,序列长度,序列元素的长度)
x_train <- array_reshape(dataset$train$x, c(nrow(dataset$train$x), 30, 1))
y_train <- dataset$train$y

x_test <- array_reshape(dataset$test$x, c(nrow(dataset$test$x), 30, 1))
y_test <- dataset$test$y

model <- keras_model_sequential()

model %>%
layer_lstm(units = 200, activation = "hard_sigmoid", input_shape = c(30, 1)) %>%
layer_dense(units = 1, activation = "sigmoid")

# 编译模型
model %>% compile(
loss = 'binary_crossentropy',
# 使用ADAM优化
optimizer = optimizer_adam(lr = 0.001, beta_1 = 0.001, beta_2 = 0.999, epsilon = 10e-8),
metrics = c('accuracy')
)

# 训练模型并记录
history <- model %>% fit(
x_train, y_train,
epochs = 10, batch_size = 100
)

eval_report <- model %>% evaluate(
x_test, y_test
)

# 输出训练完的模型在验证集的情况
print(eval_report)

plt.df <- data.frame(
x = c(1:length(history$metrics$loss)),
loss = history$metrics$loss,
acc = history$metrics$acc
)

# 输出LOSS和ACC在迭代中的变化图形
ggplot(plt.df, aes(x = x)) + geom_point(aes(y = loss, color = "Loss")) + geom_point(aes(y = acc, color = "Acc")) + labs(color = "Type")

ggsave("history.png")

如果脚本成功运行的话,会在相同目录下产生一份名为history.png的图片,那么恭喜,安装成功了。