Deep Learning in R.Rmd 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  1. ---
  2. title: "Deep Learning in R"
  3. subtitle: "\u2591<br/>Обзор фреймворков с примерами"
  4. author: "metya"
  5. date: '`r Sys.Date()`'
  6. output:
  7. xaringan::moon_reader:
  8. lib_dir: libs
  9. css: xaringan-themer.css
  10. nature:
  11. highlightStyle: github
  12. highlightLines: true
  13. countIncrementalSlides: false
  14. ---
  15. ```{r setup, include=FALSE}
  16. options(htmltools.dir.version = FALSE)
  17. ```
  18. ```{r xaringan-themer, include=FALSE}
  19. library(xaringanthemer)
  20. mono_accent(
  21. #header_font_google = google_font("Play"),
  22. code_font_family = "Fira Code",
  23. code_font_url = "https://cdn.rawgit.com/tonsky/FiraCode/1.204/distr/fira_code.css",
  24. text_font_google = google_font("Ubuntu")
  25. )
  26. ```
  27. class: center, middle
  28. background-color: #8d6e63
  29. #Disclaimer
  30. Цель доклада не дать понимание, что такое глубокое обучение и детально разобрать как работать с ним и обучать современные модели, а скорее показать, как просто можно начать тем, кто давно хотел и чесались руки, но все было никак не взяться
  31. ---
  32. # Deep Learning
  33. ## Что это?
  34. --
  35. * Когда у нас есть исскуственная нейронная сеть
  36. --
  37. * Когда скрытых слоев в этой сети больше чем два
  38. --
  39. ![](https://cdn-images-1.medium.com/max/1600/1*dnvGC-PORSoCo7VXT3PV_A.png)
  40. .footnotes[[1] https://machinelearningmastery.com/what-is-deep-learning/]
  41. ---
  42. ## Как это математически
  43. ![](Deep_Learning_in_R_files/perceptron.png)
  44. ???
  45. На самом деле это конечно самый простой юнит, самый базовый.
  46. ---
  47. background-image: url(https://3qeqpr26caki16dnhd19sv6by6v-wpengine.netdna-ssl.com/wp-content/uploads/2016/08/Why-Deep-Learning-1024x742.png)
  48. ???
  49. Image credit: [Andrew Ng](http://www.slideshare.net/ExtractConf)
  50. ---
  51. class: inverse, center, middle, title-slide
  52. # Frameworks
  53. ---
  54. ![](https://cdn-images-1.medium.com/max/1600/1*s_BwkYxpGv34vjOHi8tDzg.png)
  55. .footnotes[
  56. [1] https://towardsdatascience.com/deep-learning-framework-power-scores-2018-23607ddf297a
  57. ]
  58. ---
  59. ## Нас интересуют только те, что есть в R через API
  60. --
  61. * ###TensorFlow
  62. --
  63. * ###theano
  64. --
  65. * ###Keras
  66. --
  67. * ###CNTK
  68. --
  69. * ###MXNet
  70. --
  71. * ###ONNX
  72. ---
  73. ## Есть еше несколько пакетов
  74. * darch (removed from cran)
  75. * deepnet
  76. * deepr
  77. * H2O (interface) ([Tutorial](https://htmlpreview.github.io/?https://github.com/ledell/sldm4-h2o/blob/master/sldm4-deeplearning-h2o.html))
  78. ???
  79. Вода это по большей части МЛ фреймворк, с недавних пор, где появился модуль про глубокое обучение. Есть неплохой туториал для р пакета. Умеет в поиск гиперпараметров, кроссвалидацию и прочие нужные для МЛ штуки для сеток, очевидно это работает только для маленьких сетей)
  80. Но они р специфичны, кроме воды, и соотвественно медленные, да и умеют довольно мало. Новые годные архитектуры сетей туда не имплементированы.
  81. ---
  82. ![](https://cdn-images-1.medium.com/max/1600/1*zmMOdVZ_j9vwMcpdD8Uceg.png)
  83. https://www.tensorflow.org/
  84. https://tensorflow.rstudio.com/
  85. - Делает Google
  86. - Самый популярный, имеет тучу туториалов и книг
  87. - Имеет самый большой спрос у продакшн систем
  88. - Имеет API во множество языков
  89. - Имеет статический граф вычислений, что бывает неудобно, зато оптимизированно
  90. - Примерно с лета имеет фичу **eager execution**, которая почти нивелирует это неудобство. Но почти не считается
  91. - Доступен в R как самостоятельно, так и как бэкэнд Keras
  92. ---
  93. ![](https://cdn-images-1.medium.com/max/1600/1*dT-zhP2bmtxSuOja8gNGxA.png)
  94. http://www.deeplearning.net/software/theano/
  95. - Делался силами университета Монреаль с 2007
  96. - Один из самый старых фреймворков, но почти почил в забытьи
  97. - Придумали идею абстракции вычислительных графов (статических) для оптимизации и вычисления нейронных сетей
  98. - В R доступен как бэкенд через Keras
  99. ---
  100. ![](https://cdn-images-1.medium.com/max/1600/1*tzgWkBhJPl5FFFe4uhn1AA.png)
  101. https://cntk.ai/
  102. - Делается силами Майкрософт
  103. - Имеет половинчатые динамические вычислительные графы (на самом деле динамические тензоры скорее)
  104. - Доступен как бэкенд Keras так и как самостоятельный бэкенд с биндингами в R через reticulate package, что значит нужно иметь python версию фреймворка
  105. ---
  106. ![](https://cdn-images-1.medium.com/max/1600/1*k9LIDsTb1K-Uejn7MCO7nA.png)
  107. https://keras.io/
  108. https://keras.rstudio.com/
  109. https://tensorflow.rstudio.com/keras/
  110. - Высокоуровневый фреймворк над другими такими бэкэндами как Theano, CNTK, Tensorflow, и еще некоторые на подходе
  111. - Делается Франсуа Шолле, который написал книгу Deep Learning in R
  112. - Очень простой код
  113. - Один и тот же код работает на разных бэкендах, что теоретически может быть полезно (нет)
  114. - Есть очень много блоков нейросетей из современных State-of-the-Art работ
  115. - Нивелирует боль статических вычислительных графов (не совсем)
  116. - Уже давно дефолтом поставляется вместе с TensorFlow как его часть, но можно использовать и отдельно
  117. ---
  118. ![](https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet_logo_2.png)<img src="https://raw.githubusercontent.com/dmlc/dmlc.github.io/master/img/logo-m/mxnetR.png" style=width:30% />
  119. https://mxnet.apache.org/
  120. https://github.com/apache/incubator-mxnet/tree/master/R-package
  121. - Является проектом Apache
  122. - Сочетает в себе динамические и статические графы
  123. - Тоже имеет зоопарк предобученных моделей
  124. - Как и TensorFlow поддерживается многими языками, что может быть очень полезно
  125. - Довольно разумный и хороший фреймворк, непонятно, почему не пользуется популярностью
  126. ---
  127. ![](https://onnx.ai/onnx-r/articles/imgs/ONNX_logo_main.png)
  128. https://onnx.ai/
  129. https://onnx.ai/onnx-r/
  130. - Предоставляет открытый формат представления вычислительных графов, чтобы можно было обмениваться запускать одни и теже, экспортированные в этот формат, модели с помощью разных фреймворков и своего рантайма
  131. - Можно работать из R
  132. - Изначально делался Microsoft вместе с Facebook
  133. - Поддерживает кучу фреймворков нативно и конвертацию в ML и TF, Keras
  134. ---
  135. class: inverse, middle, center
  136. # Deep Learning with MXNet
  137. ---
  138. ## Установка
  139. В Windows и MacOS в R
  140. ```{r eval=FALSE}
  141. # Windows and MacOs
  142. cran <- getOption("repos")
  143. cran["dmlc"] <- "https://apache-mxnet.s3-accelerate.dualstack.amazonaws.com/R/CRAN/GPU/cu92"
  144. options(repos = cran)
  145. install.packages("mxnet")
  146. ```
  147. Linux bash
  148. ```{bash eval=FALSE}
  149. # On linux
  150. git clone --recursive https://github.com/apache/incubator-mxnet.git mxnet
  151. cd mxnet/docs/install
  152. ./install_mxnet_ubuntu_python.sh
  153. ./install_mxnet_ubuntu_r.sh
  154. cd incubator-mxnet
  155. make rpkg
  156. ```
  157. ---
  158. ## Загрузка и обработка данных
  159. ```{r eval=TRUE, cache=TRUE}
  160. df <- readRDS('data.rds')
  161. set.seed(100) #set seed to reproduce results
  162. ```
  163. ```{r eval=TRUE, cache=TRUE}
  164. #transform and split train on x and y
  165. train_ind <- sample(1:77, 60) # random split data
  166. x_train <- as.matrix(df[train_ind, 2:8]) # train data
  167. y_train <- unlist(df[train_ind, 9]) # train labels
  168. x_val <- as.matrix(df[-train_ind, 2:8]) # test validation data
  169. y_val <- unlist(df[-train_ind, 9]) # validation labels
  170. ```
  171. ---
  172. ## Задания архитектуры сети
  173. ```{r require(mxnet), eval=TRUE, message=FALSE}
  174. require(mxnet)
  175. # define graph
  176. data <- mx.symbol.Variable("data") # define variable node
  177. fc1 <- mx.symbol.FullyConnected(data, num_hidden = 1) # define one layer perceptron
  178. linreg <- mx.symbol.LinearRegressionOutput(fc1) # output node
  179. # define learing parameters
  180. initializer <- mx.init.normal(sd = 0.1)
  181. optimizer <- mx.opt.create("sgd",
  182. learning.rate = 1e-6,
  183. momentum = 0.9)
  184. # define logger for logging train proccess
  185. logger <- mx.metric.logger()
  186. epoch.end.callback <- mx.callback.log.train.metric(
  187. period = 4, # number of batches when metrics call
  188. logger = logger)
  189. # num of epoch
  190. n_epoch <- 20
  191. ```
  192. ---
  193. ## Построим граф модели
  194. ```{r eval=TRUE, fig.height=4, cache=TRUE}
  195. # plot our model
  196. graph.viz(linreg)
  197. ```
  198. ---
  199. ## Обучим
  200. ```{r fig.height=4, message=FALSE, warning=FALSE, split=TRUE, collapse=FALSE}
  201. model <- mx.model.FeedForward.create(
  202. symbol = linreg, # our model
  203. X = x_train, # our data
  204. y = y_train, # our label
  205. ctx = mx.cpu(), # engine
  206. num.round = n_epoch, # number of epoch
  207. initializer = initializer, # inizialize weigths
  208. optimizer = optimizer, # sgd optimizer
  209. eval.data = list(data = x_val, label = y_val), # evaluation on evey epoch
  210. eval.metric = mx.metric.rmse, # metric
  211. array.batch.size = 15,
  212. epoch.end.callback = epoch.end.callback) # logger
  213. ```
  214. ![](Deep_Learning_in_R_files/mxnettrain.png)
  215. ---
  216. ## Построим кривую обучения
  217. ```{r fig.height=4, dev='svg', eval=TRUE}
  218. rmse_log <- data.frame(RMSE = c(logger$train, logger$eval), dataset = c(rep("train", length(logger$train)), rep("val", length(logger$eval))),epoch = 1:n_epoch)
  219. library(ggplot2)
  220. ggplot(rmse_log, aes(epoch, RMSE, group = dataset, colour = dataset)) + geom_point() + geom_line()
  221. ```
  222. ---
  223. class: inverse, center, middle
  224. # Deep Learning with Keras
  225. ---
  226. ## Установка
  227. ```{r eval=FALSE}
  228. install.packages("keras")
  229. keras::install_keras(tensorflow = 'gpu')
  230. ```
  231. ### Загрузка нужных нам пакетов
  232. ```{r eval=TRUE, message=FALSE}
  233. require(keras) # Neural Networks
  234. require(tidyverse) # Data cleaning / Visualization
  235. require(knitr) # Table printing
  236. require(rmarkdown) # Misc. output utilities
  237. require(ggridges) # Visualization
  238. ```
  239. ---
  240. ## Загрузка данных
  241. ```{r eval=TRUE, cache=TRUE}
  242. activityLabels <- read.table("Deep_Learning_in_R_files/HAPT Data Set/activity_labels.txt",
  243. col.names = c("number", "label"))
  244. activityLabels %>% kable(align = c("c", "l"))
  245. ```
  246. ---
  247. ```{r eval=TRUE, cache=TRUE}
  248. labels <- read.table("Deep_Learning_in_R_files/HAPT Data Set/RawData/labels.txt",
  249. col.names = c("experiment", "userId", "activity", "startPos", "endPos"))
  250. dataFiles <- list.files("Deep_Learning_in_R_files/HAPT Data Set/RawData")
  251. labels %>%
  252. head(50) %>%
  253. paged_table()
  254. ```
  255. ---
  256. ## TLDR
  257. #### Потому что очень много препроцессинга и всего такого, мы просто загрузим уже готовый результат
  258. ```{r eval=TRUE, cache=TRUE}
  259. allObservations <- read_rds("allObservations.rds")
  260. allObservations %>% dim()
  261. ```
  262. ---
  263. ## Посмотрим на данные
  264. ```{r eval=TRUE, fig.height=4, warning=FALSE, dev='svg', message=FALSE, cache=TRUE}
  265. allObservations %>%
  266. mutate(recording_length = map_int(data,nrow)) %>%
  267. ggplot(aes(x = recording_length, y = activityName)) +
  268. geom_density_ridges(alpha = 0.8)
  269. ```
  270. ---
  271. ## Отфильтруем
  272. ```{r fig.height=4, eval=TRUE, cache=TRUE}
  273. desiredActivities <- c("STAND_TO_SIT", "SIT_TO_STAND", "SIT_TO_LIE", "LIE_TO_SIT", "STAND_TO_LIE","LIE_TO_STAND")
  274. filteredObservations <- allObservations %>%
  275. filter(activityName %in% desiredActivities) %>%
  276. mutate(observationId = 1:n())
  277. filteredObservations %>% paged_table()
  278. ```
  279. ---
  280. ## Разделим на трейн тест
  281. ```{r eval=TRUE, cache=TRUE}
  282. set.seed(100) # seed for reproducibility
  283. ## get all users
  284. userIds <- allObservations$userId %>% unique()
  285. ## randomly choose 24 (80% of 30 individuals) for training
  286. trainIds <- sample(userIds, size = 24)
  287. ## set the rest of the users to the testing set
  288. testIds <- setdiff(userIds,trainIds)
  289. ## filter data.
  290. trainData <- filteredObservations %>%
  291. filter(userId %in% trainIds)
  292. testData <- filteredObservations %>%
  293. filter(userId %in% testIds)
  294. ```
  295. ---
  296. layout: true
  297. ## Посмотрим на графики активности по классам
  298. ---
  299. ```{r eval=TRUE, cache=TRUE}
  300. unpackedObs <- 1:nrow(trainData) %>%
  301. map_df(function(rowNum){
  302. dataRow <- trainData[rowNum, ]
  303. dataRow$data[[1]] %>%
  304. mutate(
  305. activityName = dataRow$activityName,
  306. observationId = dataRow$observationId,
  307. time = 1:n() )
  308. }) %>%
  309. gather(reading, value, -time, -activityName, -observationId) %>%
  310. separate(reading, into = c("type", "direction"), sep = "_") %>%
  311. mutate(type = ifelse(type == "a", "acceleration", "gyro"))
  312. ```
  313. ---
  314. ```{r eval=TRUE, fig.dim=c(11,4), fig.align='center', dev='svg', message=FALSE, warning=FALSE, cache=TRUE}
  315. unpackedObs %>%
  316. ggplot(aes(x = time, y = value, color = direction)) +
  317. geom_line(alpha = 0.2) +
  318. geom_smooth(se = FALSE, alpha = 0.7, size = 0.5) +
  319. facet_grid(type ~ activityName, scales = "free_y") +
  320. theme_minimal() +
  321. theme( axis.text.x = element_blank() )
  322. ```
  323. ---
  324. layout: true
  325. ## Подготовка данных к обучению
  326. ---
  327. ```{r message=FALSE, warning=FALSE, require(keras), eval=TRUE, cache=TRUE}
  328. padSize <- trainData$data %>%
  329. map_int(nrow) %>%
  330. quantile(p = 0.98) %>%
  331. ceiling()
  332. padSize
  333. convertToTensor <- . %>%
  334. map(as.matrix) %>%
  335. pad_sequences(maxlen = padSize)
  336. trainObs <- trainData$data %>% convertToTensor()
  337. testObs <- testData$data %>% convertToTensor()
  338. dim(trainObs)
  339. ```
  340. ---
  341. ```{r eval=TRUE, cache=TRUE}
  342. # one hot encoding
  343. oneHotClasses <- . %>%
  344. {. - 7} %>% # bring integers down to 0-6 from 7-12
  345. to_categorical() # One-hot encode
  346. trainY <- trainData$activity %>% oneHotClasses()
  347. testY <- testData$activity %>% oneHotClasses()
  348. ```
  349. ---
  350. layout:true
  351. ## Наконец то сетка!
  352. ---
  353. ```{r eval=TRUE, cache=TRUE}
  354. input_shape <- dim(trainObs)[-1]
  355. num_classes <- dim(trainY)[2]
  356. filters <- 24 # number of convolutional filters to learn
  357. kernel_size <- 8 # how many time-steps each conv layer sees.
  358. dense_size <- 48 # size of our penultimate dense layer.
  359. ```
  360. ---
  361. ```{r eval=TRUE, cache=TRUE}
  362. model <- keras_model_sequential() # define type of class model
  363. model %>% layer_conv_1d( # add first convolutions layer
  364. filters = filters, # num of filters
  365. kernel_size = kernel_size, # kernel size
  366. input_shape = input_shape,
  367. padding = "valid", # to fill padding with zero
  368. activation = "relu") %>% # activation fiucntion on the end of layer
  369. layer_batch_normalization() %>% # batch norm
  370. layer_spatial_dropout_1d(0.15) %>% # dropout 15% neurons
  371. layer_conv_1d(filters = filters/2, # second convolution layer with half of num filters
  372. kernel_size = kernel_size,
  373. activation = "relu") %>%
  374. layer_global_average_pooling_1d() %>% # to average all verctor representation in one featuremap
  375. layer_batch_normalization() %>%
  376. layer_dropout(0.2) %>% # dropout 20% neurons
  377. layer_dense(dense_size, # fullyconected layer perceptron
  378. activation = "relu") %>%
  379. layer_batch_normalization() %>%
  380. layer_dropout(0.25) %>%
  381. layer_dense(num_classes, # one more fully connected layer size of num classes
  382. activation = "softmax", # our loss function for multyply classification
  383. name = "dense_output")
  384. ```
  385. ---
  386. ### Выведем описание нашей сетки
  387. ```{r eval=FALSE, cache=TRUE, split=TRUE, collapse=FALSE}
  388. summary(model)
  389. ```
  390. ![](Deep_Learning_in_R_files/keras_summary.png)
  391. ---
  392. layout:true
  393. ## Обучим же наконец
  394. ---
  395. ## Компиляция графа
  396. ```{r eval=TRUE, cache=TRUE}
  397. model %>% compile(
  398. loss = "categorical_crossentropy", # our loss function
  399. optimizer = "rmsprop", # our optimizer alrorithm
  400. metrics = "accuracy" # our metric
  401. )
  402. ```
  403. ---
  404. ## train
  405. ```{r eval=FALSE, cache=TRUE, fig.show='animate', dev='svg'}
  406. trainHistory <- model %>%
  407. fit(
  408. x = trainObs, y = trainY, # data
  409. epochs = 350, # num epoch
  410. validation_data = list(testObs, testY), # validation tests on each epoch
  411. callbacks = list(
  412. callback_model_checkpoint("best_model.h5",
  413. save_best_only = TRUE))) # update train history and save model
  414. ```
  415. ---
  416. ![](Deep_Learning_in_R_files/train.png)
  417. ---
  418. ![](Deep_Learning_in_R_files/train_plot2.png)
  419. ---
  420. layout:true
  421. ## Предсказание
  422. ---
  423. ## Подготовка теста
  424. ```{r eval=TRUE, cache=TRUE}
  425. # one-hot ecnoding labels for predict
  426. oneHotToLabel <- activityLabels %>%
  427. mutate(number = number - 7) %>%
  428. filter(number >= 0) %>%
  429. mutate(class = paste0("V",number + 1)) %>%
  430. select(-number)
  431. ```
  432. ## Выбор лучшей модели
  433. ```{r eval=TRUE, cache=TRUE}
  434. bestModel <- load_model_hdf5("best_model.h5")
  435. ```
  436. ---
  437. ## Еще немного кода
  438. ```{r eval=TRUE, cache=TRUE}
  439. tidyPredictionProbs <- bestModel %>%
  440. predict(testObs) %>%
  441. as_data_frame() %>%
  442. mutate(obs = 1:n()) %>%
  443. gather(class, prob, -obs) %>%
  444. right_join(oneHotToLabel, by = "class")
  445. predictionPerformance <- tidyPredictionProbs %>%
  446. group_by(obs) %>%
  447. summarise(
  448. highestProb = max(prob),
  449. predicted = label[prob == highestProb]
  450. ) %>%
  451. mutate(
  452. truth = testData$activityName,
  453. correct = truth == predicted
  454. )
  455. ```
  456. ---
  457. ```{r eval=TRUE, cache=TRUE}
  458. predictionPerformance %>% paged_table()
  459. ```
  460. ---
  461. layout:true
  462. ## Визуализация ошибок
  463. ---
  464. ```{r fig.height=4, eval=TRUE, cache=TRUE}
  465. predictionPerformance %>%
  466. mutate(result = ifelse(correct, 'Correct', 'Incorrect')) %>%
  467. ggplot(aes(highestProb)) +
  468. geom_histogram(binwidth = 0.01) +
  469. geom_rug(alpha = 0.5) +
  470. facet_grid(result~.) +
  471. ggtitle("Probabilities associated with prediction by correctness")
  472. ```
  473. ---
  474. ```{r fig.height=4, eval=TRUE, cache=TRUE}
  475. predictionPerformance %>%
  476. group_by(truth, predicted) %>%
  477. summarise(count = n()) %>%
  478. mutate(good = truth == predicted) %>%
  479. ggplot(aes(x = truth, y = predicted)) +
  480. geom_point(aes(size = count, color = good)) +
  481. geom_text(aes(label = count),
  482. hjust = 0, vjust = 0,
  483. nudge_x = 0.1, nudge_y = 0.1) +
  484. guides(color = FALSE, size = FALSE) +
  485. theme_minimal()
  486. ```
  487. ---
  488. layout:false
  489. class: inverse, middle, center
  490. # Заключение
  491. ---
  492. background-image: url(https://images.manning.com/720/960/resize/book/a/4e5e97f-4e8d-4d97-a715-f6c2b0eb95f5/Allaire-DLwithR-HI.png)
  493. ---
  494. class: center, middle
  495. # Спасибо!
  496. Слайды сделаны с помощью R package [**xaringan**](https://github.com/yihui/xaringan).
  497. Веб версию слайдов можно найти на https://metya.github.io/DeepLearning_in_R/
  498. Код можно посмотреть здесь https://github.com/metya/DeepLearning_in_R/