Skip to content

Latest commit

 

History

History
540 lines (382 loc) · 16 KB

File metadata and controls

540 lines (382 loc) · 16 KB

十七、R 中的 TensorFlow 和 Keras

R 是一个开源平台,包括用于统计计算的环境和语言。它还有一个桌面和基于 Web 的 IDE,称为 R Studio。有关 R 的更多信息,请访问此链接。 R 通过提供以下 R 包提供对 TensorFlow 和 Keras 的支持:

  • tensorflow包提供对 TF 核心 API 的支持
  • tfestimators包提供对 TF 估计器 API 的支持
  • keras包提供对 Keras API 的支持
  • tfruns包用于 TensorBoard 风格的模型和训练类可视化

在本章中,我们将学习如何在 R 中使用 TensorFlow,并将涵盖以下主题:

  • 在 R 中安装 TensorFlow 和 Keras 包
  • R 中的 TF 核心 API
  • R 中的 TF 估计器 API
  • R 中的 Keras API
  • R 中的 TensorBoard
  • R 中的tfruns

在 R 中安装 TensorFlow 和 Keras 包

要在 R 中安装支持 TensorFlow 和 Keras 的三个 R 包,请在 R 中执行以下命令。

  1. 首先,安装devtools
install.packages("devtools")
  1. 安装tensorflowtfestimators包:
devtools::install_github("rstudio/tensorflow")
devtools::install_github("rstudio/tfestimators")
  1. 加载tensorflow库并安装所需的功能:
library(tensorflow)
install_tensorflow()   
  1. 默认情况下,安装功能会创建虚拟环境并在虚拟环境中安装tensorflow 包。

有四种可用的安装方法,可以使用method参数指定:

auto 自动选择当前平台的默认值
virtualenv 安装到位于~/.virtualenvs/r-tensorflow的虚拟环境中
conda 安装到名为r-tensorflow的 Anaconda Python 环境中
system 安装到系统 Python 环境中
  1. 默认情况下,安装功能会安装仅限 CPU 的 TensorFlow 版本。要安装 GPU 版本,请使用版本参数:
gpu 安装tensorflow-gpu
nightly 安装每晚 CPU 的版本
nightly-gpu 安装每晚 GPU 构建
n.n.n 安装特定版本,例如 1.3.0
n.n.n-gpu 安装特定版本的 GPU 版本,例如 1.3.0

如果您希望 TensorFlow 库使用特定版本的 Python,请使用以下函数或设置TENSORFLOW_PYTHON环境变量:

  • use_python('/usr/bin/python2')
  • use_virtualenv('~/venv')
  • use_condaenv('conda-env')
  • Sys.setenv(TENSORFLOW_PYTHON='/usr/bin/python2')

We installed TensorFLow in R on Ubuntu 16.04 using the following command:

install_tensorflow(version="gpu")  Note that the installation does not support Python 3 at the time of writing this book.

  1. 安装 Keras 包:
devtools::install_github("rstudio/keras")
  1. 在虚拟环境中安装 Keras:
library(keras)
install_keras()
  1. 要安装 GPU 版本,请使用:
install_keras(tensorflow = "gpu")
  1. 安装tfruns包:
devtools::install_github("rstudio/tfruns")

R 中的 TF 核心 API

我们在第 1 章中了解了 TensorFlow 核心 API。在 R 中,该 API 使用tensorflow R 包实现。

作为一个例子,我们提供了 MLP 模型的演练,用于在此链接中对来自 MNIST 数据集的手写数字进行分类

您可以按照 Jupyter R 笔记本中的代码ch-17a_TFCore_in_R

  1. 首先,加载库:
library(tensorflow)
  1. 定义超参数:
batch_size <- 128
num_classes <- 10
steps <- 1000
  1. 准备数据:
datasets <- tf$contrib$learn$datasets
mnist <- datasets$mnist$read_data_sets("MNIST-data", one_hot = TRUE)

数据从 TensorFlow 数据集库加载,并已标准化为[0, 1]范围。

  1. 定义模型:
