学习笔记TF054,奥德赛语言中不可能开展深度学习

2019-09-19 22:51 来源:未知

众所周知,R语言是统计分析最好用的语言。但在Keras和TensorFlow的帮助下,R语言也可以进行深度学习了。

元框架(metaframework)。

在机器学习的语言的选择上,R和Python之间选择一直是一个有争议的话题。但随着深度学习的爆炸性增长,越来越多的人选择了Python,因为它有一个很大的深度学习库和框架,而R却没有。

TFLearn。模块化深度学习框架,更高级API,快速实验,完全透明兼容。

但是我就是想使用R语言进入深度学习空间,所以我就从Python领域转入到了R领域,继续我的深度学习的研究了。这可能看起来几乎不可能的。但是今天这变成了可能。

TFLearn实现AlexNet。

牛津大学鲜花数据集(Flower Dataset)。 。提供17个类别鲜花数据,每个类别80张图片,有大量姿态、光变化。

随着Keras在R上的推出,R与Python的斗争回到了中心。Python慢​​慢成为了最流行的深度学习模型。但是,随着Keras库在R后端的发布,并且在后台还可以使用张力流(TensorFlow)(CPU和GPU兼容性),所以在深度学习领域,R将再次与Python打成平手。

# -*- coding: utf-8 -*-
""" AlexNet.
Applying 'Alexnet' to Oxford's 17 Category Flower Dataset classification task.
References:

下面我们将看到如何使用Tensorflow在R中安装Keras,并在RStudio的经典MNIST数据集上构建我们的第一个神经网络模型。

  • Alex Krizhevsky, Ilya Sutskever & Geoffrey E. Hinton. ImageNet
    Classification with Deep Convolutional Neural Networks. NIPS, 2012.
  • 17 Category Flower Dataset. Maria-Elena Nilsback and Andrew Zisserman.
    Links:
  • [AlexNet Paper]()
  • [Flower Dataset (17)]()
    """
    from __future__ import division, print_function, absolute_import
    import tflearn
    from tflearn.layers.core import input_data, dropout, fully_connected
    from tflearn.layers.conv import conv_2d, max_pool_2d
    from tflearn.layers.normalization import local_response_normalization
    from tflearn.layers.estimator import regression
    import tflearn.datasets.oxflower17 as oxflower17
    # 加载数据
    X, Y = oxflower17.load_data(one_hot=True, resize_pics=(227, 227))
    # Building 'AlexNet' 构建网络模型
    network = input_data(shape=[None, 227, 227, 3])
    network = conv_2d(network, 96, 11, strides=4, activation='relu')
    network = max_pool_2d(network, 3, strides=2)
    network = local_response_normalization(network)
    network = conv_2d(network, 256, 5, activation='relu')
    network = max_pool_2d(network, 3, strides=2)
    network = local_response_normalization(network)
    network = conv_2d(network, 384, 3, activation='relu')
    network = conv_2d(network, 384, 3, activation='relu')
    network = conv_2d(network, 256, 3, activation='relu')
    network = max_pool_2d(network, 3, strides=2)
    network = local_response_normalization(network)
    network = fully_connected(network, 4096, activation='tanh')
    network = dropout(network, 0.5)
    network = fully_connected(network, 4096, activation='tanh')
    network = dropout(network, 0.5)
    network = fully_connected(network, 17, activation='softmax')
    network = regression(network, optimizer='momentum',
    loss='categorical_crossentropy',
    learning_rate=0.001)
    # Training 训练模型 载入AlexNet模型检查点文件
    model = tflearn.DNN(network, checkpoint_path='model_alexnet',
    max_checkpoints=1, tensorboard_verbose=2)
    model.fit(X, Y, n_epoch=1000, validation_set=0.1, shuffle=True,
    show_metric=True, batch_size=64, snapshot_step=200,
    snapshot_epoch=False, run_id='alexnet_oxflowers17')

目录:

Keras。高级Python神经网络框架。

1.在后端安装带有张量的Keras。

Keras模型。Keras核心数据结构是模型。模型组织网络层。Sequential模型,网络层顺序构成栈,单输入单输出,层间只有相邻关系,简单模型。Model模型建立复杂模型。
Sequential模型。加载完数据,X_train,Y_train,X_test,Y_test。构建模型:
from keras.models import Sequential
from keras.layers.core import Dense, Dropout,Activation

2.使用Keras可以在R中构建不同类型的模型。

model = Sequential()
model.add(Dense(output_dim=64, input_dim=100))
model.add(Activation('relu'))
model.add(Dense(output_dim=10))
model.add(Activation('softmax'))

