【问题标题】:Prepare VGG Perceptual Loss on the fly for super-resolution with keras使用 keras 即时准备 VGG 感知损失以实现超分辨率
【发布时间】:2019-10-01 18:46:10
【问题描述】:

基本上,我正在为论文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

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    内存不足的原因有两个:

    1. 该模型不适合您的记忆。如果您要在 GPU 上移动所有计算,请尝试在 CPU 上运行它们。 CPU 将要求您的模型存储在通常比 GRAM 更大的 RAM 中。如果这没有帮助,唯一的解决方案是简化您的模型(当然,或者升级您的系统)。

      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)
      

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 2021-10-23
      • 2023-02-22
      相关资源
      最近更新 更多