【问题标题】:Tensorflow Error: "Cannot parse tensor from proto"Tensorflow 错误:“无法从原型解析张量”
【发布时间】:2018-04-07 02:15:18
【问题描述】:

我正在使用 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

【问题讨论】:

  • 看起来无法初始化变量。也许有一些它无法理解的浮点类型的张量变量?仔细检查你的变量。

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


【解决方案1】:

正如@Tarun Wadhwa 所说,tensorflow 不允许在单个设备上大小超过 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 实例。

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

【讨论】:

  • 这是我试图复制的架构:i.stack.imgur.com/1qLP2.png 在初始 C 结束时,我有一个形状为 [?,2,2,1,1154] 的张量。因为 MxNxP 是 32x32x7,我假设我需要一个形状为 [16,16,7,1154,1154] 的滤波器大小来进行最后的反卷积。图像是否有足够的信息告诉我 1154 对于我的输入和输出通道来说太大了?
【解决方案2】:

您不能创建大小 > 2GB 的张量。这不是 TensorFlow 限制,而是 Google 的 protobuf 限制。解决这个问题的一种方法是将一个大张量分解成更小的张量。

【讨论】:

  • 这是我要执行的下一行代码。如果我将张量分成更小的张量,这可能吗? DeConnv4 = tf.nn.conv3d_transpose(layer6, filter = w, output_shape = [1,32,32,7,3298], strides = [1,16,16,16,1], padding = 'SAME')跨度>
  • 我不确定。首先,您的权重变量约为 19 GB。即使您拆分它,我也不确定您是否能够将其放入 RAM(考虑到它会在执行 conv 操作时创建张量)。
  • 您可以做的一件事是创建 3298 w = tf.Variable(tf.constant(1.,shape=[16,16,7,3298,1])) 变量并单独执行转换操作(也许您将不得不使用外部存储器,因为您无法将 19gbs 放入主存储器)然后合并结果。
  • 现在你已经指出这个张量异常大,这让我怀疑我的架构是否正确。这是我正在复制的架构:i.stack.imgur.com/1qLP2.png 如您所见,有很多层和多个连接指示(橙色箭头是残差学习的快捷方式)。有大量通道的原因是由于我正在做的串联。我使用 tf.concat,我沿着通道的轴连接。这听起来正确吗?是否有另一种连接方式不会使我的频道变得如此之大?谢谢!
【解决方案3】:

这是产生我错误的代码:

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 不能这么大。

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 2017-07-24
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    相关资源
    最近更新 更多