Какова лучшая стратегия для обработки огромного количества обучающих данных с Tensorflow 2.0 (общие принципы)? - PullRequest
0 голосов
/ 20 февраля 2020

Мне бы хотелось узнать ваше мнение или дать совет относительно наилучшей стратегии обработки огромного объема обучающих данных в конкретном случае обнаружения объектов на изображении с использованием нейронных сетей Uneti sh. Я знаю, что такого рода вопросы могут часто задаваться, но предмет здесь больше о том, как организовать чтение данных, чем о том, как управлять с помощью tenorflow или keras. Для информации, я счастливый пользователь графического процессора Tesla V100.

Сюжет

Я пытаюсь обнаружить некоторые объекты на спутниковом изображении Sentinel 2 (изображение S2, tif файл). Одно изображение S2 состоит из приблизительно 10 полос (т.е. цветов, красного, зеленого, синего, инфракрасного ...) по 10 000 x 10 000 пикселей каждая (~ 500 МБ).

Для соответствия Unet сеть, каждое изображение S2 разрезается на небольшие участки размером 512 x 512 x 10 пикселей. Конечно, у меня есть целевое изображение для всех моих изображений S2, так что размер одного патча составляет 512 x 512 x (10 + 1).

У меня нет проблем с использованием графических процессоров, но с тем, как перенести данные с диска.

Какой самый эффективный способ загрузки данных?

Что я пробовал

Сначала я попытался загрузить все изображения S2 в память как большой * Массив 1072 * (10 000 x 10 000 x 11) с использованием библиотеки gdal, и я создал функцию генератора данных для извлечения исправлений из этого массива numpy во время подгонки. Так что все в памяти перед тренировкой и партии взяты из этой большой матрицы. Это работало довольно хорошо на машине с 128 ГБ ОЗУ, пока я не получил намного больше образов S2 со ссылками, так что я не могу больше все поместить в ОЗУ.

Итак, я тогда пытался загружать изображения S2 один за другим перед каждой пакетной обработкой (т. е. перед каждым шагом в одну эпоху!), чтобы создать все случайно выбранные патчи для одной партии. Я должен делать это на каждом шаге одной эпохи ... Результаты в порядке, но загрузка данных и составление пакетов занимает гораздо больше времени, чем сам расчет.

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

Я также видел несколько статей об использовании Формат tfrecords из тензорного потока. Я думал преобразовать мои изображения S2 в этот формат, надеясь, что IO будет быстрее.

Поэтому у меня есть два типа вопросов: технические (как читать данные) и алгоритмические c (теория глубокого обучения).

Вопросы

Технические

  • Каков оптимальный способ создания файла tfrecords ? Должен ли я:
    • создать один tfrecord файл для каждого патча?
    • создать один tfrecord файл для каждого предполагаемого пакета?
  • Является ли файл tfrecord хорошей альтернативой или это пустая трата времени, поскольку образы S2 уже в двоичном формате (файлы tif ) загружаются с библиотеками gdal?

Algorithmi c

  • Неужели это проблема перестановки только одного изображения, а не всего набора данных?
  • Что вы думаете об изучении один S2 образ, учись на втором et c ...? Это математически релевантно?

Я не делюсь ни одним кодом, я не уверен, что это полезно для общего принципа.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...