Подготовьте VGG Perceptual Loss на лету для суперразрешения с помощью керасов - PullRequest
0 голосов
/ 14 мая 2019

В основном я реализую ту же модель для суперразрешения одного изображения из статьи https://arxiv.org/abs/1603.08155. Я столкнулся с проблемой памяти, когда попытался сгенерировать для активации вывод наземных исправлений правды, которые будут использоваться для вычисления потеря восприятия во время обучения. Интересно, как я могу генерировать результаты на лету.

Я использую патчи изображения 10k 288x288 в качестве базовых истин и соответствующие размытые и уменьшенные патчи 72x72 в качестве обучающих данных. Для сети с потерями я использую VGG-16 и выход из уровня Relu2-2. Я попытался использовать model.predict () для подачи правдоподобных исправлений и генерирования соответствующих выходных данных активации, которые затем можно передать в model.fit () для обучения. Однако набор данных кажется слишком большим, и он столкнулся с проблемой памяти. Я понимаю, что на практике это распространенная проблема, когда набор данных слишком велик, и решение заключается в использовании fit.generator () и imagedataGenrator для генерации данных на лету. Однако я не уверен, как именно я могу реализовать такую ​​функцию в моем случае. Может кто-нибудь объяснить мне, как я должен реализовать такую ​​функцию или какие другие методы я должен использовать для решения этой проблемы?

### Create Image Transformation Model ###
mainModel = ResnetBuilder.build((3,72,72), 5, basic_block, [1, 1, 1, 1, 1])

### Create Loss Model (VGG16) ###
lossModel = VGG16(include_top=False, weights='imagenet', input_tensor=None, input_shape=(288,288,3))
lossModel.trainable=False
for layer in lossModel.layers:
    layer.trainable=False

### Create New Loss Model (Use Relu2-2 layer output for perceptual loss)
lossModel = Model(lossModel.inputs,lossModel.layers[5].output)
lossModelOutputs = lossModel(mainModel.output)

### Create Full Model ###
fullModel = Model(mainModel.input, lossModelOutputs)

### Compile FUll Model
fullModel.compile(loss='mse', optimizer='adam',metrics=['mse'])
trained_epochs=0
print("fullModel compiled!")
y_train_lossModel = lossModel.predict(y_train,batch_size=1)
MemoryError                               Traceback (most recent call last)
<ipython-input-11-1f5c849e454a> in <module>
----> 1 y_train_lossModel = lossModel.predict(y_train,batch_size=1)
      2 print(y_train_lossModel.shape)
      3 with h5py.File('y_train_lossModel.h5', 'w') as hf:
      4     hf.create_dataset('y_train_lossModel', data=y_train_lossModel)

~/anaconda3/envs/fyp/lib/python3.6/site-packages/keras/engine/training.py in predict(self, x, batch_size, verbose, steps)
   1167                                             batch_size=batch_size,
   1168                                             verbose=verbose,
-> 1169                                             steps=steps)
   1170 
   1171     def train_on_batch(self, x, y,

~/anaconda3/envs/fyp/lib/python3.6/site-packages/keras/engine/training_arrays.py in predict_loop(model, f, ins, batch_size, verbose, steps)
    298                 for batch_out in batch_outs:
    299                     shape = (num_samples,) + batch_out.shape[1:]
--> 300                     outs.append(np.zeros(shape, dtype=batch_out.dtype))
    301             for i, batch_out in enumerate(batch_outs):
    302                 outs[i][batch_start:batch_end] = batch_out

MemoryError: 
### Train the full model
epochs=5
for n in range(trained_epochs+1,trained_epochs+epochs+1):
    print("Epoch",n)
    fullModel.fit(x_train, y_train_lossModel, batch_size=4, epochs=1)
    fullModel.save('full_model.h5')
trained_epochs=n

1 Ответ

0 голосов
/ 14 мая 2019

Существует две причины, по которым вам может не хватить памяти:

  1. Модель не умещается в вашей памяти. Если вы перемещаете все вычисления на GPU, попробуйте запустить их вместо этого на CPU. Процессор потребует, чтобы ваша модель была сохранена в оперативной памяти, которая обычно больше GRAM. Если это не помогает, единственное решение - упростить вашу модель (или, конечно, обновить систему).

    2. Данные не помещаются в вашей памяти. Из вашего кода я понятия не имею, какой размер x_train. Как правило, вы не предоставляете весь тренировочный набор в качестве входных данных, потому что это замедляет вашу тренировку (большинство градиентов будет избыточным) и не требует повышения производительности (это не позволяет избежать локальной оптимальности). ). Решение здесь состоит в том, чтобы вводить ваши данные небольшими порциями под названием mini-batches. Следовательно, код будет выглядеть примерно так:

    for n_epochs in range(num_epochs):
        x_batch, y_batch = getMiniBatch(x_train, y_train)
        model.fit(x_batch, y_batch)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...