Тонкая настройка vgg поднять ошибку памяти

Привет, я пытаюсь точно настроить VGG на мою проблему, но когда я пытаюсь обучить сеть, я получаю эту ошибку.

ООМ при выделении тензора с формой [25088,4096]

Сеть имеет такую ​​структуру:

введите описание изображения здесь

Я взял этот код реализации vgg с предварительно подготовленным тензорным потоком с этого сайта.

Я только добавляю эту процедуру для обучения сети:

with tf.name_scope('joint_loss'):
   joint_loss = ya_loss+yb_loss+yc_loss+yd_loss+ye_loss+yf_loss+yg_loss+yh_loss+yi_loss+yl_loss+ym_loss+yn_loss

    # Loss with weight decay
    l2_loss = tf.add_n([tf.nn.l2_loss(v) for v in tf.trainable_variables()])
    self.joint_loss = joint_loss + self.weights_decay * l2_loss
    self.optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate).minimize(joint_loss)

я пытаюсь уменьшить размер пакета до 2, но не работает, я получаю ту же ошибку. Ошибка из-за большого тензора, который не может быть выделен в памяти. Я получаю эту ошибку только в поезде, если я передаю значение без минимизации работы сети. Как я могу избежать этой ошибки? Как я могу сохранить память видеокарты (Nvidia GeForce GTX 970)?

ОБНОВЛЕНИЕ: если я использую GradientDescentOptimizer, начинается процесс обучения, вместо этого, если я использую AdamOptimizer, я получаю ошибку памяти, кажется, что GradientDescentOptimizer использует меньше памяти.

1 ответ

Без обратного прохода ("передать значение без минимизации") TensorFlow может немедленно отменить выделение промежуточных активаций. При обратном проходе график имеет гигантскую U-образную форму, где активации обратного прохода должны храниться в памяти для обратного прохода. Есть несколько хитростей (таких как замена памяти хоста), но в целом backprop означает, что использование памяти будет выше.

Адам хранит некоторые дополнительные переменные учета, так что это увеличит использование памяти пропорционально количеству памяти, которое уже используют ваши весовые переменные. Если ваши учебные шаги занимают довольно много времени (в этом случае обновление переменных на GPU не имеет значения), вы можете вместо этого найти операции оптимизации в памяти хоста.

Если вам нужен больший размер пакета и вы не можете уменьшить разрешение изображения или размер модели, хорошим вариантом может быть объединение градиентов от нескольких рабочих / графических процессоров с использованием чего-то вроде SyncReplicasOptimizer. Глядя на документ, связанный с этой моделью, похоже, что они тренировались на 4 графических процессорах каждый с 12 ГБ памяти.

Другие вопросы по тегам