如何在训练模型时修复内存错误?

Posted

技术标签:

【中文标题】如何在训练模型时修复内存错误?【英文标题】:How to fix Memory Error while training model? 【发布时间】:2022-01-05 08:51:56 【问题描述】:

我最近一直在研究神经网络,但每次我尝试编译模型时,我都会得到一个 SIGKILL,通过查看 Activity Monitor,它来自内存错误。我的数据非常大,但这不是问题的一部分,因为我尝试提取其中的一小部分,但仍然遇到相同的错误。这是我正在使用的代码:

f = gzip.GzipFile('Data_x.npy.gz', "r")
datax = np.load(f)[:5, :, :]
f.close()
f = gzip.GzipFile('Data_y.npy.gz', "r")
datay = np.load(f)[:5, :, :]

f.close()
f = None
model = Sequential(
    [
        #Conv1D(32, 3, input_shape=datax.shape, activation="relu"),
        Flatten(input_shape=datax.shape),
        Dense(750, activation='relu'),
        Dense(750, activation='relu'),
        Dense(2, activation='sigmoid')
    ]
)
model.compile(optimizer=Adam(learning_rate=0.1), loss="binary_crossentropy", metrics=['accuracy'])
model1 = model.fit(x=datax, y=datay, batch_size=5, epochs=5, shuffle=True, verbose=2)

我已经为模型尝试了许多不同的结构和不同的批量大小/时期,但我仍然收到此错误。非常感谢您对此事的任何帮助。

【问题讨论】:

嗨,Kookies,究竟是什么错误? @FaisalShahbaz 我得到了 SIGKILL,经过进一步研究后,我要么停止了程序,要么发现使用了太多内存 【参考方案1】:

您在模型中添加 dropout 层。

Dropout 是一种在训练期间忽略随机选择的神经元的技术。他们是随机“辍学”的。这意味着它们对下游神经元激活的贡献在前向传递中被暂时移除,并且任何权重更新都不会应用于后向传递中的神经元。

model = Sequential(
    [
        #Conv1D(32, 3, input_shape=datax.shape, activation="relu"),
        Flatten(input_shape=datax.shape),
        Dense(750, activation='relu'),
        Dropout(0.2),
        Dense(750, activation='relu'),
        Dropout(0.2),
        Dense(2, activation='sigmoid')
    ]

【讨论】:

以上是关于如何在训练模型时修复内存错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 tensorflow 中的“ValueError:空训练数据”错误

执行 scikit-learn 剪影分数时如何修复内存错误?

keras上的多GPU训练错误(OOM)(足够的内存,可能是配置问题)

如何修复“致命错误:堆限制附近的无效标记压缩分配失败 - JavaScript 堆内存不足”错误

你正在使用GPU进行CNN类模型训练,突然发生了内存溢出的错误,你可以通过哪些方式来进行解决?

Keras 模型训练内存泄漏