开篇
- Tensorflow in R 系列,将分享如何使用R语言在Tensorflow/Keras 框架中训练深度学习模型。
- MNIST 全称为 Modified National Institute of Standards and Technology。这个名词一点也不重要。
安装 R 和 R studio
此次省略300字。建议使用云计算平台。如Kaggle Kernel/Google Codelab/Google Cloud 等
可参考【在 Google Cloud 安装 R studio server】: https://tduan.netlify.com/post/google-cloud-r-studio-server/
安装 keras package
install.packages('devtools') devtools::install_github("rstudio/keras") library(keras) install_keras()
查看 tensorflow 版本。使用的是 tensorflow 1.10.0 (有点落后,主要是懒得更新)。python 版本3.6
library(keras) library(reticulate) tensorflow::tf_config()
## TensorFlow v1.10.0 (C:\Users\User\AppData\Local\conda\conda\envs\R-TENS~1\lib\site-packages\keras\__init__.p) ## Python v3.6 (C:\Users\User\AppData\Local\conda\conda\envs\r-tensorflow\python.exe)
查看 keras 版本。
keras:::keras_version()
## [1] '2.2.4'
1.导入数据
导入4个数据集,分别为:
- x_train: 6万张训练数字图片
- y_train: 6万个训练数字0-9标签
- x_test: 1万测试数字图片
- y_test: 1万个测试数字0-9标签
为什么有4个数据集 ?
- 带x的通常为特征(feature)。带y的为标签(label)。
- 训练数据是用来训练模型。测试数据不参加建模,而是模型建立后是用来测试模型的效果。
library(keras) mnist <- dataset_mnist() x_train <- mnist$train$x y_train <- mnist$train$y x_test <- mnist$test$x y_test <- mnist$test$y
这些图片长这个样
par(mfcol=c(4,4)) par(mar=c(0, 0, 1.5, 0), xaxs='i', yaxs='i') for (i in 1:16) { img <- x_train[i, , ] img <- t(apply(img, 2, rev)) image(1:28, 1:28, img, col = gray((0:255)/255), xaxt = 'n', yaxt = 'n', main = y_train[i]) }
2.数据探索
图片原理:
28 × 28=784 的像素(pixel)组成一张图片。而每个彩色的像素是由RBG 3个由0-255 的数字组成。由于这里的像素是黑白的像素,所以一个像素只有1个数字。0-255,数字越大颜色越浅。比如0为黑色,255为白色
img <- x_train[1, , ] img <- t(apply(img, 2, rev)) image(1:28, 1:28, img, col = gray((0:255)/255), xaxt = 'n', yaxt = 'n')
第一张图片 数字5 :0为黑色,255为白色
x_train: 训练数字图片 为6万张28 × 28 的0-9 数字图片
dim(x_train)
## [1] 60000 28 28
y_train: 训练数字标签 为6万张数字图片对应的0-9标签
dim(y_train)
## [1] 60000
x_test: 测试数字图片 为1万张28 × 28 的0-9 数字图片
dim(x_test)
## [1] 10000 28 28
y_test: 测试数字标签 为1万张数字图片对应的0-9标签
dim(y_test)
## [1] 10000
3.数据处理
将每个2维的28 × 28 的图片变成1维数据 1× 784 的数据
# reshape x_train <- array_reshape(x_train, c(nrow(x_train), 784)) x_test <- array_reshape(x_test, c(nrow(x_test), 784))
转换后数据为6万行 784 个 0-255的数字
dim(x_train)
## [1] 60000 784
将每个由0到255的像素(pixel)转为0到1:原来是0的,现在 0/255=0 。原来是255的,现在255/255=1。原来为200,现在200/255=0.78
转换后数据为6万行 784 个 0-255的数字
# rescale x_train <- x_train / 255 x_test <- x_test / 255
y_train 如之前所说是 6万个训练数字0-9标签
dim(y_train)
## [1] 60000
这里对标签作 0-1 embedding 处理。
处理后 y_train 变成了 6万行 ,每行10 个 0或1 的数据。 处理后 y_test 变成了 1万行 ,每行10 个 0或1 的数据。
y_train <- to_categorical(y_train, 10) y_test <- to_categorical(y_test, 10)
比如第1个数字是5。所以第1行 第6列为1,其他列为0。
比如第2个数字是0。所以第1行 第1列为1,其他列为0
head(y_train)
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] ## [1,] 0 0 0 0 0 1 0 0 0 0 ## [2,] 1 0 0 0 0 0 0 0 0 0 ## [3,] 0 0 0 0 1 0 0 0 0 0 ## [4,] 0 1 0 0 0 0 0 0 0 0 ## [5,] 0 0 0 0 0 0 0 0 0 1 ## [6,] 0 0 1 0 0 0 0 0 0 0
数据处理前
-
x_train: 6万张训练数字图片 60000 * 28 * 28 形状的 0-255的数字
-
y_train: 6万个训练数字0-9标签 60000 形状的 0-9的数字
-
x_test: 1万测试数字图片 10000 * 28 * 28 形状的 0-255的数字
-
y_test: 1万个测试数字0-9标签 10000 形状的 0-9的数字
数据处理后
-
x_train: 6万张训练数字图片 60000 * 784 形状的 0到1的数字
-
y_train: 6万个训练数字0-9标签 60000 * 10 形状的 0或1的数字
-
x_test: 1万测试数字图片 10000 * 784 形状的 0到1的数字
-
y_test: 1万个测试数字0-9标签 10000 * 10 形状的 0或1的数字
4.设计模型
建立深度神经网络模型(deep neural network)
网络结构介绍。为容易理解, tensor 约等于 neural 约等于 数字。
输入层:每个图片的形状为784型状的数字的输入层
第一层:使用 ‘relu’ 的256个tensor 的隐藏层 (relu 是什么?后续文章再聊)
第二层:使用 ‘relu’ 的128个tensor 的隐藏层
输出层:使用 ‘softmax’ 的 10个 加总为1 的 0到1的概率 的 输出层 (softmax 是什么?后续文章再聊)
model <- keras_model_sequential() model %>% layer_dense(units = 256, activation = 'relu', input_shape = c(784)) %>% layer_dense(units = 128, activation = 'relu') %>% layer_dense(units = 10, activation = 'softmax')
模型的架构 : Learnable Parameters: input*output+bias
第一层:使用 ‘relu’ 的256个tensor 的隐藏层: Learnable Parameters:200960=784*256 + 256
第二层:使用 ‘relu’ 的128个tensor 的隐藏层: Learnable Parameters:32896=256*128+128
输出层:使用 ‘softmax’ 的 10个 0到1的概率 的 输出层: Learnable Parameters :1290=128*10+10
总Learnable Parameters :235146=200960+32896+1290
summary(model)
## ___________________________________________________________________________ ## Layer (type) Output Shape Param # ## =========================================================================== ## dense_1 (Dense) (None, 256) 200960 ## ___________________________________________________________________________ ## dense_2 (Dense) (None, 128) 32896 ## ___________________________________________________________________________ ## dense_3 (Dense) (None, 10) 1290 ## =========================================================================== ## Total params: 235,146 ## Trainable params: 235,146 ## Non-trainable params: 0 ## ___________________________________________________________________________
5.compile 模型
loss funcion 为 categorical_crossentropy。(loss function 是什么?后续文章再聊)
optimizer 为 optimizer_rmsprop。(optimizer 是什么?后续文章再聊)
metrics 为 accuracy。metrics是评估模型的指标。大多数情况都选accuracy。 accuracy=正确预测的个数/总预测个数
model %>% compile( loss = 'categorical_crossentropy', optimizer = optimizer_rmsprop(), metrics = c('accuracy') )
6.训练模型
一堆数据处理转换。模型设计后 。终于可以开始训练模型了。
x_train 为训练数据集特征(6万张照片)。y_train 为训练数据集标签(6万个数字)
每次读入128张图片。重复训练10次。6万张照片80%用来训练。20%用来验证
history <- model %>% fit( x_train, y_train, epochs = 10, batch_size = 128, validation_split = 0.2 )
7.模型总结
可见 经过 10次训练后。最终在验证集的accuracy表现为97%。从图中可见其实经过6次的训练。在验证集的表现以达到97%
plot(history)
总结
后续分享
Tensorflow in R 系列(2) :时装分类 Fashion-MNIST image classification
Tensorflow in R 系列(3) :猫狗分类 Cats dog image classification with drop out
Tensorflow in R 系列(4) :猫狗分类 Cats dog image classification with TensorBoard
Tensorflow in R 系列(5) :猫狗分类 Cats dog image classification with hyperparameter tuning
Tensorflow in R 系列(6) :猫狗分类 Cats dog image classification with Google Cloud Machine Learning Engine
Tensorflow in R 系列(7) :猫狗分类 Cats dog image classification with Tansfer learning
Tensorflow in R 系列(8) :猫狗分类 Cats dog image classification with Google vision API
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 如何用二元分类器解决一个多分类任务?
- Tips | 如何用二元分类器解决一个多分类任务?
- sklearn kMeans 分类实战,对沪深300的每日涨跌进行分类
- 多分类实现方式介绍和在 Spark 上实现多分类逻辑回归
- 上海居民快被垃圾分类逼疯!这个深度学习技术帮你做到垃圾自动分类
- 11 - 分类与归档
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
一个APP的诞生
Carol 炒炒、刘焯琛 / 电子工业出版社 / 2016-7-1 / 79
在移动互联网高度发达的今天,一个个APP,成为我们通向网络世界的窗口。它的诞生流程,令不少对互联网世界产生幻想甚至试图投身其中的年轻人充满了好奇。 《一个APP 的诞生》就是这样一步一步拆分一个APP 的诞生过程。从前期市场调研,竞品分析开始,一直到设计规范,界面图标,设计基础,流程管理,开发实现,市场推广,服务设计,甚至跨界融合,都有陈述。 《一个APP 的诞生》被定义是一本教科书,......一起来看看 《一个APP的诞生》 这本书的介绍吧!