我正在创建一个带有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
答案 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不能这么大。