基本上,我正在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
答案 0 :(得分:0)
内存不足的原因有两个:
该模型不适合您的记忆。如果要在GPU上移动所有计算,请尝试在CPU上运行它们。 CPU将要求您的模型存储在通常大于GRAM的RAM中。如果那没有帮助,唯一的解决方案是简化模型(当然,或者升级系统)。
2。数据不适合您的内存。从您的代码中,我不知道 document score
user
A 'ABC', 'BCD', 'CDE' '0.98', '0.91', '0.9'
B 'ABC', 'XYZ' '0.68', '0.6'
的大小是多少。通常,您不会将整个训练集作为数据输入,因为这会减慢训练速度(大多数梯度会变得多余),并且不必要提高性能(不允许逃脱局部最优值) )。此处的解决方案是将您的输入分成x_train
的小部分。因此,代码将是这样的:
mini-batches