Keras模型训练内存泄漏

2023-11-26

我是 Keras、Tensorflow、Python 的新手,我正在尝试构建一个供个人使用/未来学习的模型。我刚刚开始使用 python,并想出了这段代码(在视频和教程的帮助下)。我的问题是,我的 Python 内存使用量在每个时期甚至在构建新模型之后都在慢慢增加。一旦内存达到 100%,训练就会停止,不会出现错误/警告。我知道的不多,但问题应该出在循环内的某个地方(如果我没记错的话)。我知道关于

k.clear.session()

但问题要么没有消除,要么我不知道如何将其集成到我的代码中。 我有: Python 版本 3.6.4, Tensorflow 2.0.0rc1(CPU版本), 喀拉斯2.3.0

这是我的代码:

import pandas as pd
import os
import time
import tensorflow as tf
import numpy as np
import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, LSTM, BatchNormalization
from tensorflow.keras.callbacks import TensorBoard, ModelCheckpoint

EPOCHS = 25
BATCH_SIZE = 32           

df = pd.read_csv("EntryData.csv", names=['1SH5', '1SHA', '1SA5', '1SAA', '1WH5', '1WHA',
                                         '2SA5', '2SAA', '2SH5', '2SHA', '2WA5', '2WAA',
                                         '3R1', '3R2', '3R3', '3R4', '3R5', '3R6',
                                         'Target'])

df_val = 14554 

validation_df = df[df.index > df_val]
df = df[df.index <= df_val]

train_x = df.drop(columns=['Target'])
train_y = df[['Target']]
validation_x = validation_df.drop(columns=['Target'])
validation_y = validation_df[['Target']]

train_x = np.asarray(train_x)
train_y = np.asarray(train_y)
validation_x = np.asarray(validation_x)
validation_y = np.asarray(validation_y)

train_x = train_x.reshape(train_x.shape[0], 1, train_x.shape[1])
validation_x = validation_x.reshape(validation_x.shape[0], 1, validation_x.shape[1])

dense_layers = [0, 1, 2]
layer_sizes = [32, 64, 128]
conv_layers = [1, 2, 3]

for dense_layer in dense_layers:
    for layer_size in layer_sizes:
        for conv_layer in conv_layers:
            NAME = "{}-conv-{}-nodes-{}-dense-{}".format(conv_layer, layer_size, 
                    dense_layer, int(time.time()))
            tensorboard = TensorBoard(log_dir="logs\{}".format(NAME))
            print(NAME)

            model = Sequential()
            model.add(LSTM(layer_size, input_shape=(train_x.shape[1:]), 
                                       return_sequences=True))
            model.add(Dropout(0.2))
            model.add(BatchNormalization())

            for l in range(conv_layer-1):
                model.add(LSTM(layer_size, return_sequences=True))
                model.add(Dropout(0.1))
                model.add(BatchNormalization())

            for l in range(dense_layer):
                model.add(Dense(layer_size, activation='relu'))
                model.add(Dropout(0.2))

            model.add(Dense(2, activation='softmax'))

            opt = tf.keras.optimizers.Adam(lr=0.001, decay=1e-6)

            # Compile model
            model.compile(loss='sparse_categorical_crossentropy',
                          optimizer=opt,
                          metrics=['accuracy'])

            # unique file name that will include the epoch 
            # and the validation acc for that epoch
            filepath = "RNN_Final.{epoch:02d}-{val_accuracy:.3f}"  
            checkpoint = ModelCheckpoint("models\{}.model".format(filepath, 
                         monitor='val_acc', verbose=0, save_best_only=True, 
                         mode='max')) # saves only the best ones

            # Train model
            history = model.fit(
                train_x, train_y,
                batch_size=BATCH_SIZE,
                epochs=EPOCHS,
                validation_data=(validation_x, validation_y),
                callbacks=[tensorboard, checkpoint])

