运行训练 2 个模型后,keras 退出代码 -1073741819 (0xC0000005)

Posted

技术标签:

【中文标题】运行训练 2 个模型后,keras 退出代码 -1073741819 (0xC0000005)【英文标题】:keras exit code -1073741819 (0xC0000005) after running training 2 models 【发布时间】:2018-07-20 10:23:15 【问题描述】:

我使用 Pycharm 运行我的脚本。 我有一个循环的脚本。每个循环: 1. 选择一个数据集。 2. 训练一个新的 Keras 模型。 3. 评估该模型。

所以代码可以完美运行 2 周,但是在安装新的 anaconda 环境时,代码在循环两次迭代后突然失败。

Siamese Neural Network 的两个模型在第三次循环之前训练得非常好,它崩溃了,进程结束,退出代码为 -1073741819 (0xC0000005)。

 1/32 [..............................] - ETA: 0s - loss: 0.5075
12/32 [==========>...................] - ETA: 0s - loss: 0.5112
27/32 [========================>.....] - ETA: 0s - loss: 0.4700
32/32 [==============================] - 0s 4ms/step - loss: 0.4805
eval run time : 0.046851396560668945

For LOOCV run 2 out of 32. Model is SNN. Time taken for instance = 6.077638149261475
Post-training results: 
acc = 1.0 , ce = 0.6019332906978302 , f1 score = 1.0 , mcc = 0.0
cm = 
[[1]]
####################################################################################################

Process finished with exit code -1073741819 (0xC0000005)

奇怪的是,以前的代码运行得非常好,即使我不使用 anaconda 环境并使用我以前使用的环境,它仍然以相同的退出代码退出。

当我使用另一种类型的模型(密集神经网络)时,它也会崩溃,但在 4 次迭代之后。和内存不足有关吗?这是循环的一个例子。确切的模型无关紧要,它总是在火车模型线(点 2 和 3 之间)经过一定次数的循环后崩溃

 # Run k model instance to perform skf
    predicted_labels_store = []
    acc_store = []
    ce_store = []
    f1s_store = []
    mcc_store = []
    folds = []
    val_features_c = []
    val_labels = []
    for fold, fl_tuple in enumerate(fl_store):
        instance_start = time.time()
        (ss_fl, i_ss_fl) = fl_tuple  # ss_fl is training fl, i_ss_fl is validation fl
        if model_mode == 'SNN':
            # Run SNN
            model = SNN(hparams, ss_fl.features_c_dim)
            loader = Siamese_loader(model.siamese_net, ss_fl, hparams)
            loader.train(loader.hparams.get('epochs', 100), loader.hparams.get('batch_size', 32),
                         verbose=loader.hparams.get('verbose', 1))
            predicted_labels, acc, ce, cm, f1s, mcc = loader.eval(i_ss_fl)
            predicted_labels_store.extend(predicted_labels)
            acc_store.append(acc)
            ce_store.append(ce)
            f1s_store.append(f1s)
            mcc_store.append(mcc)
        elif model_mode == 'cDNN':
            # Run DNN
            print('Point 1')
            model = DNN_classifer(hparams, ss_fl)
            print('Point 2')
            model.train_model(ss_fl)
            print('Point 3')
            predicted_labels, acc, ce, cm, f1s, mcc = model.eval(i_ss_fl)
            predicted_labels_store.extend(predicted_labels)
            acc_store.append(acc)
            ce_store.append(ce)
            f1s_store.append(f1s)
            mcc_store.append(mcc)
        del model
        K.clear_session()
        instance_end = time.time()
        if cv_mode == 'skf':
            print('\nFor k-fold run  out of . Model is . Time taken for instance = \n'
                  'Post-training results: \nacc =  , ce =  , f1 score =  , mcc = \ncm = \n\n'
                  '####################################################################################################'
                  .format(fold + 1, k_folds, model_mode, instance_end - instance_start, acc, ce, f1s, mcc, cm))
        else:
            print('\nFor LOOCV run  out of . Model is . Time taken for instance = \n'
                  'Post-training results: \nacc =  , ce =  , f1 score =  , mcc = \ncm = \n\n'
                  '####################################################################################################'
                  .format(fold + 1, fl.count, model_mode, instance_end - instance_start, acc, ce, f1s, mcc, cm))
        # Preparing output dataframe that consists of all the validation dataset and its predicted labels
        folds.extend([fold] * i_ss_fl.count)  # Make a col that contains the fold number for each example
        val_features_c = np.concatenate((val_features_c, i_ss_fl.features_c_a),
                                        axis=0) if val_features_c != [] else i_ss_fl.features_c_a
        val_labels.extend(i_ss_fl.labels)
        K.clear_session()

