Недостаточно памяти в реализации нейронной сети (с использованием Numpy Array) - PullRequest
0 голосов
/ 19 марта 2019

Мой набор данных имеет следующую форму:

Данные обучения

Числовой массив размером (7855, 448, 448, 3), где (448, 448, 3) - цифровая версия RGB-изображения. Поскольку целью сети является регрессия, я еще не нашел решение использовать ImageDataGenerator. Итак, я конвертировал весь набор данных изображений в массив numpy.

Учебная цель

Учебная цель - это одномерный массив с размером 7855. Записи соответствуют данным тренировочных данных.

Чтобы получить массивы numpy, мне нужно загрузить весь набор данных в память в переменную, а затем передать его для подгонки и прогнозирования. Это занимает до 5-6 гигабайт оперативной памяти в одиночку.

При подгонке модели оперативная память быстро переполняется, и среда выполнения падает. Как передать элементы массива numpy в пакетном режиме или есть альтернативный способ загрузки набора данных в формате:

|list of images |
|labelled       |
|1, 2, 3...     |
|n              |


|csv file with: |
|1   target1    |
|2   target2    |
|3   target3... |

КОД https://colab.research.google.com/drive/1FUvPcpYiDtli6vwIaTwacL48RwZ0sq-9

[Я использовал Google Colab, так как это академический исследовательский проект, и еще не инвестировал в высокопроизводительный сервер. ]

1 Ответ

0 голосов
/ 19 марта 2019

Вам необходимо использовать Dataset API. Когда вы создали свои массивы numy, train_images, train_target, используйте tf.data.Dataset.from_tensor_slices

dataset = tf.data.Dataset.from_tensor_slices((train_images, train_target))

Это создаст объект набора данных, который может быть передан в model.fit Вы можете перемешать, пакетировать и сопоставить любую функцию анализа с этим набором данных. Вы можете контролировать, сколько примеров будет предварительно загружено с помощью буфера перемешивания. Повторите количество контрольных эпох и лучше оставьте None, так что оно будет повторяться бесконечно.

dataset = dataset.shuffle().repeat()
dataset = dataset.batch()

Помните, что пакетирование продолжается внутри этого конвейера, поэтому вам не нужно использовать пакет в model.fit, но вам нужно передавать количество эпох и шагов за эпоху. Последнее может быть немного сложнее, потому что вы не можете сделать что-то вроде len(dataset), поэтому его следует рассчитать заранее.

model.fit(dataset, epochs, steps_per_epoch)

Если вы столкнетесь с ошибкой предела graphdef, лучше сохранить несколько более мелких массивов и передать их в виде списка

Ознакомьтесь с этим гидом https://www.tensorflow.org/guide/datasets Надеюсь, это поможет.

...