# Create the model
x <- tf$placeholder(tf$float32, shape(NULL, 784L))
W <- tf$Variable(tf$zeros(shape(784L, num_classes)))
b <- tf$Variable(tf$zeros(shape(num_classes)))
y <- tf$nn$softmax(tf$matmul(x, W) + b)

# Define loss and optimizer
y_ <- tf$placeholder(tf$float32, shape(NULL, num_classes))
cross_entropy <- tf$reduce_mean(-tf$reduce_sum(y_ * log(y), reduction_indices=1L))
train_step <- tf$train$GradientDescentOptimizer(0.5)$minimize(cross_entropy)
  1. 训练模型:
# Create session and initialize variables
sess <- tf$Session()
sess$run(tf$global_variables_initializer())

# Train
for (i in 1:steps) {
  batches <- mnist$train$next_batch(batch_size)
  batch_xs <- batches[[1]]
  batch_ys <- batches[[2]]
  sess$run(train_step,
           feed_dict = dict(x = batch_xs, y_ = batch_ys))
}
  1. 评估模型:
correct_prediction <- tf$equal(tf$argmax(y, 1L), tf$argmax(y_, 1L))
accuracy <- tf$reduce_mean(tf$cast(correct_prediction, tf$float32))
score <-sess$run(accuracy,
         feed_dict = dict(x = mnist$test$images, 
                          y_ = mnist$test$labels))

cat('Test accuracy:', score, '\n')

输出如下:

Test accuracy: 0.9185

太酷了!

通过此链接查找 R 中 TF 核心的更多示例

有关tensorflow R 包的更多文档可以在此链接中找到

R 中的 TF 估计器 API

我们在第 2 章中了解了 TensorFlow 估计器 API。在 R 中,此 API 使用tfestimator R 包实现。

例如,我们提供了 MLP 模型的演练,用于在此链接中对来自 MNIST 数据集的手写数字进行分类

您可以按照 Jupyter R 笔记本中的代码ch-17b_TFE_Ttimator_in_R

  1. 首先,加载库:
library(tensorflow)
library(tfestimators)
  1. 定义超参数:
batch_size <- 128
n_classes <- 10
n_steps <- 100
  1. 准备数据:
# initialize data directory
data_dir <- "~/datasets/mnist"
dir.create(data_dir, recursive = TRUE, showWarnings = FALSE)

# download the MNIST data sets, and read them into R
sources <- list(
  train = list(
    x = "https://storage.googleapis.com/cvdf-datasets/mnist/train-images-idx3-ubyte.gz",
    y = "https://storage.googleapis.com/cvdf-datasets/mnist/train-labels-idx1-ubyte.gz"
  ),
  test = list(
    x = "https://storage.googleapis.com/cvdf-datasets/mnist/t10k-images-idx3-ubyte.gz",
    y = "https://storage.googleapis.com/cvdf-datasets/mnist/t10k-labels-idx1-ubyte.gz"
  )
)

# read an MNIST file (encoded in IDX format)
read_idx <- function(file) {

  # create binary connection to file
  conn <- gzfile(file, open = "rb")
  on.exit(close(conn), add = TRUE)

  # read the magic number as sequence of 4 bytes
  magic <- readBin(conn, what="raw", n=4, endian="big")
  ndims <- as.integer(magic[[4]])

  # read the dimensions (32-bit integers)
  dims <- readBin(conn,what="integer",n=ndims,endian="big")

  # read the rest in as a raw vector
  data <- readBin(conn,what="raw",n=prod(dims),endian="big")

  # convert to an integer vecto
  converted <- as.integer(data)

  # return plain vector for 1-dim array
  if (length(dims) == 1)
    return(converted)

  # wrap 3D data into matrix
  matrix(converted,nrow=dims[1],ncol=prod(dims[-1]),byrow=TRUE)
}

mnist <- rapply(sources,classes="character",how ="list",function(url) {
  # download + extract the file at the URL
  target <- file.path(data_dir, basename(url))
  if (!file.exists(target))
    download.file(url, target)

  # read the IDX file
  read_idx(target)
})

