Почему у модели * меньшего размера * Keras не хватает памяти? - PullRequest
2 голосов
/ 22 апреля 2020

У меня есть модель Keras, которая состоит из различных слоев. Один из этих слоев - фактически другая целая модель. Когда эта модель слоя VGG16, я могу обучить Uber-модель. Это модель.summary ():

enter image description here

Когда я просто поменяю VGG16 и поменяю местами в EfficientNetB0 (на намного меньше модель!) больше не могу тренировать убер-модель. Это модель.summary ():

enter image description here

«А-а, - говорите вы, - что-то что-то обучаемое, что-то весит, что-то градиенты в памяти, что-то, что-то. "

Хорошо, конечно. Давайте сжимаем и / или сбрасываем кучу слоев таким образом, чтобы тренировочные веса были ниже версии VGG16. После этого я все еще не могу тренировать Uber-модель! Это модель.summary ():

enter image description here

Почему я не могу обучить гораздо меньшую модель, которая имеет 30% от общего веса и 25 % обучаемых весов?

Пример кода:

img = Input(shape = (224,224,3))
# ^ Don't reuse img= or Tensorflow will break!
x = BatchNormalization()(img)
x = Efnet(x)
# x = Vgg16(x)
x = Activation('linear')(x)
# ^ Don't remove pass through or Tensorflow will break!
x = GeneralizedMeanPool2D(x)
x = NormActDrop(x)
x = DenseNormActDrop(x, 32)
x = DenseNormActDrop(x, 32)
x = DenseNormActDrop(x, 32)
x = Dense(1)(x)

model = Model(inputs = img, outputs = x)
model.summary()

Пользовательские блоки настолько просты, насколько вы можете себе представить, например:

def NormActDrop(x, activation_function = mish, dropout_rate = 0.2):

    x = BatchNormalization()(x)
    x = Activation(activation_function)(x)
    x = Dropout(dropout_rate)(x)

    return x

1 Ответ

0 голосов
/ 22 апреля 2020

В зависимости от того, какую версию Tensorflow вы используете и о какой ошибке сообщается, может быть много ответов. Один ответ, который я нашел в прошлом, заключается в том, что в некоторых моделях, если для параметра allow_growth установлено значение False, модель будет работать, заполняя графический процессор. Вы можете попробовать установить значение True.

См. Этот вопрос о переполнении стека и ответ для более подробной информации


Что-то вроде хотя это может сработать ...

config = tf.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.Session(config=config, ...)

Дайте мне знать, если это поможет. В общем, , пожалуйста, опубликуйте более подробную информацию о вашей проблеме (воспроизводимый код, трассировка стека и т. Д. c.)

...