Как передать смешанные данные, включая изображения, в модель глубокого обучения с помощью конвейера ввода из tfdatasets в R - PullRequest
1 голос
/ 07 августа 2020

Это мой первый пост в stackoverflow, на который, наверное, очень легко ответить. Однако из-за отсутствия руководств, касающихся этой конкретной проблемы c в R, я думаю, что это может быть отличным справочником для пользователей R, пытающихся реализовать смешанные данные, включая изображения.

В частности, моя задача состоит в том, чтобы соответствовать модель глубокого обучения с несколькими входами, включая данные изображения в R для задачи регрессии. Я использую tfdatasets для создания PrefetchDataset из текстового файла, содержащего пути к изображениям и другие данные (конвейер предварительной обработки похож на этот (https://blogs.rstudio.com/ai/posts/2019-08-23-unet/), за исключением того, что имеет только одну переменную изображения), который выглядит следующим образом :

training_dataset ('validation_dataset' выглядит аналогично)

Первый тензор - это данные изображения (размер пакета, ширина, высота, каналы), за которыми следуют дополнительные числовые данные (размер пакета, два столбца) и, наконец, цели (размер пакета, один столбец) . Я убедился, что входные слои принимают именно эти размеры, и компиляция модели работает нормально. Вот фрагмент кода для создания экземпляра модели:

 model <- keras_model(
    inputs = c(input_cnn, input_dense),
    outputs = c(main_output)
  )

По сути, мой вопрос о том, как передать набор данных в функцию соответствия. Моя прежняя задача заключалась в использовании только данных изображения, и я пошел с этим:

history <- model %>% fit(x = training_dataset,
                         epochs = 100,
                         steps_per_epoch = dataset_size/batch_size,
                         validation_data = validation_dataset)

Очевидно, аргумент y в fit () указывать не нужно. С новым набором данных я получаю различные ошибки, в основном следующие:

Ошибка в py_call_impl (вызываемый, точки $ args, точки $ ключевые слова): AssertionError: в коде пользователя: ...

До сих пор я пробовал использовать три отдельных набора PrefetchDatasets (изображения, дополнительная информация, цели) и подогнать их как fit(x = list(training_dataset_images, training_dataset_additional), y = training_dataset_targets...), но ничего подобного не сработало. Кроме того, я думаю, что должен быть элегантный способ сделать это.

Программное обеспечение: Keras 2.3.0.0, tfdatasets 2.0.0, tensorflow 2.2.0, R 3.6.3.

Подсказки на проблема и как улучшить мой пост приветствуются: -)

EDIT

Я просто хочу упомянуть, что я думаю, что нашел решение или, по крайней мере, обходной путь это подходит для меня. Я поделюсь им здесь, потому что это может помочь другим. Я вставил функцию dataset_prepare во входной конвейер tfdatasets, чтобы результирующий набор данных выглядел так:

Затем я использовал следующий код, чтобы нарисовать пакет из набора данных (то же самое для проверочных и тестовых наборов данных), который я могу перебирать:

iter_train <- make_iterator_one_shot(training_dataset)
next_batch_train <- iterator_get_next(iter_train)

Таким образом, я смог вызвать, например, учебные цели пакета, используя next_batch_train$y.

Наконец, я использовал train_on_batch для обучения и test_on_batch для проверки и тестирования с простым for-l oop прохождение всех пакетов для каждой эпохи, пока набор данных не станет пустым. Для следующей эпохи я снова использовал make_iterator_one_shot и так далее. В итоге я сам написал примитивную версию частей функции Keras fit, чтобы иметь представление о показателях во время обучения и проверки.

Приветствуются более простые решения: -)

...