我正在尝试将此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
答案 0 :(得分:0)
记忆通常由激活占用。例如,您的第一个转换层的权重为3.2K,但激活时为32x28x28x10000x4 = 1.003GB。接下来是广播添加,因此您需要超过2GB的RAM才能通过第一层。有关分析内存的示例,请参阅this