将TF模型权重存储在CPU中?

时间:2017-09-25 17:20:07

标签: python tensorflow deep-learning

我正在尝试将此CNN built for MNIST用于CIFAR10。我修改了结构以适应CIFAR图像的大小(32x32)。该模型在我的GPU上进行训练,但每当我运行测试数据的评估函数(test_eval)时,第一次卷积(hconv1) -

会出现内存不足错误
 ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[10000,32,32,32]
     [[Node: Conv2D = Conv2D[T=DT_FLOAT, data_format="NHWC", padding="SAME", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true, _device="/job:localhost/replica:0/task:0/gpu:0"](Reshape, W_conv1/read/_79)]]

现在我尝试在我的CPU上运行相同的代码(使用export CUDA_VISIBLE_DEVICES=""),test_eval函数成功运行。所以我想也许如果我只在我的CPU上显式存储我的重量变量它可能会起作用。所以我修改了weight_variable函数 -

def weight_variable(self, shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)

def weight_variable(self, shape):
    with tf.device('/cpu:0'):
        initial = tf.Variable(tf.truncated_normal(shape, stddev=0.1))            
    return initial

然而,当我运行test_eval函数时,我仍然收到OOM错误。上面的代码是否实际将变量存储在CPU中?我该如何解决这个问题?

我的GPU是GeForce GTX 950M,2GB。此外,我上面发布的MNIST CNN代码改编自this

1 个答案:

答案 0 :(得分:0)

记忆通常由激活占用。例如,您的第一个转换层的权重为3.2K,但激活时为32x28x28x10000x4 = 1.003GB。接下来是广播添加,因此您需要超过2GB的RAM才能通过第一层。有关分析内存的示例,请参阅this