«Живые обновления» при обучении модели машинного обучения блеску - PullRequest
0 голосов
/ 06 июня 2018

В настоящее время я разрабатываю пользовательский интерфейс, основанный на уценке R и блестящий, чтобы упростить выполнение процесса обучения машинному обучению для других пользователей, не владеющих языком R. Этот процесс обучения выполняется с помощью специальной функции, встроенной в пакет R mxnet и выдает обновления состояния, такие как ошибка обучения или какие пакеты загружаются с помощью функции message() непосредственно на консоль, при запуске в «нормальном» R-сценарии.Однако при запуске этого приложения в уценке R в браузер ничего не выводится.Следующий скрипт показывает минимальный воспроизводимый пример (с заменой процесса обучения простой «фиктивной» функцией):

---
title: "Training of a Neural Network"
output: html_document
runtime: shiny
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

```{r start_training, echo=F}
inputPanel(
  actionButton("button_start_training", "Start training")
)
```

```{r dummy_function, echo=F}
dummy_function <- function(){
  for(i in 1:5){
    message(paste0("Test: "),i)
    Sys.sleep(0.5)
  }
}
```

```{r actual_training, echo=F}
event_training = eventReactive(input$button_start_training,{

  dummy_function()

})

renderPrint({
          event_training()

          })
```

Вывод на консоль из dummy_function() не отображается в браузере, а только вприставка.Если message() заменено на print(), то в результате отображается , отображается, но только после , функция завершена, а не "live" .Поскольку фактический процесс обучения занимает несколько часов, я хотел бы предоставить эти обновления, как они будут происходить в консоли.Кроме того, замена message() на print() может вызвать некоторые проблемы, поскольку такие вещи, как ошибка обучения, возвращаются в процессе обучения mxnet как сообщение, а не как распечатка (если я правильно понял).

Итакэто сводится к двум вопросам:

  1. Есть ли способ сделать renderPrint() вывод на печать в таком виде, как он выглядит?
  2. Есть ли способ заставить renderPrint() использоватьвывод генерируется message() вместо print()?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 10 июля 2018

Одним из решений будет использование withCallingHandlers в сочетании с пакетом shinyjs (https://github.com/daattali/shinyjs).. С его помощью вы можете изменить внутренний HTML-код элемента на странице, который отображается немедленно. Начиная спустой элемент, вы можете добавлять журнал к элементу каждый раз, когда функция вызывает message, следующим образом:

dummy_function <- function(){
  for(i in 1:5){
    message(paste0("Test: "),i)
    Sys.sleep(0.5)
  }

runApp(shinyApp(
  ui = fluidPage(
    shinyjs::useShinyjs(),
    actionButton("button_start_training", "Start training"),
    textOutput("logs")
  ),
  server = function(input, output, session) {
    observeEvent(input$button_start_training, {
      withCallingHandlers({
        shinyjs::html("logs", "")
        dummy_function()
      },
        message = function(m) {
          shinyjs::html(id = "logs", html = m$message, add = TRUE)
      })
    })
  }
))
...