3.在R中使用MLP对MNIST手写数字进行分类。

model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics='accuracy')
model.fit(X_train, Y_train, batch_size=32, nb_epoch=5)
loss_and_metrics = model.evaluate(X_test, Y_test, batch_size=32)

4.将MNIST结果与Python中的等效代码进行比较。

Keras源码示例 :CIFAR10-图片分类(CNN、实时数据)、IMDB-电影评论观点分类(LSTM)、Reuters-新闻主题分类(多层感知器)、MNIST-手写数字识别(多层感知器、CNN)、OCR-识别字符级文本生成(LSTM)。
安装。pip install keras 。选择依赖后端,~/.keras/keras.json 修改最后一行"backend":"fensorflow" 。

5.结束笔记。

Keras实现卷积神经网络。

1.在后端安装带有TensorFlow的Keras。

#!/usr/bin/python
# -*- coding:utf8 -*-
'''Trains a simple convnet on the MNIST dataset.
Gets to 99.25% test accuracy after 12 epochs
(there is still a lot of margin for parameter tuning).
16 seconds per epoch on a GRID K520 GPU.
'''
from __future__ import print_function
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
batch_size = 128
num_classes = 10 # 分类数
epochs = 12 # 训练轮数
# input image dimensions 输入图片维度
img_rows, img_cols = 28, 28
# the data, shuffled and split between train and test sets
# 加载数据
(x_train, y_train), (x_test, y_test) = mnist.load_data()
if K.image_data_format() == 'channels_first':
#使用Theano顺序:(conv_dim1,channels,conv_dim2,conv_dim3)
x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
input_shape = (1, img_rows, img_cols)
else:
#使用TensorFlow顺序:(conv_dim1conv_dim2,conv_dim3,channels,)
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
# convert class vectors to binary class matrices 将类向量转换为二进制类矩阵
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
#模型构建:2个卷积层、1个池化层、2个全连接层
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
# 模型编译
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(),
metrics=['accuracy'])
# 模型训练
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))
# 模型评估
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

在RStudio中安装Keras的步骤非常简单。只需按照以下步骤,您将很顺利的在R中创建您的第一个神经网络模型。

模型加载保存。 。
Keras的save_model、load_model方法将模型、权重保存到HDF5文件。包括模型结构、权重、训练配置(损失函数、优化器)。方便中断后再继续训练。
from keras.models import save_model, load_model

install.packages("devtools")

def test_sequential_model_saving():
model = Sequential()
model.add(Dense(2, input_shape=(3,)))
model.add(RepeatVector(3))
model.add(TimeDistributed(Dense(3)))
model.compile(loss=losses.MSE,
optimizer=optimizers.RMSprop(lr=0.0001),
metrics=[metrics.categorical_accuracy],
sample_weight_mode='temporal')
x = np.random.random((1, 3))
y = np.random.random((1, 3, 3))
model.train_on_batch(x, y)
out = model.predict(x)
_, fname = tempfile.mkstemp('.h5') # 创建HDFS 5文件
save_model(model, fname)
new_model = load_model(fname)
os.remove(fname)
out2 = new_model.predict(x)
assert_allclose(out, out2, atol=1e-05)
# test that new updates are the same with both models
# 检测新保存的模型和之前定义的模型是否一致
x = np.random.random((1, 3))
y = np.random.random((1, 3, 3))
model.train_on_batch(x, y)
new_model.train_on_batch(x, y)
out = model.predict(x)
out2 = new_model.predict(x)
assert_allclose(out, out2, atol=1e-05)
只保存模型结构。

devtools::install_github("rstudio/keras")

json_string = model.to_jsion()
yaml_string = model.to_yaml()

上述步骤将从GitHub仓库加载keras库。现在是将keras加载到R并安装TensorFlow的时候了。

手动编辑。

library

from keras.models import model_from_json
model = model_from_json(json_string)
model = model_from_yaml(yaml_string)

默认情况下,RStudio加载TensorFlow的CPU版本。使用以下命令下载TensorFlow的CPU版本。

只保存模型权重。

install_tensorflow()

model.save_weights('my_model_weights.h5')
model.load_weights('my_model_weights.h5')

要为单个用户/桌面系统安装具有GPU支持的TensorFlow版本,请使用以下命令。

参考资料:
《TensorFlow技术解析与实战》

install_tensorflow

欢迎推荐上海机器学习工作机会,我的微信:qingxingfengzi

有关更多的用户安装,请参阅本安装指南。

现在我们在RStudio中安装了keras和TensorFlow,让我们在R中启动和构建我们的第一个神经网络来解决MNIST数据集

2.使用keras可以在R中构建的不同类型的模型

