2017-01-07 9 views
2

Keras бросает ResourceExhaustedError при обучении сверточного автокодера. Я использую бэкэнс Tensorflow. На компьютере есть как Nvidia Tesla с 11 Гб памяти, так и Nvidia Quadro с 6 Гб памяти. Кажется, что Tensorflow использует оба графических процессора? Но я не слишком понимаю это. Вот минимальный пример кода, который я использую. В моем примере данные представляют собой массив numpy size = (100,1080,1920,1).Почему Keras бросает ResourceExhaustedError?

from keras.layers import Convolution2D, MaxPooling2D, UpSampling2D, Activation 
from keras.models import Sequential 
model = Sequential() 
model.add(Convolution2D(16, 3, 3, border_mode='same', input_shape=(1080, 1920, 1))) 
model.add(Activation('relu')) 
model.add(MaxPooling2D((2, 2), border_mode='same')) 
model.add(Convolution2D(16, 3, 3, border_mode='same')) 
model.add(Activation('relu')) 
model.add(UpSampling2D((2, 2))) 
model.add(Convolution2D(1, 3, 3, border_mode='same')) 
model.add(Activation('relu')) 
model.compile(optimizer='adadelta', loss='binary_crossentropy') 
model.fit(data, data) 

Похоже, что у графических процессоров заканчивается память. В autoencoder имеется 2625 переменных. Так что это не кажется достаточно, чтобы заполнить видео-плейер. Данные массива имеют размер 1600 МБ. Так что также не следует заполнять видео-плейер. Я предполагаю, что проблема имеет какое-то отношение к nb_epoch и batch_size, но я не совсем понимаю, что делают эти параметры. Есть ли способ изменить эти параметры, чтобы исправить мою проблему?

+0

изменения 'Convolution2D' -> 'Conv2D' относятся к: https://stackoverflow.com/a/46032412 –

ответ

4

Давайте попробуем приблизительно сколько памяти нужно для этой сети (несмотря на память для параметров):

  1. Вход: 1600MB
  2. Первый слой: ~ 1600MB * 16/4 = 6400MB (у вас есть в 16 раз больше каналов и уровень объединения - уменьшается размер его ввода на 4).
  3. Второй уровень: 6400 МБ (вход и выход слоя одинаковы).
  4. Третий слой: 25600 МБ (увеличивается объем данных 4 раза).
  5. Выходной уровень: 1600 МБ (то же, что и вход).

Возможно, вы видите, что для третьего слоя требуется больше 11 ГБ памяти. Более того - все форвардные значения хранятся - для алгоритма обратного распространения - поэтому на самом деле вам нужно суммировать все эти значения, чтобы получить окончательную оценку потребности в памяти.