Python 转移学习-尝试重新培训RTX 2070上的efficientnet-B07内存不足

Python 转移学习-尝试重新培训RTX 2070上的efficientnet-B07内存不足,python,tensorflow,keras,deep-learning,efficientnet,Python,Tensorflow,Keras,Deep Learning,Efficientnet,这是我在尝试64gb ram CPU 挤压RTX 2070 config = tf.ConfigProto() config.gpu_options.per_process_gpu_memory_fraction = 0.7 tf.keras.backend.set_session(tf.Session(config=config)) model = efn.EfficientNetB7() model.summary() # create new output layer output_l

这是我在尝试
64gb ram CPU
挤压
RTX 2070

config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.7
tf.keras.backend.set_session(tf.Session(config=config))

model = efn.EfficientNetB7()
model.summary()

# create new output layer
output_layer = Dense(5, activation='sigmoid', name="retrain_output")(model.get_layer('top_dropout').output)
new_model = Model(model.input, output=output_layer)
new_model.summary()
# lock previous weights

for i, l in enumerate(new_model.layers):
    if i < 228:
        l.trainable = False
# lock probs weights

new_model.compile(loss='mean_squared_error', optimizer='adam')

batch_size = 5
samples_per_epoch = 30
epochs = 20

# generate train data
train_datagen = ImageDataGenerator(
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    validation_split=0)

train_generator = train_datagen.flow_from_directory(
    train_data_input_folder,
    target_size=(input_dim, input_dim),
    batch_size=batch_size,
    class_mode='categorical',
    seed=2019,
    subset='training')

validation_generator = train_datagen.flow_from_directory(
    validation_data_input_folder,
    target_size=(input_dim, input_dim),
    batch_size=batch_size,
    class_mode='categorical',
    seed=2019,
    subset='validation')

new_model.fit_generator(
    train_generator,
    samples_per_epoch=samples_per_epoch,
    epochs=epochs,
    validation_steps=20,
    validation_data=validation_generator,
    nb_worker=24)

new_model.save(model_output_path)



exception:
config=tf.ConfigProto()
config.gpu\u options.per\u进程\u gpu\u内存\u分数=0.7
tf.keras.backend.set_会话(tf.session(config=config))
模型=efn.EfficientNetB7()
model.summary()
#创建新的输出层
输出层=密集(5,activation='sigmoid',name=“retain_output”)(model.get_层('top_dropout')。输出)
新模型=模型(模型.输入,输出=输出层)
新的_模型。摘要()
#锁定以前的权重
对于枚举中的i,l(新的_模型层):
如果i<228:
l、 可训练=错误
#锁定probs砝码
新模型。编译(loss='mean'u squared'u error',optimizer='adam')
批量大小=5
每个历元的样本数=30
纪元=20
#生成列车数据
列车\数据发生器=图像数据发生器(
剪切范围=0.2,
缩放范围=0.2,
水平翻转=真,
验证(拆分=0)
train_generator=来自目录的train_datagen.flow_(
列车数据输入文件夹,
目标尺寸=(输入尺寸,输入尺寸),
批次大小=批次大小,
class_mode='classifical',
种子=2019年,
("培训")
验证\u生成器=来自\u目录的列车\u datagen.flow\u(
验证\数据\输入\文件夹,
目标尺寸=(输入尺寸,输入尺寸),
批次大小=批次大小,
class_mode='classifical',
种子=2019年,
子集(验证)
新的_model.fit _生成器(
列车发电机,
每个历元的样本数=每个历元的样本数,
时代,
验证步骤=20,
验证数据=验证生成器,
nb_工人=24)
新建模型。保存(模型输出路径)
例外情况:
2019-11-17 08:52:52.903583:I tensorflow/stream_executor/dso_loader.cc:152]已成功打开CUDA 图书馆libcublas.so.10.0本地版。。。2019-11-17 08:53:24.713020: I tensorflow/core/common_runtime/bfc_allocator.cc:641]110块 尺寸27724800总计2.84GiB 2019-11-17 08:53:24.713024:I tensorflow/core/common_runtime/bfc_allocator.cc:641]6个大小的块 38814720总计222.10MiB 2019-11-17 08:53:24.713027:I tensorflow/core/common_runtime/bfc_allocator.cc:641]23个大小的块 54000128总计1.16GiB 2019-11-17 08:53:24.713031:I tensorflow/core/common_runtime/bfc_allocator.cc:641]1个大小的块 共73760000总计70.34MiB 2019-11-17 08:53:24.713034:I tensorflow/core/common_runtime/bfc_分配器。cc:645]总计 正在使用的块:5.45GiB 2019-11-17 08:53:24.713040:I tensorflow/core/common_runtime/bfc_allocator.cc:647]Stats:Limit: 5856749158因努斯:5848048896最大因努斯:584806144Numallocs:6140 MaxAllocSize:3259170816

