如何用R语言进行深度学习?

2017年07月30日 由 xiaoshan.xiang 发表 16348 0
如何用R语言进行机器学习?对于R语言用户来说,深度学习还没有生产级的解决方案(除了MXNET)。这篇文章介绍了R语言的Keras接口,以及如何使用它来执行图像分类。文章结尾会通过提供一些代码片段显示Keras的直观和强大

Tensorflow


去年1月,R语言中的Tensorflow 发布了,它提供了从R语言中获得的Tensorflow API的方法。这是很重要的,因为Tensorflow是最受欢迎的深度学习库。然而,对于大多数R语言用户来说,R语言的Tensorflow接口和R语言并不是很像。下面是训练模型的代码块。
cross_entropy <- tf$reduce_mean(-tf$reduce_sum(y_ * tf$log(y_conv), reduction_indices=1L))
train_step <- tf$train$AdamOptimizer(1e-4)$minimize(cross_entropy)
correct_prediction <- tf$equal(tf$argmax(y_conv, 1L), tf$argmax(y_, 1L))
accuracy <- tf$reduce_mean(tf$cast(correct_prediction, tf$float32))
sess$run(tf$global_variables_initializer())

for (i in 1:20000) {
batch <- mnist$train$next_batch(50L)
if (i %% 100 == 0) {
train_accuracy <- accuracy$eval(feed_dict = dict(
x = batch[[1]], y_ = batch[[2]], keep_prob = 1.0))
cat(sprintf("step %d, training accuracy %g\n", i, train_accuracy))
}
train_step$run(feed_dict = dict(
x = batch[[1]], y_ = batch[[2]], keep_prob = 0.5))
}

test_accuracy <- accuracy$eval(feed_dict = dict(
x = mnist$test$images, y_ = mnist$test$labels, keep_prob = 1.0))
cat(sprintf("test accuracy %g", test_accuracy))

除非你熟悉Tensorflow,,否则你可能不清楚发生了什么。Github的快速搜索发现使用tensorflow为R语言提供的代码不到100个。

Keras


所有这一切都将随着Keras和R语言而改变。

Keras是用于实验的高级神经网络API,可以在Tensorflow上运行。Keras越来越受欢迎,并在越来越多的平台上得到支持,包括Tensorflow,CNTK,Apple的CoreML,Theano。在深度学习中越来越重要。

举一个简单的例子,在Keras中训练模型的代码如下:
model_top %>% fit(
x = train_x, y = train_y,
epochs=epochs,
batch_size=batch_size,
validation_data=valid)

Keras进行图像分类


让我告诉你如何使用R语言、Keras和Tensorflow构建深度学习模型。你会发现一个Github repo在https://github.com/rajshah4/image_keras/,其中包含你需要的代码和数据。通过R notebook(和Python notebooks)构建一个图像分类器,可以很容易地应用到其他图像上。用于构建深度学习工作的高级方法包括:

增加的数据

使用预先训练的网络的瓶颈特征

对预先训练的网络顶层进行微调

保存模型的权重

Keras代码片段


Keras的R语言接口可以很容易地在R语言中构建深度学习模型,这里有基于构建图像分类器一些代码片段,以说明R语言中Keras的直观和有效

加载folder:
train_generator <- flow_images_from_directory(train_directory, generator = image_data_generator(), target_size = c(img_width, img_height), color_mode = "rgb",
class_mode = "binary", batch_size = batch_size, shuffle = TRUE,
seed = 123)

定义一个简单的卷积神经网络:
model <- keras_model_sequential()

model %>%
layer_conv_2d(filter = 32, kernel_size = c(3,3), input_shape = c(img_width, img_height, 3)) %>%
layer_activation("relu") %>%
layer_max_pooling_2d(pool_size = c(2,2)) %>%

layer_conv_2d(filter = 32, kernel_size = c(3,3)) %>%
layer_activation("relu") %>%
layer_max_pooling_2d(pool_size = c(2,2)) %>%

layer_conv_2d(filter = 64, kernel_size = c(3,3)) %>%
layer_activation("relu") %>%
layer_max_pooling_2d(pool_size = c(2,2)) %>%

layer_flatten() %>%
layer_dense(64) %>%
layer_activation("relu") %>%
layer_dropout(0.5) %>%
layer_dense(1) %>%
layer_activation("sigmoid")

增加数据:
augment <- image_data_generator(rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=TRUE)

加载预先训练的网络:
model_vgg <- application_vgg16(include_top = FALSE, weights = "imagenet")

保存模型权重:
save_model_weights_hdf5(model_ft, 'finetuning_30epochs_vggR.h5', overwrite = TRUE)

R语言中的Keras接口使R语言用户更容易构建和细化深度学习模型。不再强迫使用Python构建、精炼和测试深度学习模型。这应该向对使用python有点担心的受众开放。

首先,您可以应用我的repo,启动RStudio(或者您选择的IDE),然后使用Keras构建一个简单的分类器。

 

本文为编译文章,作者Rajiv Shah,原网址为

http://projects.rajivshah.com/blog/2017/06/04/deeplearningR/
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
写评论取消
回复取消