# Score model
score = model.evaluate(validation_x, validation_y, verbose=2)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
# Save model
model.save("models\{}".format(NAME))

另外我不知道是否可以在 1 个问题中提出 2 个问题(我不想在这里用我的问题来垃圾邮件,任何有 python 经验的人都可以在一分钟内解决),但我也有问题检查点保存。我只想保存性能最佳的模型(每 1 个 NN 规范 1 个模型 - 节点/层数),但目前它是在每个 epoch 后保存的。如果这样问不合适,我可以为此创建另一个问题。

非常感谢您的帮助。


问题的根源之一是,一个新的循环model = Sequential() does not删除以前的模型;它仍然是在其 TensorFlow 图范围内构建的,并且每个新的model = Sequential()添加了另一个最终会溢出内存的挥之不去的结构。为了确保模型被正确地完全销毁,请在完成模型后运行以下命令:

import gc
del model
gc.collect()
K.clear_session()
tf.compat.v1.reset_default_graph() # TF graph isn't same as Keras graph

gc是Python的垃圾收集模块,它清除残留的痕迹model after del. K.clear_session()是主要调用,并清除 TensorFlow 图。

另外,虽然你关于模型检查点、日志记录和超参数搜索的想法非常合理,但执行起来却很错误;你实际上只会测试one您在那里设置的整个嵌套循环的超参数组合。但这应该在一个单独的问题中提出。


UPDATE:刚刚在完全正确设置的环境中遇到了同样的问题;最可能的结论是,这是一个错误 - 而罪魁祸首是热切的执行力。要解决此问题,请使用

tf.compat.v1.disable_eager_execution() # right after `import tensorflow as tf`

切换到图形模式,也可以运行明显更快。另请参阅上面更新的清晰代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Keras模型训练内存泄漏 的相关文章