2019-11-17 08:53:24.713214:W tensorflow/core/common_runtime/bfc_分配器。cc:271] ****************************************************************************************************2019-11-17 08:53:24.713232:W tensorflow/core/framework/op_kernel.cc:1401]op_REQUIRES在失败 cwise_ops_common.cc:70:资源耗尽:分配时OOM 形状为[51344,38,38]且类型为浮点数的张量 /作业:本地主机/副本:0/任务:0/设备:GPU:0由分配器GPU\U 0\U bfc执行 回溯(最近一次调用上次):文件 “/home/naort/Desktop/deep learning data preparing tools/EfficientNet Transfer learning Boiler Plate/model_retain.py”, 第76行,在nb_worker=24)文件中 “/usr/local/lib/python3.6/dist-packages/keras/legacy/interfaces.py”, 第91行,在包装返回func(*args,**kwargs)文件中 “/usr/local/lib/python3.6/dist-packages/keras/engine/training.py”, 第1732行,在fit_generator initial_epoch=initial_epoch)文件中 “/usr/local/lib/python3.6/dist-packages/keras/engine/training_-generator.py”, 第220行,在fit_生成器reset_metrics=False)文件中 “/usr/local/lib/python3.6/dist-packages/keras/engine/training.py”, 第1514行,批处理输出上的列内函数=self.train函数(ins)文件 “/home/naort/.local/lib/python3.6/site packages/tensorflow/python/keras/backend.py”, 第3076行,在调用run\u metadata=self.run\u metadata)文件中 “/home/naort/.local/lib/python3.6/site packages/tensorflow/python/client/session.py”, 第1439行,调用run_metadata_ptr)文件 “/home/naort/.local/lib/python3.6/site packages/tensorflow/python/framework/errors\u impl.py”, 第528行,在出口c_api.TF_GetCode(self.status.status))中 tensorflow.python.framework.errors\u impl.ResourceExhausterRor:OOM 当使用[51344,38,38]形状分配张量并键入float on时 /作业:本地主机/副本:0/任务:0/设备:GPU:0由分配器GPU\U 0\U bfc执行 [{{node training/Adam/gradients/AddN_387-0-TransposeHWCTONCHW-LayoutOptimizer}] 提示:如果您想在OOM发生时查看分配的张量列表, 将报告时差分配添加到当前 分配信息

[{{node Mean}}]]提示:如果您想查看已分配张量的列表 当OOM发生时,在RUNOOPTIONS上添加报告\u张量\u分配\u OOM 获取当前分配信息


尽管EfficientNet模型的参数计数低于比较ResNe(X)t模型,但它们仍然消耗大量GPU内存。您看到的是GPU内存不足错误(RTX 2070为8GB),而不是系统内存不足错误(64GB)

B7型号,尤其是在全分辨率下,超出了您希望使用单个RTX 2070卡进行培训的范围。即使冻结了很多层

在FP16中运行该模型可能会有所帮助,这也将利用RTX卡的TensorCores。从中,尝试以下操作:

import keras.backend as K

dtype='float16'
K.set_floatx(dtype)

# default is 1e-7 which is too small for float16.  Without adjusting the epsilon, we will get NaN predictions because of divide by zero problems
K.set_epsilon(1e-4)