构建顺序模型时出现 ResourceExhaustedError

数据挖掘 喀拉斯 回归 图像识别
2022-02-28 03:52:27

我在尝试构建模型时遇到了一个大问题,

input shape: (1447, 224, 224, 3)
output shape: (1447, 154457)

model = Sequential([
        Conv2D(filters=64, kernel_size=(3, 3), activation='relu', padding='valid', input_shape=(224,224,3)),
        BatchNormalization(axis=-1),
        Conv2D(filters=64, kernel_size=(3, 3), activation='relu', padding='valid'),
        BatchNormalization(axis=-1),
        Conv2D(filters=128, kernel_size=(3, 3), activation='relu', padding='valid'),
        BatchNormalization(axis=-1),
        MaxPool2D(pool_size=(2, 2), strides=(2, 1)),
        Conv2D(filters=128, kernel_size=(3, 3), activation='relu', padding='valid'),
        BatchNormalization(axis=-1),
        MaxPool2D(pool_size=(2, 2), strides=(2, 1)),
        Conv2D(filters=128, kernel_size=(3, 3), activation='relu', padding='valid'),
        BatchNormalization(axis=-1),
        MaxPool2D(pool_size=(2, 2), strides=(2, 1)),
        Conv2D(filters=256, kernel_size=(3, 3), activation='relu', padding='valid'),
        BatchNormalization(axis=-1),
        MaxPool2D(pool_size=(2, 2), strides=(2, 1)),
        Conv2D(filters=512, kernel_size=(3, 3), activation='relu', padding='valid'),
        BatchNormalization(axis=-1),
        Conv2D(filters=512, kernel_size=(3, 3), activation='relu', padding='valid', strides=3),
        BatchNormalization(axis=-1),
        Conv2D(filters=512, kernel_size=(3, 3), activation='relu', padding='valid', strides=3),
        AveragePooling2D(pool_size=(6, 1), strides=1, padding='same'),
        ReLU(),
        BatchNormalization(axis=-1),
        Flatten(),
        Dense(154457, activation='relu'),
        Dense(154457)
    ])

我得到以下错误,

ResourceExhaustedError: OOM when allocating tensor with shape[11264,154457] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc [Op:RandomUniform]

这里有什么问题,因为我是神经网络的新手。

2个回答

如错误消息中所述,问题在于您的模型需要比 GPU 更多的内存。请注意,OOM 代表“内存不足”。

需要太多内存的特定层是Dense(154457, activation='relu'). 然而,最后一层更大。

您应该考虑是否真的需要 154457 维的输出。如果您真的需要它,您可能应该采用专门为该场景设计的方法,例如自适应 softmax

另一种选择是使用具有更多内存的 GPU 以适应此模型。

我认为您的 Batch 大小太大 - 1447。尝试像 4 这样的小批量,然后增加它,直到再次出现 OOM 错误。批量大小始终取决于可用 GPU 内存的数量。