以下是使用Keras可以在R中构建的模型列表。

1.多层感知器

2.卷积神经网络

3.循环神经网络

4.Skip-Gram模型

5.使用预先训练的模型,如VGG16,RESNET等

6.微调预先训练的模型。

让我们开始构建一个非常简单的MLP模型,只需一个隐藏的层来尝试分类手写数字。

3.使用R中的MLP对MNIST手写数字进行分类

#loading keras library

library

#loading the keras inbuilt mnist dataset

data<-dataset_mnist()

#separating train and test file

train_x<-data$train$x

train_y<-data$train$y

test_x<-data$test$x

test_y<-data$test$y

rm

# converting a 2D array into a 1D array for feeding into the MLP and normalising the matrix

train_x <- array(train_x, dim = c(dim[1], prod(dim[-1]))) / 255

test_x <- array(test_x, dim = c(dim[1], prod(dim[-1]))) / 255

#converting the target variable to once hot encoded vectors using keras inbuilt function

train_y<-to_categorical(train_y,10)

test_y<-to_categorical(test_y,10)

#defining a keras sequential model

model <- keras_model_sequential()

#defining the model with 1 input layer[784 neurons], 1 hidden layer[784 neurons] with dropout rate 0.4 and 1 output layer[10 neurons]

#i.e number of digits from 0 to 9

model %>%

layer_dense(units = 784, input_shape = 784) %>%

layer_dropout%>%

layer_activation(activation = 'relu') %>%

layer_dense(units = 10) %>%

layer_activation(activation = 'softmax')

#compiling the defined model with metric = accuracy and optimiser as adam.

model %>% compile(

loss = 'categorical_crossentropy',

optimizer = 'adam',

metrics = c('accuracy')

)

#fitting the model on the training dataset

model %>% fit(train_x, train_y, epochs = 100, batch_size = 128)

#Evaluating model on the cross validation dataset

loss_and_metrics <- model %>% evaluate(test_x, test_y, batch_size = 128)

上述代码的训练精度为99.14,验证准确率为96.89。代码在i5处理器上运行,运行时间为13.5秒,而在TITANx GPU上,验证精度为98.44,平均运行时间为2秒。

4.MLP使用keras–R VS Python

为了比较起见,我也在Python中实现了上述的MNIST问题。我觉得在keras-R和Python中应该没有任何区别,因为R中的keras创建了一个conda实例并在其中运行keras。你可以尝试运行一下下面等效的python代码。

#importing the required libraries for the MLP model

import keras

from keras.models import Sequential

import numpy as np

#loading the MNIST dataset from keras

from keras.datasets import mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()

#reshaping the x_train, y_train, x_test and y_test to conform to MLP input and output dimensions

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_test=pd.get_dummies

#performing one-hot encoding on target variables for train and test

y_train=np.array

y_test=np.array

#defining model with one input layer[784 neurons], 1 hidden layer[784 neurons] with dropout rate 0.4 and 1 output layer [10 #neurons]

model=Sequential()

from keras.layers import Dense

model.add(Dense(784, input_dim=784, activation='relu'))

keras.layers.core.Dropout

model.add(Dense(10,input_dim=784,activation='softmax'))

# compiling model using adam optimiser and accuracy as metric

model.compile(loss='categorical_crossentropy', optimizer="adam", metrics=['accuracy'])

# fitting model and performing validation

model.fit(x_train,y_train,epochs=50,batch_size=128,validation_data=(x_test,y_test))

上述模型在同一GPU上实现了98.42的验证精度。所以,我们最初猜到的结果是正确的。

5.结束笔记

如果这是你在R的第一个深度学习模型,我希望你喜欢它。通过一个非常简单的代码,您可以有98%位准确率对是否为手写数字进行分类。这应该是足够的动力让你开始深度学习。

如果您已经在Python中使用keras深度学习库,那么您将在R中找到keras库的语法和结构与Python中相似的地方。事实上,R中的keras包创建了一个conda环境,并安装了在该环境中运行keras所需的一切。但是,让我更为激动的是,现在看到数据科学家在R中建立现实生活中的深层次的学习模型。据说

竞争应该永远不会停止。我也想听听你对这一新发展观点的看法。你可以在下面留言分享你的看法。

本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。

文章原标题《Getting started with Deep Learning using Keras and TensorFlow in R》,作者:NSS,

译者:袁虎,审阅: 阿福

文章为简译,更为详细的内容,请查看原文

TAG标签:
版权声明:本文由990888藏宝阁发布于编程算法,转载请注明出处:学习笔记TF054,奥德赛语言中不可能开展深度学习