Вопрос или проблема
Код обнаружения объектов цифр с использованием keras действительно работает в Jupyter с ядром R.
Но потребовалось три попытки, чтобы понять, что проблема не в Jupyter, не в ядре R и не в коде. Проблема заключалась в том, что ошибочно предполагалось, что есть “проблема”, потому что Jupyter не выводил результаты эпох.
Я закрыл блокнот дважды и вернулся к нулям, потому что казалось слишком вероятным, что я допустил какую-то ошибку.
Затем я обнаружил, что отсутствующий вывод эпох отображается в терминале PowerShell – том самом терминале, который я использовал для запуска Jupyter Notebooks. Оказалось, что с IDL на самом деле ничего не было не так. И вывод предсказаний действительно отображается в Jupyter после некоторого ожидания.
Поэтому вопрос такой: Как отобразить вывод в ячейках Jupyter, используя keras в Jupyter?
library("keras")
mnist = dataset_mnist()
mnist$train$x <- mnist$train$x/255
mnist$test$x <- mnist$test$x/255
model <- keras_model_sequential() %>%
layer_flatten(input_shape = c(28, 28)) %>%
layer_dense(units = 128, activation = "relu") %>%
layer_dropout(0.2) %>%
layer_dense(10, activation = "softmax")
model %>%
compile(
loss = "sparse_categorical_crossentropy",
optimizer = "adam",
metrics = "accuracy"
)
model %>%
fit(
x = mnist$train$x, y = mnist$train$y,
epochs = 5,
validation_split = 0.3,
verbose = 2
)
predictions <- predict(model, mnist$test$x)
head(predictions, 2)
model %>%
evaluate(mnist$test$x, mnist$test$y, verbose = 0)
И вывод из терминала PowerShell;
c:\program files\python39\lib\site-packages\notebook\services\kernels\kernelmanager.py:176> cb=[IOLoop.add_future.<locals>.<lambda>() at c:\program files\python39\lib\site-packages\tornado\ioloop.py:695]> выполняется.
[I 17:46:07.080 NotebookApp] Ядро запущено: 758be753-4e56-41e9-b628-e3e66136f7ee, имя: ir36
[W 17:46:10.900 NotebookApp] Превышено время ожидания ответа kernel_info от 60ec78bf-773a-40df-b19a-b44dae383872
[E 17:46:10.901 NotebookApp] Ошибка открытия потока: HTTP 404: Не найдено (Ядро не существует: 60ec78bf-773a-40df-b19a-b44dae383872)
[I 17:46:14.815 NotebookApp] Адаптация от версии протокола 5.0 (ядро 758be753-4e56-41e9-b628-e3e66136f7ee) до 5.3 (клиент).
[I 17:48:06.974 NotebookApp] Сохранение файла по адресу /R_TensorFlow/Untitled.ipynb
[W 17:48:07.484 NotebookApp] Доверяю блокноту /R_TensorFlow/Untitled.ipynb
[I 17:48:07.846 NotebookApp] Сохранение файла по адресу /R_TensorFlow/Untitled.ipynb
[I 17:48:08.771 NotebookApp] Начало буферизации для 758be753-4e56-41e9-b628-e3e66136f7ee:b4e1466d1f7448c08db2851842d80ba9
[I 17:48:09.598 NotebookApp] Адаптация от версии протокола 5.0 (ядро 758be753-4e56-41e9-b628-e3e66136f7ee) до 5.3 (клиент).
2021-11-08 17:49:45.432220: I tensorflow/core/platform/cpu_feature_guard.cc:151] Этот бинарный файл TensorFlow оптимизирован с помощью oneAPI Deep Neural Network Library (oneDNN) для использования следующих инструкций процессора в критически важных операциях: AVX AVX2
Чтобы включить их в других операциях, пересоберите TensorFlow с соответствующими флагами компилятора.
2021-11-08 17:49:52.419047: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1525] Создано устройство /job:localhost/replica:0/task:0/device:GPU:0 с 2818 MB памяти: -> устройство: 0, имя: NVIDIA GeForce GTX 750 Ti, pci bus id: 0000:01:00.0, вычислительная способность: 5.0
Эпоха 1/5
[I 17:50:09.435 NotebookApp] Сохранение файла по адресу /R_TensorFlow/Untitled.ipynb
1313/1313 - 15s - потери: 0.3407 - точность: 0.9005 - val_loss: 0.1809 - val_accuracy: 0.9464 - 15s/эпоха - 11ms/шаг
Эпоха 2/5
1313/1313 - 8s - потери: 0.1649 - точность: 0.9518 - val_loss: 0.1364 - val_accuracy: 0.9602 - 8s/эпоха - 6ms/шаг
Эпоха 3/5
1313/1313 - 8s - потери: 0.1218 - точность: 0.9635 - val_loss: 0.1091 - val_accuracy: 0.9676 - 8s/эпоха - 6ms/шаг
Эпоха 4/5
1313/1313 - 8s - потери: 0.1001 - точность: 0.9691 - val_loss: 0.1036 - val_accuracy: 0.9691 - 8s/эпоха - 6ms/шаг
Эпоха 5/5
1313/1313 - 8s - потери: 0.0814 - точность: 0.9750 - val_loss: 0.0986 - val_accuracy: 0.9723 - 8s/эпоха - 6ms/шаг
[I 17:52:09.440 NotebookApp] Сохранение файла по адресу /R_TensorFlow/Untitled.ipynb
[I 17:54:09.416 NotebookApp] Сохранение файла по адресу /R_TensorFlow/Untitled.ipynb
Эпоха 1/5
1313/1313 - 8s - потери: 0.0717 - точность: 0.9778 - val_loss: 0.0941 - val_accuracy: 0.9728 - 8s/эпоха - 6ms/шаг
Эпоха 2/5
1313/1313 - 8s - потери: 0.0638 - точность: 0.9791 - val_loss: 0.0911 - val_accuracy: 0.9738 - 8s/эпоха - 6ms/шаг
Эпоха 3/5
1313/1313 - 8s - потери: 0.0551 - точность: 0.9818 - val_loss: 0.0917 - val_accuracy: 0.9737 - 8s/эпоха - 6ms/шаг
Эпоха 4/5
1313/1313 - 8s - потери: 0.0496 - точность: 0.9836 - val_loss: 0.0926 - val_accuracy: 0.9744 - 8s/эпоха - 6ms/шаг
Эпоха 5/5
1313/1313 - 8s - потери: 0.0463 - точность: 0.9849 - val_loss: 0.0896 - val_accuracy: 0.9754 - 8s/эпоха - 6ms/шаг
[I 17:56:09.425 NotebookApp] Сохранение файла по адресу /R_TensorFlow/Untitled.ipynb
[E 18:40:48.511 NotebookApp] Запрос информации о ядре завершился неудачно, предполагая текущие {}
Похоже, что это в настоящее время нерешенная проблема: https://github.com/IRkernel/IRkernel/issues/416. В keras результат fit()
– это история обучения, поэтому вы можете присвоить его переменной (history <- model %>% fit (..)
) и исследовать или построить график (plot(history)
) после обучения, как в примере здесь. Если вам нужен интерактивный вывод, вы можете запустить свой код в терминале с помощью Rscript
или R
.
Ответ или решение
Вопрос, касающийся отсутствия вывода в Jupyter при использовании библиотеки Keras с R-ядром, поднимает важные аспекты взаимодействия между большой экосистемой пакетов и инструментов, предназначенных для машинного обучения и обработки данных. Это может вызывать путаницу у разработчиков, сталкивающихся с ситуацией, когда результаты обучения не отображаются в ячейках Jupyter, но при этом вывод может появляться в терминале, из которого запущен Jupyter.
Объяснение проблемы
Когда вы запускаете обучение модели с использованием функции fit()
в Keras, она по умолчанию не возвращает никаких выводов в ячейку Jupyter, если установлен параметр verbose = 0
. Стандартным значением является verbose = 1
, что означает, что на каждой итерации будет отображаться прогресс. Однако, в вашем случае, есть вероятность, что вывод направляется не в Jupyter, а в терминал, что стало источником недоразумения.
Как отобразить выходные данные в ячейках Jupyter
Чтобы удостовериться, что выходные данные тренировок будут отображаться в ячейках Jupyter, выполните следующие шаги:
-
Параметр Verbose: Убедитесь, что в вашей функции
fit()
параметрverbose
установлен на1
или2
. Например:model %>% fit( x = mnist$train$x, y = mnist$train$y, epochs = 5, validation_split = 0.3, verbose = 2 )
verbose = 0
— без вывода.verbose = 1
— вывод на каждой итерации, по одной строке.verbose = 2
— вывод для каждого эпо́ха в отдельной строке.
-
Сохранение Истории Обучения: Рекомендуется сохранять историю обучения в переменной, чтобы вы могли обращаться к ней впоследствии:
history <- model %>% fit(...)
Это позволит вам анализировать и визуализировать результаты, используя функцию
plot(history)
:plot(history)
-
Работа с выводом в терминале: Если вам требуется интерактивный вывод во время выполнения, попробуйте запускать код через
Rscript
или в терминальной сессии R. Это решение может обеспечить более богатый вывод, чем может предоставить Jupyter.
Заключение
Таким образом, возможность отображения результатов обучения модели Keras в Jupyter зависит как от настроек параметра вывода, так и от среды, в которой выполняется код. Если вы столкнетесь с ситуацией, когда вывод не виден в ячейках, первое, что следует проверить, – это параметры функции fit()
, а затем рассмотреть альтернативные способы получения вывода. Надеюсь, эти советы помогут вам избежать путаницы и эффективно продвигаться в ваших проектах, связанных с глубоким обучением.