Tensorflow 虽然网络很小

Tensorflow 虽然网络很小,tensorflow,Tensorflow,操作系统: Ubuntu 16.04 CUDA和cuDNN的安装版本: CUDA 8.0 CuDNN 5.1 TensorFlow v0.12.1 嗨, 我在一个非常小的网络上收到一条OOM消息,运行在2 GTX 1080上。 这是一个两层网络,VGG的前两层,conv1_1,conv1_2。 输入图像是400x400,我正在尝试运行一批大小为16的图像 我的训练是从4个空间位置提取一个特征向量,然后进行一些损失的训练。 例如,在两个VGG conv层之后,我将在每个像素处有一个大小为64的特征

操作系统: Ubuntu 16.04

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

TensorFlow v0.12.1

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

我的训练是从4个空间位置提取一个特征向量,然后进行一些损失的训练。 例如,在两个VGG conv层之后,我将在每个像素处有一个大小为64的特征向量,或者确切地说,一个大小为[16400400,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 形状为[16400400,64][[节点: 梯度/跨步切面/跨步切面/跨步切面= Stratidslicegrad[Index=DT_INT32,T=DT_FLOAT,begin_mask=8, 省略号屏蔽=0,结束屏蔽=8,新屏蔽=0,收缩屏蔽=7, _device=“/job:localhost/replica:0/task:0/gpu:0”](渐变/跨步\u slice\u 84\u grad/Shape, 跨步切片84/堆栈,跨步切片84/堆栈1, 跨步(切片(84)/堆叠(2,渐变/重塑(16)渐变/重塑)]]
[[Node:gradients/conv1\u 1/BiasAdd\u grad/tuple/control\u dependency\u 1/\u 99 =\u Recvclient\u terminated=false,recv\u device=“/job:localhost/replica:0/task:0/cpu:0”, send_device=“/job:localhost/replica:0/task:0/gpu:0”, 发送设备化身=1, tensor_name=“edge_2359_gradients/conv1_1/BiasAdd_grad/tuple/control_dependency_1”, 张量类型=DT浮点数, _device=“/job:localhost/replica:0/task:0/cpu:0”]]


提前感谢您的帮助

你使用了多少张图片?如果是大量图像,即使是一个小型网络也会很快出现内存问题。这不应该是问题所在。我认为我获取这些特征向量的方式使得TensorFlow分配的内存超过了需要的内存。您可以尝试更小的图像并减小批量大小。我想最后一个concat就是把你搞砸的原因。如果在运行此操作之前冻结图形,还可以查看tensorflow是否正在运行时创建任何新节点。