【问题标题】:Why does Python crash at exactly the same point when training several Keras NNs?为什么 Python 在训练多个 Keras NN 时会在完全相同的时间点崩溃?
【发布时间】:2020-04-19 14:11:09
【问题描述】:

我正在尝试在时间序列数据集上训练 LSTM NN,该数据集包含超过一千个不同的设备,并通过每日观察来预测设备何时会出现故障。我已经适当地处理了我的数据清理和设置,并且可以成功地在数据上训练一个神经网络。

现在,我想对 NN 进行多次训练迭代,每次迭代都使用不同的超参数,以便为数据找到最佳的训练参数集。在这样做时,我遇到了一个非常奇怪的错误。当我训练 NN 的迭代时,我能够通过 正好 13 个 NN,然后我的程序被杀死。在终端中运行时,我只会收到一条消息,上面写着 Killed,而在控制台(Pycharm)中运行时,我会收到一条 process completed with exit code 1 消息。我不认为问题出在内存不足,因为我在控制台中运行时保持堆大小监视器处于开启状态,并且我没有接近最大值。考虑到我随机选择超参数(所以我每次运行程序时都不会运行相同的 13 个 NN),我每次运行第 13 次都会失败似乎也不仅仅是巧合。

有人对我可以从哪里开始解决此问题有任何建议吗?

谢谢。

函数 I 循环训练后续 NN:

    lrate = round(10 ** (-4 * random.uniform(0, 1)), 3)  # 10e-4 to 10
    decay_rate = round(10 ** (-4 * random.uniform(0, 1)), 3)
    epochs_ = random.randint(25, 250)
    batches = random.randint(8, 64)
    l2_rate = round(10 ** (-4 * random.uniform(0, 1)), 3)
    dropout_rate = round(random.uniform(0.1, 0.5), 3)
    record_params = {'hidden_layers': hidden_layers, 'lrate': lrate, 'decay_rate': decay_rate, 'epochs': epochs_,
                     'batches': batches, 'l2_rate': l2_rate, 'dropout_rate': dropout_rate}

    model = Sequential()
    model_input_shape = X_train_input.shape[1:]
    model.add(LSTM(hidden_layers, input_shape=model_input_shape, return_sequences=True,
                   kernel_regularizer=regularizers.l2(l2_rate),
                   activation=activation_func))  # return_sequences=True,
    model.add(Dropout(dropout_rate))
    model.add(BatchNormalization())
    model.add(LSTM(hidden_layers, kernel_regularizer=regularizers.l2(l2_rate),
                   activation=activation_func))  # return_sequences=True,
    model.add(Dropout(dropout_rate))
    model.add(BatchNormalization())
    model.add(Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy', optimizer=optimizers.Adam(lr=lrate, decay=decay_rate),
                  metrics=[metrics.AUC(), metrics.FalseNegatives(), metrics.FalsePositives()])
    model.fit(X_train_input, y_train_input2, batch_size=batches, epochs=epochs_,
                        validation_data=(X_val_input, y_val_input2), verbose=1,
                        shuffle=False, callbacks=[EarlyStopping(monitor='val_loss', patience=15)]
                        )

    # test
    yhat = model.predict(X_train_input, batch_size=batches)
    yhat_val = model.predict(X_val_input, batch_size=batches)

    # record
    record_params['train_roc'] = round(roc_auc_score(y_train_input2, yhat.reshape(yhat.shape[0])), 3)
    record_params['val_roc'] = round(roc_auc_score(y_val_input2, yhat_val.reshape(yhat_val.shape[0]),
                                                   average='weighted'), 3)


    return pd.DataFrame(record_params, index=[ind]) ```



[Does not seem like a memory issue - this screenshotted during 5th NN run. ][1]


  [1]: https://i.stack.imgur.com/Rb9GL.png

【问题讨论】:

    标签: python tensorflow memory keras pycharm


    【解决方案1】:

    如果您使用的参数是随机的,那么在 13 处的 Stpping 很奇怪。你说这不是记忆问题,但我最近与 Keras 合作,我看到我的电脑磨得很厉害。你说这是整个for 循环?它在最后返回一个 DataFrame。如果循环要继续运行,这个 df 保存在哪里?也许粘贴整个函数。

    我的猜测是返回 DataFrame 可能是问题之一。您可以尝试将结果输出到文件吗?另外,我建议不要在一个函数中定义、编译、拟合和测试模型。这是一个超载!

    • 要定义一个函数。
    • 一个函数来编译和拟合。
    • 一个要测试的函数。
    • 测试输出进入文件(txt、csv、json 等)

    【讨论】:

    • 有没有比只在控制台中查看堆更有效的方法来监控我的内存使用情况?看起来人们使用像 Guppy 这样的东西,但我对此没有太多经验。有没有推荐的资源我可以查看?非常感谢。
    猜你喜欢
    • 2020-10-24
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多