我创建了一个初始化keras.models.Sequential模型的包装类,它有几种启动培训过程和监控进度的方法.我在我的main文件中实例化这个类并执行培训过程.相当普通的东西.
我的问题是:
如何释放所有分配的GPU内存tensorflow.我试了以下没有运气:
import keras.backend.tensorflow_backend as K
with K.get_session() as sess:
K.set_session(sess)
import tensorflow as tf
from neural_net import NeuralNet
with tf.device('/gpu:0'):
nn = NeuralNet('config', train_db_path, test_db_path)
nn.train(1000, 1)
print 'Done'
K._SESSION.close()
K.set_session(None)
Run Code Online (Sandbox Code Playgroud)
即使会话已关闭并重置为None,nvidia-smi也不会反映内存使用量的任何减少.有任何想法吗?
理念
将__exit__方法添加到我的NeuralNet类并将其实例化为:
with NeuralNet() as nn:
nn.train(1000, 1)
Run Code Online (Sandbox Code Playgroud)
我应该如何在这种方法中释放keras模型的资源?
测试环境
我在带有3个GTX 960 GPU的Ubuntu 14.04上使用iPython Notebook.
参考:
我正在实现这里概述的纹理合成算法.为此,我需要计算平方差的和,这是一个度量,用于估计template不同位置之间的误差image.我的工作实施缓慢如下:
total_weight = valid_mask.sum()
for i in xrange(input_image.shape[0]):
for j in xrange(input_image.shape[1]):
sample = image[i:i + window, j:j + window]
dist = (template - sample) ** 2
ssd[i, j] = (dist * valid_mask).sum() / total_weight
Run Code Online (Sandbox Code Playgroud)
这里,total_weight只是为了规范化.有些像素的强度未知,因此我用它valid_mask来掩盖它们.这个嵌套循环位于2个循环内部,因此这是4个嵌套循环,这显然是性能杀手!
有没有办法让我在NumPy或Python中更快,这个嵌套循环的替代品?矢量化是可能的吗?我需要在上班(3, 3)的部分image用(3,3)的template.
我随后将在Cython中实现这一点,所以我可以更快地使用NumPy工作,更好的是.
你可以在这里找到完整的代码.第62-67行引用了这里.
谢谢,
Chintak