在深度学习领域,Python因其丰富的库和框架而长期占据主导地位。然而,随着Keras在R语言中的引入,这一局面开始发生变化。本文将探讨如何在R中安装和使用Keras,并构建第一个神经网络模型,以MNIST数据集为例,展示手写数字的识别过程。
在RStudio中安装Keras非常简单,只需遵循以下步骤即可开始在R中构建神经网络模型。
install.packages("devtools")
devtools::install_github("rstudio/keras")
上述步骤将从GitHub仓库加载keras库。接下来,将加载keras到R中并安装TensorFlow。
library(keras)
install_tensorflow()
默认情况下,RStudio加载TensorFlow的CPU版本。使用以下命令下载TensorFlow的CPU版本。
install_tensorflow()
对于需要GPU支持的单用户/桌面系统,使用以下命令安装TensorFlow版本。
install_tensorflow(gpu=TRUE)
对于多用户安装,请参考。
以下是使用Keras在R中可以构建的模型类型列表。
将从构建一个简单的MLP模型开始,该模型仅使用一个隐藏层来尝试分类手写数字。
# 加载keras库
library(keras)
data <- dataset_mnist()
train_x <- data$train$x
train_y <- data$train$y
test_x <- data$test$x
test_y <- data$test$y
rm(data)
train_x <- array(train_x, dim = c(dim(train_x)[1], prod(dim(train_x)[-1]))) / 255
test_x <- array(test_x, dim = c(dim(test_x)[1], prod(dim(test_x)[-1]))) / 255
train_y <- to_categorical(train_y, 10)
test_y <- to_categorical(test_y, 10)
# 定义keras顺序模型
model <- keras_model_sequential()
model %>%
layer_dense(units = 784, input_shape = 784) %>%
layer_dropout(rate=0.4) %>%
layer_activation(activation = 'relu') %>%
layer_dense(units = 10) %>%
layer_activation(activation = 'softmax')
# 编译定义的模型,使用准确度作为度量标准,优化器为adam。
model %>% compile(
loss = 'categorical_crossentropy',
optimizer = 'adam',
metrics = c('accuracy')
)
# 在训练数据集上拟合模型
model %>% fit(train_x, train_y, epochs = 100, batch_size = 128)
# 在交叉验证数据集上评估模型
loss_and_metrics <- model %>% evaluate(test_x, test_y, batch_size = 128)
上述代码在训练集上的准确度为99.14%,在验证集上的准确度为96.89%。代码在i5处理器上运行,每个epoch大约需要13.5秒,而在TITANx GPU上,验证准确度为98.44%,平均每个epoch需要2秒。
import keras
from keras.models import Sequential
import numpy as np
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = np.reshape(x_train, (x_train.shape[0], -1)) / 255
x_test = np.reshape(x_test, (x_test.shape[0], -1)) / 255
import pandas as pd
y_train = pd.get_dummies(y_train)
y_test = pd.get_dummies(y_test)
y_train = np.array(y_train)
y_test = np.array(y_test)
model = Sequential()
from keras.layers import Dense
model.add(Dense(784, input_dim=784, activation='relu'))
model.add(keras.layers.core.Dropout(rate=0.4))
model.add(Dense(10, input_dim=784, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer="adam", metrics=['accuracy'])
model.fit(x_train, y_train, epochs=50, batch_size=128, validation_data=(x_test, y_test))