我在做什么
我正在训练和使用卷积神经网络(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/
这样做有什么意义,我也应该这样做?在加载或创建新模型时,我的模型无论如何都会被覆盖,为什么还要费心呢?
我正在练习名为 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 方法,或将会话用作上下文管理器。
我相信这已经解释了所有这些,但有人可以给我更直观的解释。
提前致谢,祝您有美好的一天!
我正在使用 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如下:
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) 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)