Поезд многостолбцовый CNN с памятью - PullRequest
3 голосов
/ 03 июня 2019

Я развернул модель Inception v3 с tf.keras, и она работает нормально. В данный момент я пытаюсь улучшить свою модель, чтобы она могла обрабатывать несколько патчей / изображений вместе, что-то вроде этой статьи Лу и др .: есть несколько «столбцов» (то есть первые слои начальная модель), и они делятся весами. Тем не менее, у меня есть ограничения памяти (я использую GTX 980 с 4 ГБ ОЗУ), и я не могу реализовать это наивным способом, потому что он идет OOM при попытке вычислить градиент. OOM не идет с очень маленькими размерами (2!) И 3 столбцами, поэтому каждая партия «фактически» состоит из 6 изображений. Это не решает проблему: я хочу протестировать эту архитектуру со значительно большим количеством столбцов.

Есть ли более разумный способ, чтобы Keras (или непосредственно Tensorflow) вычислял градиент по столбцам? Позвольте мне ввести некоторые обозначения для объяснения того, что я имею в виду по столбцам: назовите d (x_2, w_2) последним плотным слоем, а c (x_1, w_1) столбцом, где x_i - входные данные слоя, а w_i - весами. Затем можно рассчитать (в пределах памяти) градиент d (c (x_1, w_1), w_2). Предположим, что есть функция u, которая «объединяет» несколько k-мерных тензоров в k-мерный тензор (например, max, medium, ...). Затем я хочу вычислить (в пределах памяти) градиент d (u (c (x_11, w_1), ..., c (x_1n, w_1)), w_2). Под столбцами я подразумеваю трюк, который вычисляет этот градиент по каждому входу c (x_1i, w_1) функции объединения u.

...