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)