以及密集神经网络的退出代码。

For LOOCV run 4 out of 32. Model is cDNN. Time taken for instance = 0.7919328212738037
Post-training results: 
acc = 0.0 , ce = 0.7419472336769104 , f1 score = 0.0 , mcc = 0.0
cm = 
[[0 1]
 [0 0]]
####################################################################################################
Point 1
Point 2

Process finished with exit code -1073741819 (0xC0000005)

非常感谢您的帮助!

【问题讨论】:

我引用:The most typical causes for the ‘0xC0000005: Access Violation’ error are: corrupt registry, malware, faulty RAM or device driver, incorrectly written, installed or updated software or even Windows security features. 更具体到您的问题,当程序尝试访问已分配给另一个进程且不适用于该进程的内存时,您将收到错误并且程序将被终止。 那我该怎么办?我不知道为什么这个问题会在一天前正常工作时突然弹出:( 您能否在创建 DNN 时编辑您的问题以包含 for 循环的行? 好的,我添加了完整的循环。模式是 SNN 还是 cDNN 都没有关系。另外,我还有另一个与此类似但略有不同的脚本,它也具有相同的退出代码:( 另外,我重新安装了python、pycharm、anaconda3和所有的包,问题还是出现了…… 【参考方案1】:

以下是我在 cmets 中建议的内容的解释,以防万一有人遇到同样的问题。

为 keras 手动设置会话,而不是在每个循环开始时使用默认会话。

sess = tf.Session()  
K.set_session(sess) 
#..... train your model
K.clear_session()

删除loader 变量,因为该对象必须引用原始model 对象,因为我可以看到您正在调用train()

在每次循环后使用gc.collect() 删除这些变量来显式收集释放的所有内存,以便我们有足够的内存来构建新模型。

因此,要点是在这样的循环中运行多个独立模型时,请确保您已明确设置 tensorflow 会话,以便您可以在循环完成后清除此会话,释放此会话使用的所有资源。删除该循环中可能与 tensorflow 对象相关的所有引用并收集空闲内存。

【讨论】:

非常感谢您的帮助!但是,您知道如何为我的 python/pycharm 添加更多可用内存吗?因为我的笔记本电脑有 16gb 内存,当我检查任务管理器时,脚本运行时它不超过 1.3gb 内存。那么为什么内存会耗尽呢? @LimKaizhuo 这个问题可能不是因为你的内存不足以容纳一个模型。但是因为如果我们用外行的话来说,该程序在释放内存之前正在使用分配给另一个模型内部的一个模型的内存。但我不确定考虑到您使用的是 Windows 和 PyCharm,为什么任务管理器显示总内存使用量仅为 1.3 GB。

以上是关于运行训练 2 个模型后,keras 退出代码 -1073741819 (0xC0000005)的主要内容,如果未能解决你的问题,请参考以下文章

keras使用多进程

Keras:如何保存模型并继续训练?

训练后使用量化权重进行 keras 模型评估

在 keras 中使用批量标准化进行微调

加载相同的保存模型后,Keras 模型精度有所不同

如果我将层传递给两个 Keras 模型并且只训练一个模型,那么在前者训练后两个模型会共享权重吗