Deep Learning in R.Rmd 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652
  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. - Есть очень много блоков нейросетей из современных SOTA работ
  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=FALSE}
  160. df <- read_csv("data.csv")
  161. set.seed(100)
  162. ```
  163. ```{r}
  164. #transform and split train on x and y
  165. train_ind <- sample(1:77, 60)
  166. x_train <- as.matrix(df[train_ind, 2:8])
  167. y_train <- unlist(df[train_ind, 9])
  168. x_val <- as.matrix(df[-train_ind, 2:8])
  169. y_val <- unlist(df[-train_ind, 9])
  170. ```
  171. ---
  172. ## Задания архитектуры сети
  173. ```{r require(mxnet)}
  174. require(mxnet)
  175. # define graph
  176. data <- mx.symbol.Variable("data")
  177. fc1 <- mx.symbol.FullyConnected(data, num_hidden = 1)
  178. linreg <- mx.symbol.LinearRegressionOutput(fc1)
  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
  185. logger <- mx.metric.logger()
  186. epoch.end.callback <- mx.callback.log.train.metric(
  187. period = 4, # число батчей, после которого оценивается метрика
  188. logger = logger)
  189. # num of epoch
  190. n_epoch <- 20
  191. ```
  192. ---
  193. ## Построим граф модели
  194. ```{r eval=FALSE}
  195. # plot our model
  196. graph.viz(linreg)
  197. ```
  198. <img src="Deep_Learning_in_R_files/graph.png" style="width:50%" >
  199. ---
  200. ## Обучим
  201. ```{r tidy=FALSE}
  202. model <- mx.model.FeedForward.create(
  203. symbol = linreg, # our model
  204. X = x_train, # our data
  205. y = y_train, # our label
  206. ctx = mx.cpu(), # engine
  207. num.round = n_epoch,
  208. initializer = initializer, # inizialize weigths
  209. optimizer = optimizer, # sgd optimizer
  210. eval.data = list(data = x_val, label = y_val), # evaluation on evey epoch
  211. eval.metric = mx.metric.rmse, # metric
  212. array.batch.size = 15,
  213. epoch.end.callback = epoch.end.callback) # logger
  214. ```
  215. ---
  216. ## Построим кривую обучения
  217. ```{r fig.height=4, dev='svg'}
  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}
  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}
  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}
  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. ```{r eval=FALSE}
  258. allObservations <- read_rds("allObservations.rds")
  259. allObservations %>% dim()
  260. ```
  261. ---
  262. ## Посмотрим на данные
  263. ```{r fig.height=4, dev='svg'}
  264. allObservations %>%
  265. mutate(recording_length = map_int(data,nrow)) %>%
  266. ggplot(aes(x = recording_length, y = activityName)) +
  267. geom_density_ridges(alpha = 0.8)
  268. ```
  269. ---
  270. ## Отфильтруем
  271. ```{r fig.height=4}
  272. desiredActivities <- c("STAND_TO_SIT", "SIT_TO_STAND", "SIT_TO_LIE", "LIE_TO_SIT", "STAND_TO_LIE","LIE_TO_STAND")
  273. filteredObservations <- allObservations %>%
  274. filter(activityName %in% desiredActivities) %>%
  275. mutate(observationId = 1:n())
  276. filteredObservations %>% paged_table()
  277. ```
  278. ---
  279. ## Разделим на трейн тест
  280. ```{r}
  281. set.seed(100) # seed for reproducibility
  282. ## get all users
  283. userIds <- allObservations$userId %>% unique()
  284. ## randomly choose 24 (80% of 30 individuals) for training
  285. trainIds <- sample(userIds, size = 24)
  286. ## set the rest of the users to the testing set
  287. testIds <- setdiff(userIds,trainIds)
  288. ## filter data.
  289. trainData <- filteredObservations %>%
  290. filter(userId %in% trainIds)
  291. testData <- filteredObservations %>%
  292. filter(userId %in% testIds)
  293. ```
  294. ---
  295. layout: true
  296. ## Посмотрим собственно на активности по классам
  297. ---
  298. ```{r eval=FALSE}
  299. unpackedObs <- 1:nrow(trainData) %>%
  300. map_df(function(rowNum){
  301. dataRow <- trainData[rowNum, ]
  302. dataRow$data[[1]] %>%
  303. mutate(
  304. activityName = dataRow$activityName,
  305. observationId = dataRow$observationId,
  306. time = 1:n() )
  307. }) %>%
  308. gather(reading, value, -time, -activityName, -observationId) %>%
  309. separate(reading, into = c("type", "direction"), sep = "_") %>%
  310. mutate(type = ifelse(type == "a", "acceleration", "gyro"))
  311. ```
  312. ---
  313. ```{r fig.height=4}
  314. unpackedObs %>%
  315. ggplot(aes(x = time, y = value, color = direction)) +
  316. geom_line(alpha = 0.2) +
  317. geom_smooth(se = FALSE, alpha = 0.7, size = 0.5) +
  318. facet_grid(type ~ activityName, scales = "free_y") +
  319. theme_minimal() +
  320. theme( axis.text.x = element_blank() )
  321. ```
  322. ---
  323. layout: true
  324. ## Подготовка данных к обучению
  325. ---
  326. ```{r}
  327. padSize <- trainData$data %>%
  328. map_int(nrow) %>%
  329. quantile(p = 0.98) %>%
  330. ceiling()
  331. padSize
  332. convertToTensor <- . %>%
  333. map(as.matrix) %>%
  334. pad_sequences(maxlen = padSize)
  335. trainObs <- trainData$data %>% convertToTensor()
  336. testObs <- testData$data %>% convertToTensor()
  337. dim(trainObs)
  338. ```
  339. ---
  340. ```{r}
  341. # one hot encoding
  342. oneHotClasses <- . %>%
  343. {. - 7} %>% # bring integers down to 0-6 from 7-12
  344. to_categorical() # One-hot encode
  345. trainY <- trainData$activity %>% oneHotClasses()
  346. testY <- testData$activity %>% oneHotClasses()
  347. ```
  348. ---
  349. layout:true
  350. ## Наконец то сетка!
  351. ---
  352. ```{r}
  353. input_shape <- dim(trainObs)[-1]
  354. num_classes <- dim(trainY)[2]
  355. filters <- 24 # number of convolutional filters to learn
  356. kernel_size <- 8 # how many time-steps each conv layer sees.
  357. dense_size <- 48 # size of our penultimate dense layer.
  358. ```
  359. ---
  360. ```{r}
  361. model <- keras_model_sequential()
  362. model %>% layer_conv_1d(
  363. filters = filters,
  364. kernel_size = kernel_size,
  365. input_shape = input_shape,
  366. padding = "valid",
  367. activation = "relu") %>%
  368. layer_batch_normalization() %>%
  369. layer_spatial_dropout_1d(0.15) %>%
  370. layer_conv_1d(filters = filters/2,
  371. kernel_size = kernel_size,
  372. activation = "relu") %>%
  373. layer_global_average_pooling_1d() %>%
  374. layer_batch_normalization() %>%
  375. layer_dropout(0.2) %>%
  376. layer_dense(dense_size,
  377. activation = "relu") %>%
  378. layer_batch_normalization() %>%
  379. layer_dropout(0.25) %>%
  380. layer_dense(num_classes,
  381. activation = "softmax",
  382. name = "dense_output")
  383. ```
  384. ---
  385. ### Выведем описание нашей сетки
  386. ```{r eval=FALSE}
  387. summary(model)
  388. ```
  389. ![](Deep_Learning_in_R_files/keras_summary.png)
  390. ---
  391. layout:true
  392. ## Обучим же наконец
  393. ---
  394. ## Компиляция графа
  395. ```{r eval=FALSE}
  396. model %>% compile(
  397. loss = "categorical_crossentropy",
  398. optimizer = "rmsprop",
  399. metrics = "accuracy"
  400. )
  401. ```
  402. ---
  403. ## train
  404. ```{r eval=FALSE}
  405. trainHistory <- model %>%
  406. fit(
  407. x = trainObs, y = trainY, # data
  408. epochs = 350, # num epoch
  409. validation_data = list(testObs, testY), # validation tests on each epoch
  410. callbacks = list(
  411. callback_model_checkpoint("best_model.h5",
  412. save_best_only = TRUE))) # update train history and save model
  413. ```
  414. ---
  415. ![](Deep_Learning_in_R_files/train.png)
  416. ---
  417. ![](Deep_Learning_in_R_files/train_plot.png)
  418. ---
  419. layout:true
  420. ## Предсказание
  421. ---
  422. ## Подготовка теста
  423. ```{r}
  424. oneHotToLabel <- activityLabels %>%
  425. mutate(number = number - 7) %>%
  426. filter(number >= 0) %>%
  427. mutate(class = paste0("V",number + 1)) %>%
  428. select(-number)
  429. ```
  430. ## Выбор лучшей модели
  431. ```{r}
  432. bestModel <- load_model_hdf5("best_model.h5")
  433. ```
  434. ---
  435. ## Еще немного кода
  436. ```{r}
  437. tidyPredictionProbs <- bestModel %>%
  438. predict(testObs) %>%
  439. as_data_frame() %>%
  440. mutate(obs = 1:n()) %>%
  441. gather(class, prob, -obs) %>%
  442. right_join(oneHotToLabel, by = "class")
  443. predictionPerformance <- tidyPredictionProbs %>%
  444. group_by(obs) %>%
  445. summarise(
  446. highestProb = max(prob),
  447. predicted = label[prob == highestProb]
  448. ) %>%
  449. mutate(
  450. truth = testData$activityName,
  451. correct = truth == predicted
  452. )
  453. ```
  454. ---
  455. ```{r}
  456. predictionPerformance %>% paged_table()
  457. ```
  458. ---
  459. layout:true
  460. ## Визуализация ошибок
  461. ---
  462. ```{r fig.height=4}
  463. predictionPerformance %>%
  464. mutate(result = ifelse(correct, 'Correct', 'Incorrect')) %>%
  465. ggplot(aes(highestProb)) +
  466. geom_histogram(binwidth = 0.01) +
  467. geom_rug(alpha = 0.5) +
  468. facet_grid(result~.) +
  469. ggtitle("Probabilities associated with prediction by correctness")
  470. ```
  471. ---
  472. ```{r fig.height=4}
  473. predictionPerformance %>%
  474. group_by(truth, predicted) %>%
  475. summarise(count = n()) %>%
  476. mutate(good = truth == predicted) %>%
  477. ggplot(aes(x = truth, y = predicted)) +
  478. geom_point(aes(size = count, color = good)) +
  479. geom_text(aes(label = count),
  480. hjust = 0, vjust = 0,
  481. nudge_x = 0.1, nudge_y = 0.1) +
  482. guides(color = FALSE, size = FALSE) +
  483. theme_minimal()
  484. ```
  485. ---
  486. layout:false
  487. class: inverse, middle, center
  488. # Заключение
  489. ---
  490. background-image: url(https://images.manning.com/720/960/resize/book/a/4e5e97f-4e8d-4d97-a715-f6c2b0eb95f5/Allaire-DLwithR-HI.png)
  491. ---
  492. class: center, middle
  493. # Спасибо!
  494. Слайды сделаны с помощью R package [**xaringan**](https://github.com/yihui/xaringan).
  495. Веб версию слайдов можно найти на https://metya.github.io/DeepLearning_n_R/
  496. Код можно посмотреть здесь
  497. https://github.com/metya/DeepLearning_n_R/