Tensorflow错误:"无法解析proto"

时间:2017-10-25 20:44:49

标签: python tensorflow deep-learning conv-neural-network

我正在创建一个带有tensorflow的深度CNN。我已经创建了这个架构,现在我正处于培训过程中。当我开始训练模型时,我使用命令:

sess.run(tf.global_variables_initializer())

调用此命令时,我收到下面的错误。我的直觉告诉我,张量形状可能太大而无法解析/初始化。我已经研究过这个错误,似乎在网上很少有文档。 此错误是否提供足够的信息来说明问题所在?谢谢。

2017-10-25 15:07:54.252194: W C:\tf_jenkins\home\workspace\rel-
win\M\windows\PY\35\tensorflow\core\framework\op_kernel.cc:1182] Invalid 
argument: Cannot parse tensor from proto: dtype: DT_FLOAT
tensor_shape {
  dim {
    size: 16
  }
  dim {
    size: 16
  }
  dim {
    size: 7
  }
  dim {
    size: 3298
  }
  dim {
    size: 3298
  }
}
float_val: 0

2017-10-25 15:07:54.252767: E C:\tf_jenkins\home\workspace\rel-
win\M\windows\PY\35\tensorflow\core\common_runtime\executor.cc:644] Executor 
failed to create kernel. Invalid argument: Cannot parse tensor from proto: 
dtype: DT_FLOAT
tensor_shape {
  dim {
    size: 16
  }
  dim {
    size: 16
  }
  dim {
    size: 7
  }
  dim {
    size: 3298
  }
  dim {
    size: 3298
  }
}
float_val: 0

         [[Node: Variable_737/Adam_1/Initializer/zeros = Const[_class=
["loc:@Variable_737"], dtype=DT_FLOAT, value=<Invalid TensorProto: dtype: 
DT_FLOAT tensor_shape { dim { size: 16 } dim { size: 16 } dim { size: 7 } 
dim { size: 3298 } dim { size: 3298 } } float_val: 0>, 
_device="/job:localhost/replica:0/task:0/cpu:0"]()]]
2017-10-25 15:07:54.320979: W C:\tf_jenkins\home\workspace\rel-
win\M\windows\PY\35\tensorflow\core\framework\op_kernel.cc:1182] Invalid 
argument: Cannot parse tensor from proto: dtype: DT_FLOAT
tensor_shape {
  dim {
    size: 16
  }
  dim {
    size: 16
  }
  dim {
    size: 7
  }
  dim {
    size: 3298
  }
  dim {
    size: 3298
  }
}
float_val: 0

3 个答案:

答案 0 :(得分:7)

正如@Tarun Wadhwa所说,tensorflow不允许尺寸为&gt;的张量。单个设备上2 GB。如果你使用dtype='tf.float32',你的张量大小(19 x 10 ^ 9个条目)x 4个字节= 78 GB

首先,您可以尝试使用'tf.float16'。这会使RAM上的张量大小减半。 (它还会给重量增加一些噪音,这将产生正常化效果 - 这是一件好事)。您也可以尝试在卷积图层中增加stride参数。

但是你仍然不会达到2 GB的允许限制。在这种情况下,您应该将计算图分布在多个GPU上并在那里训练模型。您必须使用with tf.device语句重新构建代码,这是一个全新的游戏。 AWS在其EC2上提供8个和16个GPU p2实例。

为什么你需要使用如此庞大的张量?

答案 1 :(得分:4)

您无法创建尺寸为&gt;的张量; 2GB。这不是Tensorflow限制,而是Google的protobuf限制。解决这个问题的一种方法是将较大的张量分解为较小的张量。

答案 2 :(得分:0)

这是导致我的错误的代码:

w = tf.Variable(tf.constant(1.,shape=[16,16,7,1154,1154]))
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

我仍然不确定为什么这是错的。必须是tf.Variable不能这么大。