随机推荐

  • 使用 Java EE 6 将 EJB 注入域对象

    如何使用 Java EE 6 将 EJB 注入域对象 JPA 实体 在 Java EE 6 中 CDI 将托管组件的概念扩展到任何事物 并且可以将 EJB 注入到 CDI 托管 bean 中 使用 Inject注解 但是 虽然已经考虑了 J
  • std::aligned_storage 的 static_cast 和 reinterpret_cast

    有人可以解释一下关于投射的代码吗http en cppreference com w cpp types aligned storage please 可以用下面的代码 return static cast
  • Firestore 不保存文本区域中的换行符

    我正在使用带有 Vue v model 的文本区域并将其保存在 firestore 集合中 但换行符在数据库中消失了 如何解决 div class form group div
  • 从 m 大小的列索引向量创建一个由 0 和 1 组成的 m × n 矩阵

    我有一个m整数维向量 范围从 1 到n 这些整数是列索引m n matrix 我想创建一个m n由 0 和 1 组成的矩阵 其中m 第 行 指定的列中有一个 1m我的向量中的第一个值 Example my vector 3 dimensio
  • 为什么 CoUninitialize 会导致退出时出错?

    我正在开发一个 C 应用程序来从 Excel 文件中读取一些数据 我已经成功了 但我对其中一部分感到困惑 这是代码 简化为仅读取第一个单元格 Mostly copied from http www codeproject com KB wt
  • 在windows C中加载dll进行跨平台设计

    我写了一个为linux平台设计的c代码 现在 我想让它跨平台 以便也可以在 Windows 中使用 在我的代码中 我 dlopen 一个 so 文件并利用其中的函数 下面是我的代码的样子 但我刚刚发现 在windows中 加载和使用动态库的
  • 关于HotSpot的动态反优化

    我在读 深入Scala 这本书的时候 提到HotSpot编译器有几个重要的特性 其中之一就是 动态去优化 它是确定优化是否有效的能力not 事实上 提高性能并撤消该优化 允许应用其他优化 看来HotSpot会尝试各种 优化 并选择其中最好的
  • 空闲和蟒蛇

    我曾经有过idle 然后我下载了Anaconda并通过那里闲置地打开 我已经有一段时间没有使用idle了 但最近才去打开它并再次使用它 然而 我的计算机似乎不再空闲 据我了解 我仍然可以通过 Anaconda 空闲 但我忘记了如何操作 有没
  • 如何在WebBrowser控件中注入Javascript?

    我试过这个 string newScript textBox1 Text HtmlElement head browserCtrl Document GetElementsByTagName head 0 HtmlElement scrip
  • 为什么 Android 中不提供大于 SECONDS 的 Java.util.concurrent.TimeUnit 类型?

    I miss MINUTES HOURS DAYS 存在于文档自 API 级别 1 起 我使用应用程序的第 7 或 2 1 版本 我读过了这个问题 其中也指出了这个失误 尽管 它不在问题本身中 但作为解决方案 仅提出了自己的计算 我并不懒惰
  • 使用 .htaccess 与 php5.4 内置服务器

    在我的开发环境中 我使用php5 4的web内置Web服务器 但似乎 htaccess无法正常工作 我找不到该服务器的文档 有人可以告诉我是否可以像apache一样使用htaccess和mod rewrite 非常感谢 正如我的评论中提到的
  • 站点匹配查询不存在

    该网站运行良好 直到我在应用程序上单击 注销 之后 该网站会给我这个错误 不存在于 login 站点匹配查询不存在 我到处搜索 得到的唯一解决方案与设置站点框架 SITE ID 等有关 我认为我计算机上的这些项目都很好 但我找不到演练 指南
  • 如何从 Hex NSString 获取十进制 int

    我想从十六进制编码的字符串中获取十进制值 例如 A gt 10 B gt 11 等 我编码如下 NSString tempNumber tempNumber number text NSScanner scanner NSScanner s
  • 如何通过curl发布数组值?

    我喜欢测试一个 API 后端 其设计如下例所示 http localhost 3000 api v1 shops 1 json JSON 响应 id 1 name Supermarket products fruit eggs 这是对应的模
  • 为什么在 JavaScript 中使用 getter 和 setter?

    我知道 JavaScript 中的 getter 和 setter 是如何工作的 我不明白的是 当我们可以使用普通函数得到相同的结果时 为什么我们需要它们 考虑以下代码 var person firstName Jimmy lastName
  • 如何在 django 中集成 Foundation 5

    我想开始在 django 项目中使用 Foundation 5 我的疑问是如何设置 Foundation 项目的文件夹 Foundation 现在使用 Bower 来处理 js 依赖项 我认为将 Foundation 5 设置到 djang
  • 如何在使用较少内存的情况下在单列中存储多个值?

    我有一张桌子users其中 1 列存储用户的 角色 我们可以分配多重角色给特定用户 然后我想将角色 ID 存储在 角色 列中 但是如何才能以易于使用的方式将多个值存储到单个列中以节省内存呢 例如 使用逗号分隔字段进行存储并不容易并且会占用内
  • 这段嵌套 for 循环反复将计数器加倍的代码的复杂性是多少?

    在书里编程面试曝光它说下面的程序的复杂度是 O N 但我不明白这是怎么可能的 有人可以解释这是为什么吗 int var 2 for int i 0 i lt N i for int j i 1 j lt N j 2 var var 你需要一
  • PIL 解码器 jpeg 在 ubuntu x64 上不可用,

    我知道这个问题看起来像是重复的 但我遵循了许多有关如何正确安装 PIL 的在线说明 但没有一个起作用 我已经尝试了一切 Python 图像库失败并显示消息 解码器 JPEG 不可用 PIL没有成功 当我运行 sudo pip install
  • Keras模型训练内存泄漏

    我是 Keras Tensorflow Python 的新手 我正在尝试构建一个供个人使用 未来学习的模型 我刚刚开始使用 python 并想出了这段代码 在视频和教程的帮助下 我的问题是 我的 Python 内存使用量在每个时期甚至在构建