# convert training data intensities to 0-1 range
mnist$train$x <- mnist$train$x / 255
mnist$test$x <- mnist$test$x / 255

从下载的 gzip 文件中读取数据,然后归一化以落入[0, 1]范围。

  1. 定义模型:
# construct a linear classifier
classifier <- linear_classifier(
  feature_columns = feature_columns(
    column_numeric("x", shape = shape(784L))
  ),
  n_classes = n_classes # 10 digits
)

# construct an input function generator
mnist_input_fn <- function(data, ...) {
  input_fn(
    data,
    response = "y",
    features = "x",
    batch_size = batch_size,
    ...
  )
}
  1. 训练模型:
train(classifier,input_fn=mnist_input_fn(mnist$train),steps=n_steps)
  1. 评估模型:
evaluate(classifier,input_fn=mnist_input_fn(mnist$test),steps=200)

输出如下:

Evaluation completed after 79 steps but 200 steps was specified
average_loss 损失 global_step 准确率
0.35656 45.13418 100 0.9057

太酷!!

通过此链接查找 R 中 TF 估计器的更多示例

有关tensorflow R 包的更多文档可以在此链接中找到

R 中的 Keras API

我们在第 3 章中了解了 Keras API。在 R 中,此 API 使用keras R 包实现。keras R 包实现了 Keras Python 接口的大部分功能,包括顺序 API 和函数式 API。

作为示例,我们提供了 MLP 模型的演练,用于在此链接中对来自 MNIST 数据集的手写数字进行分类

您可以按照 Jupyter R 笔记本中的代码ch-17c_Keras_in_R

  1. 首先,加载库:
library(keras)
  1. 定义超参数:
batch_size <- 128
num_classes <- 10
epochs <- 30
  1. 准备数据:
# The data, shuffled and split between train and test sets
c(c(x_train, y_train), c(x_test, y_test)) %<-% dataset_mnist()

x_train <- array_reshape(x_train, c(nrow(x_train), 784))
x_test <- array_reshape(x_test, c(nrow(x_test), 784))

# Transform RGB values into [0,1] range
x_train <- x_train / 255
x_test <- x_test / 255

cat(nrow(x_train), 'train samples\n')
cat(nrow(x_test), 'test samples\n')

# Convert class vectors to binary class matrices
y_train <- to_categorical(y_train, num_classes)
y_test <- to_categorical(y_test, num_classes)

注释是不言自明的:数据从 Keras 数据集库加载,然后转换为 2D 数组并归一化为[0, 1]范围。

  1. 定义模型:
model <- keras_model_sequential()
model %>%
  layer_dense(units=256,activation='relu',input_shape=c(784)) %>%
  layer_dropout(rate = 0.4) %>%
  layer_dense(units = 128, activation = 'relu') %>%
  layer_dropout(rate = 0.3) %>%
  layer_dense(units = 10, activation = 'softmax')

summary(model)

model %>% compile(
    loss = 'categorical_crossentropy',
    optimizer = optimizer_rmsprop(),
    metrics = c('accuracy')
)
  1. 定义和编译顺序模型。我们得到的模型定义如下:
_____________________________________________________
Layer (type)               Output Shape       Param #     
=====================================================
dense_26 (Dense)           (None, 256)        200960      
_____________________________________________________
dropout_14 (Dropout)       (None, 256)        0           
_____________________________________________________
dense_27 (Dense)           (None, 128)        32896       
_____________________________________________________
dropout_15 (Dropout)       (None, 128)        0           
_____________________________________________________
dense_28 (Dense)           (None, 10)         1290        
=====================================================
Total params: 235,146
Trainable params: 235,146
Non-trainable params: 0
  1. 训练模型:
history <- model %>% fit(
    x_train, y_train,
    batch_size = batch_size,
    epochs = epochs,
    verbose = 1,
    validation_split = 0.2
)

plot(history)

拟合函数的输出存储在历史对象中,其包含来自训练周期的损失和度量值。绘制历史对象中的数据,结果如下:

Training and Validation Accuracy (y-axis) in Epochs (x-axis)

  1. 评估模型:
