OOM虽然网络非常小

时间:2017-03-08 14:02:56

标签: tensorflow

操作系统: Ubuntu 16.04

已安装的CUDA和cuDNN版本: CUDA 8.0 CuDNN 5.1

TensorFlow v0.12.1

您好, 我在一个非常小的网络上收到OOM消息,并在2 GTX 1080上运行。 这是一个2层网络,前2层VGG,conv1_1,conv1_2。 输入图像是400x400,我正在尝试运行一批16的大小。

我的训练是从4个空间位置获取特征向量,并对其进行一些训练。 因此,例如,在2个VGG转换层之后,我将在每个像素处具有大小为64的特征向量,或者确切地说,是大小的张量[16,400,400,64]。 我想从4个位置获取这些向量,这意味着我将有4个长度为64的向量,然后计算它们的一些损失函数。

所以这是我的推理功能:

def inference(images, x1, y, x2, z, train=False):
  # conv1_1
  with tf.variable_scope('conv1_1') as scope:
    kernel = _variable_with_weight_decay('weights', shape=[3, 3, 3, 64], wd=0.000, layer_name=scope.name)
    conv = tf.nn.conv2d(images, kernel, [1, 1, 1, 1], padding='SAME')
    biases = _variable_on_cpu('biases', [64], tf.constant_initializer(0.0), layer_name=scope.name)
    conv1_1 = tf.nn.relu(tf.nn.bias_add(conv, biases), name=scope.name)

  # conv1_2
  with tf.variable_scope('conv1_2') as scope:
    kernel = _variable_with_weight_decay('weights', shape=[3, 3, 64, 64], wd=0.000, layer_name=scope.name)
    conv = tf.nn.conv2d(conv1_1, kernel, [1, 1, 1, 1], padding='SAME')
    biases = _variable_on_cpu('biases', [64], tf.constant_initializer(0.0), layer_name=scope.name)
    conv1_2 = tf.nn.relu(tf.nn.bias_add(conv, biases), name=scope.name)

  in1=tf.reshape(conv1_2[0, x1[0][0], x1[0][1], :],[1,64])
  in2=tf.reshape(conv1_2[0, y[0][0], y[0][1], :],[1,64])
  in3=tf.reshape(conv1_2[0, x2[0][0], x2[0][1], :],[1,64])
  in4=tf.reshape(conv1_2[0, z[0][0], z[0][1], :],[1,64])

  for i in range (1, FLAGS.batch_size):
      in1 = tf.concat(0,[in1,tf.reshape(conv1_2[i, x1[i][0], x1[i][1], :],[1,64])])
      in2 = tf.concat(0,[in2,tf.reshape(conv1_2[i, y[i][0], y[i][1], :],[1,64])])
      in3 = tf.concat(0,[in3,tf.reshape(conv1_2[i, x2[i][0], x2[i][1], :],[1,64])])
      in4 = tf.concat(0,[in4,tf.reshape(conv1_2[i, z[i][0], z[i][1], :],[1,64])])

现在,每个in1,in2,in3,in4的大小为[16,64] 从这里开始,我计算了一些损失。 出于某种原因,我收到了一条OOM消息,尽管这是一个非常小的网络。 我想我采用这些特征向量的方式使得工具分配的内存比需要的大。

  

ResourceExhaustedError(参见上面的回溯):分配时的OOM   张量形状[16,400,400,64] [节点:   gradients / strided_slice_84_grad / StridedSliceGrad =   StridedSliceGrad [Index = DT_INT32,T = DT_FLOAT,begin_mask = 8,   ellipsis_mask = 0,end_mask = 8,new_axis_mask = 0,shrink_axis_mask = 7,   _device = “/作业:本地主机/复制:0 /任务:0 / GPU:0”](梯度/ strided_slice_84_grad /形状,   strided_slice_84 / stack,strided_slice_84 / stack_1,   strided_slice_84 / stack_2,gradients / Reshape_16_grad / Reshape)]]
  [[节点:渐变/ conv1_1 / BiasAdd_grad / tuple / control_dependency_1 / _99   = _Recvclient_terminated = false,recv_device =“/ job:localhost / replica:0 / task:0 / cpu:0”,   send_device = “/职业:本地主机/副本:0 /任务:0 / GPU:0”,   send_device_incarnation = 1,   tensor_name = “edge_2359_gradients / conv1_1 / BiasAdd_grad /元组/ control_dependency_1”,   tensor_type = DT_FLOAT,   _device = “/作业:本地主机/复制:0 /任务:0 / CPU:0”]]

提前感谢您的帮助!

0 个答案:

没有答案