相关疑难解决方法(0)

我需要什么K.clear_session()和del model(Keras with Tensorflow-gpu)?

我在做什么
我正在训练和使用卷积神经网络(CNN)进行图像分类,使用Keras和Tensorflow-gpu作为后端.

我正在使用的是什么
- PyCharm Community 2018.1.2
- Python 2.7和3.5(但不是一次)
- Ubuntu 16.04 - Keras
2.2.0
- Tensorflow-GPU 1.8.0作为后端

我想知道的
在许多代码中,我看到人们使用

from keras import backend as K 

# Do some code, e.g. train and save model

K.clear_session()
Run Code Online (Sandbox Code Playgroud)

或使用后删除模型:

del model
Run Code Online (Sandbox Code Playgroud)

keras文档说clear_session:"破坏当前的TF图并创建一个新图.有助于避免旧模型/图层的混乱." - https://keras.io/backend/

这样做有什么意义,我也应该这样做?在加载或创建新模型时,我的模型无论如何都会被覆盖,为什么还要费心呢?

python memory-management keras tensorflow

24
推荐指数
2
解决办法
2万
查看次数

使用“with tf.Session()”的目的?

我正在练习名为 concatenate 的 keras 方法。

在这个例子中使用 with 语句让我想到了这个语句的目的

示例代码如下所示:

import numpy as np 
import keras.backend as K
import tensorflow as tf

t1 = K.variable(np.array([ [[1, 2], [2, 3]], [[4, 4], [5, 3]]]))
t2 = K.variable(np.array([[[7, 4], [8, 4]], [[2, 10], [15, 11]]]))

d0 = K.concatenate([t1 , t2] , axis=-2)

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    print(sess.run(d0))
Run Code Online (Sandbox Code Playgroud)

然后我检查文档:tensorflow 并说:

会话可能拥有资源,例如 tf.Variable、tf.QueueBase 和 tf.ReaderBase。当不再需要这些资源时,释放这些资源很重要。为此,请在会话上调用 tf.Session.close 方法,或将会话用作上下文管理器。

我相信这已经解释了所有这些,但有人可以给我更直观的解释。

提前致谢,祝您有美好的一天!

python with-statement tensorflow

10
推荐指数
2
解决办法
2万
查看次数

使用 model.predict() 时的 Tensorflow Keras 模型 OOM,尽管使用 model.fit() 的训练运行没有问题

我正在使用 tf.keras 训练图像分割模型,使用自定义数据生成器来读取和增强图像。虽然训练模型工作正常(即没有内存问题),但当尝试在我的测试集上预测时,我的 GPU(8GB,稍后参见 nvidia-smi)会耗尽内存。无论是在训练后直接预测还是在重新启动内核后、使用model.load_weights()和使用model.predict()之后加载模型以及使用训练中使用的相同批处理大小(4,在训练期间使用约 6GB 内存)或批处理大小为 1 的情况下,都是这种情况两个批量大小都尝试分配超过 8GB。

在训练期间,内存使用量稳定在 6GB 左右,但在使用时,model.predict()它开始时约为 6GB,但在抛出之前大约 10 秒后跳至 8GB ResourceExhaustedError(请参阅稍后的堆栈跟踪)。这对我来说似乎非常违反直觉,而且我通过谷歌找到的提示(例如重新启动python,从权重加载模型,然后预测释放事先使用的内存)还没有起作用,所以任何帮助都会很棒。

我的数据生成器和训练/预测代码(包括错误消息)的输出!nvidia-smi如下:

英伟达-SMI

Mon Aug  9 14:27:29 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 471.11       Driver Version: 471.11       CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce …
Run Code Online (Sandbox Code Playgroud)

python machine-learning out-of-memory keras tensorflow

6
推荐指数
0
解决办法
1821
查看次数

Keras使用tf.data.Dataset而不是numpy数组预测循环内存泄漏

predict当使用a tf.data.Dataset来馈送模型时,在遍历Keras模型函数时会遇到内存泄漏并降低性能,但是在用numpy数组馈入模型时却不会。

有谁了解导致此问题的原因和/或如何解决此问题?

最小的可复制代码段(可复制/粘贴可运行):

import tensorflow as tf
import numpy as np
import time

SIZE = 5000

inp = tf.keras.layers.Input(shape=(SIZE,), dtype='float32')
x = tf.keras.layers.Dense(units=SIZE)(inp)

model = tf.keras.Model(inputs=inp, outputs=x)

np_data = np.random.rand(1, SIZE)
ds = tf.data.Dataset.from_tensor_slices(np_data).batch(1).repeat()

debug_time = time.time()
while True:
    model.predict(x=ds, steps=1)
    print('Processing {:.2f}'.format(time.time() - debug_time))
    debug_time = time.time()
Run Code Online (Sandbox Code Playgroud)

结果:预测循环定时从每次迭代开始约0.04s,在一两分钟之内达到约0.5s,并且过程内存从几百MB继续增加到接近GB。


交换出tf.data.Dataset一个等效的numpy数组,运行时间始终为〜0.01s。

工作案例代码段(可复制/粘贴可运行):

import tensorflow as tf
import numpy as np
import time

SIZE = 5000

inp = tf.keras.layers.Input(shape=(SIZE,), dtype='float32')
x = tf.keras.layers.Dense(units=SIZE)(inp)

model = tf.keras.Model(inputs=inp, …
Run Code Online (Sandbox Code Playgroud)

python keras tensorflow

5
推荐指数
1
解决办法
300
查看次数