score <- model %>% evaluate(
    x_test, y_test,
    verbose = 0
)

# Output metrics
cat('Test loss:', score[[1]], '\n')
cat('Test accuracy:', score[[2]], '\n')

输出如下:

Test loss: 0.1128517 
Test accuracy: 0.9816

太酷!!

在此链接中查找更多关于 R 中的 Keras 的示例

有关 Keras R 包的更多文档可在此链接中找到

R 中的 TensorBoard

您可以按照 Jupyter R 笔记本中的代码ch-17d_TensorBoard_in_R

您可以使用tensorboard()函数查看 TensorBoard,如下所示:

tensorboard('logs')

这里,'logs'是应该创建 TensorBoard 日志的文件夹。

数据将显示为执行周期并记录数据。在 R 中,收集 TensorBoard 的数据取决于所使用的包:

  • 如果您使用的是tensorflow包,请将tf$summary$scalar操作附加到图中
  • 如果您使用的是tfestimators包,则 TensorBoard 数据会自动写入创建估计器时指定的model_dir参数
  • 如果您正在使用keras包,则必须在使用fit()函数训练模型时包含callback_tensorboard()函数

我们修改了之前提供的 Keras 示例中的训练,如下所示:

# Training the model --------
tensorboard("logs")

history <- model %>% fit(
    x_train, y_train,
    batch_size = batch_size,
    epochs = epochs,
    verbose = 1,
    validation_split = 0.2,
    callbacks = callback_tensorboard("logs")
)

当我们执行笔记本时,我们获得了训练单元的以下输出:

Started TensorBoard at http://127.0.0.1:4233 

当我们点击链接时,我们会看到在 TensorBoard 中绘制的标量:

TensorBoad Visualization of Plots

单击 Graphs 选项卡,我们在 TensorBoard 中看到计算图:

TensorBoard 计算图的可视化有关 R 中 TensorBoard 的更多文档,请访问此链接

R 中的tfruns

您可以按照 Jupyter R 笔记本中的代码ch-17d_TensorBoard_in_R

tfruns包是 R 中提供的非常有用的工具,有助于跟踪多次运行以训练模型。对于使用keras tfestimators包在 R 中构建的模型,tfruns包自动捕获运行数据。使用tfruns非常简单易行。只需在 R 文件中创建代码,然后使用training_run()函数执行该文件。例如,如果你有一个mnist_model.R 文件 ,那么在交互式 R 控制台中使用training_run()函数执行它,如下所示:

library(tfruns)
training_run('mnist_model.R')

训练完成后,将自动显示显示运行摘要的窗口。我们从tfruns GitHub 仓库获得的mnist_mlp.R窗口中获得以下输出。

tfruns visualization of the model run

在“查看器”窗口中,输出选项卡包含以下图:

tfruns visualization of the accuracy and loss values

tfruns包将一个插件安装到 RStudio,也可以从Addins菜单选项访问。该包还允许您比较多个运行并将运行报告发布到 RPub 或 RStudio Connect。您还可以选择在本地保存报告。

有关 R 中tfruns包的更多文档,请访问以下链接:

https://tensorflow.rstudio.com/tools/tfruns/reference/

https://tensorflow.rstudio.com/tools/tfruns/articles/overview.html.

总结

在本章中,我们学习了如何在 R 中使用 TensorFlow 核心,TensorFlow 估计器和 Keras 包来构建和训练机器学习模型。我们提供了来自 RStudio 的 MNIST 示例的演练,并提供了有关 TensorFlow 和 Keras R 包的进一步文档的链接。我们还学习了如何使用 R 中的可视化工具 TensorBoard。我们还介绍了一个来自 R Studio 的新工具tfruns,它允许您为多次运行创建报告,分析和比较它们,并在本地保存或发布它们。

直接在 R 中工作的能力很有用,因为大量的生产数据科学和机器学习代码是使用 R 编写的,现在您可以将 TensorFlow 集成到相同的代码库中并在 R 环境中运行它。

在下一章中,我们将学习一些用于调试构建和训练 TensorFlow 模型的代码的技术。