Numpy Keras CNN模型在我尝试训练它时引发了一个记忆问题
我是CNN的新手,我正在尝试使用Keras制作一个基本的猫对狗CNN模型,包括12500张猫和狗的图片,即总共25000张图片。 我目前处理数据的方法如下: 将所有图像转换为128x128大小-->将它们转换为numpy数组-->将所有图像转换为黑白图像-->将它们除以255进行规格化-->使用数据增强-->使用它们训练CNN (如果我们使用彩色图像,会导致内存问题) 这是我尝试训练的模型:Numpy Keras CNN模型在我尝试训练它时引发了一个记忆问题,numpy,keras,deep-learning,jupyter-notebook,cnn,Numpy,Keras,Deep Learning,Jupyter Notebook,Cnn,我是CNN的新手,我正在尝试使用Keras制作一个基本的猫对狗CNN模型,包括12500张猫和狗的图片,即总共25000张图片。 我目前处理数据的方法如下: 将所有图像转换为128x128大小-->将它们转换为numpy数组-->将所有图像转换为黑白图像-->将它们除以255进行规格化-->使用数据增强-->使用它们训练CNN (如果我们使用彩色图像,会导致内存问题) 这是我尝试训练的模型: model = Sequential() model.add(Conv2D(filters = 64,
model = Sequential()
model.add(Conv2D(filters = 64, kernel_size = (5,5),padding = 'Same', activation ='relu', input_shape = (128,128, 1)))
model.add(Conv2D(filters = 64, kernel_size = (5,5),padding = 'Same', activation ='relu'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(filters = 128, kernel_size = (3,3),padding = 'Same', activation ='relu'))
model.add(Conv2D(filters = 128, kernel_size = (3,3),padding = 'Same', activation ='relu'))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(filters = 32, kernel_size = (2,2),padding = 'Same', activation ='relu'))
model.add(Conv2D(filters = 32, kernel_size = (2,2),padding = 'Same', activation ='relu'))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512, activation = "relu"))
model.add(Dropout(0.5))
model.add(Dense(1, activation = "sigmoid"))
optimizer = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)
model.compile(optimizer = optimizer , loss = "binary_crossentropy", metrics=["accuracy"])
learning_rate_reduction = ReduceLROnPlateau(monitor='val_acc', patience=3, verbose=1, factor=0.5, min_lr=0.00001)
但是,每当我尝试开始培训,即调用model.fit\u generator时,它会打印历元(1/30),然后抛出以下错误:
ResourceExhaustedError: 2 root error(s) found.
(0) Resource exhausted: OOM when allocating tensor with shape[86,128,64,64] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
[[{{node conv2d_4/convolution}}]]
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.
[[metrics/accuracy/Identity/_117]]
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.
(1) Resource exhausted: OOM when allocating tensor with shape[86,128,64,64] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
[[{{node conv2d_4/convolution}}]]
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.
0 successful operations.
0 derived errors ignored.
训练停止
我知道它有一些问题与我的电脑内存有关,因为我正试图在我的本地Windows系统上训练它。
我的问题是,我应该怎么做来解决这个问题
我不能进一步降低图像质量,我正在使用黑白图像以减少内存消耗
我的系统内存:
8GB内存,
2GB Nvidia GeForce 940MX图形卡
如果有人需要完整的代码,这里是我完整的python笔记本
另外,当我从keras执行时,它会抛出以下警告。models import Sequential
FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
_np_qint8 = np.dtype([("qint8", np.int8, 1)])
您正在将整个数据集加载到主内存中。如果您需要一个大数据集,这是不可取的,因为您几乎总是会耗尽内存 解决方法是使用TensorFlow的
flow\u from\u directory
方法,该方法允许您在需要时加载批处理,而不是将整个数据集保存在内存中。代码:
train_datagen = ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
'data/train',
target_size=(150, 150),
batch_size=32,
class_mode='binary')
validation_generator = test_datagen.flow_from_directory(
'data/validation',
target_size=(150, 150),
batch_size=32,
class_mode='binary')
model.fit(
train_generator,
steps_per_epoch=2000,
epochs=50,
validation_data=validation_generator,
validation_steps=800)
您的代码将如下所示
train
- cat
- img1
- imgn
- dog
- img1
- imgn
有了它,您可以进行图像增强,也可以加载数据,而无需将其存储在主内存中
有关图像增强选项,请参见
请参阅以获取来自目录选项的流
这里,标签是从目录名推断出来的。
您的目录结构应该如下所示
train
- cat
- img1
- imgn
- dog
- img1
- imgn
是使用上述方法的完整端到端示例的链接
注意:您的每个历元的步骤=样本总数/批次大小
如果仍然出现OOM错误
2 GB不是很多,请将512减少到128或其他。是的,谢谢您提供的信息,它应该对我有用。很抱歉,我目前无法升级它,因为我的声誉不足15。您可以通过单击答案上的复选标记来接受答案。有关更多信息,请参阅。