Учебный дизайн / последовательная загрузка изображений для Mask-RCNN - PullRequest
0 голосов
/ 12 апреля 2020

Я тренирую модель глубокого обучения с использованием маски RCNN из следующего git репозитория: Математический порт / Mask_RCNN. Я полагаюсь на значительное увеличение моего набора данных (исходный набор данных: 59 изображений 1988x1355x3 с каждыми> 80 аннотациями), которые я храню локально (необходимо для оценки типа / степени увеличения по сравнению с метриками проверки). Расширенный набор данных насчитывает 6000 изображений. Этот набор данных изменяется по размерам x и y изображения из-за уменьшения разрешения и аффинных преобразований - я предполагаю, что разные размеры x, y не повлияют на окончательные тесты.

Тем не менее, мое ядро ​​Python вылетает всякий раз, когда я загружаю больше, чем 'X' изображений для обучения модели.

Следовательно, мне пришла в голову идея разбить набор данных на поднаборы данных. и итерацию по поднабору данных, используя «последние» обученные веса в качестве отправной точки для нового раунда. Но я не уверен, что результаты будут одинаковыми (читай: то же самое, учитывая стохастику c характер «стохасти c градиентный спуск»)?

Интересно, будут ли результаты одинаковыми, если я не буду перебирать поднаборы данных за эпоху, а обучать эпохи Y (например, 20 только для «голов», 10 для «всех слоев» ')?

Тем не менее, я уверен, что это не самый эффективный способ решения этой проблемы. Идеи по улучшению приветствуются.

Примечание , я не использую keras.preprocessing.image.ImageDataGenerator(), как я понял, он случайным образом генерирует данные и передает их в модель, заменяя входные данные для эпоха, тогда как я хотел бы передать весь набор данных в модель.

Если мои спецификации мне пригодятся: Python 3.6, Tensorflow 1.9.0, Keras 2.2.4, CUDA 10.0, GPU Nvidia Geforce RTX 2060 Super (8 ГБ)

1 Ответ

0 голосов
/ 13 апреля 2020
  1. Мне пришла в голову идея разбить набор данных на наборы под-данных и перебрать его, используя «последние» обученные веса в качестве отправной точки для нового раунда. Но я не уверен, что результаты будут такими же?

    • Вы делаете то же самое, что и ImageDataGenerator (создавая свои собственные мини-пакеты), но менее оптимально. Результат будет таким же в отношении чего?

Если вы имеете в виду модель, которая была обучена со всеми данными в одной партии? - Скорее всего нет. Поскольку более низкая партия означает более медленную конвергенцию. Но это можно решить, обучив большее количество эпох.

Еще одна проблема - это воспроизводимость. Если вы хотите воспроизводить вашу модель с одинаковыми результатами каждый раз, просто используйте семена.

import random
random.seed(1)

import numpy as np
np.random.seed(1)

import tensorflow
tensorflow.random.set_seed(1)
Другая концепция - накопление градиента. Это поможет вам обучить вас с большим размером пакета, не сохраняя слишком много изображений в памяти за один раз.

https://github.com/CyberZHG/keras-gradient-accumulation

Наконец, keras.preprocessing.image.ImageDataGenerator () на самом деле обучает весь набор данных, он просто выбирает случайную выборку на каждом шаге (вы делаете то же самое с вашими так называемыми поднаборами данных).

Вы можете заполнить ImageDataGenerator, чтобы он воспроизводился и не был полностью случайным.

...