TensorFlow:Dst张量未初始化
tensorflow
6
0

MNIST For ML Beginners教程在运行print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))时给我一个错误。其他一切运行正常。

错误和跟踪:

InternalErrorTraceback (most recent call last)
<ipython-input-16-219711f7d235> in <module>()
----> 1 print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc in run(self, fetches, feed_dict, options, run_metadata)
    338     try:
    339       result = self._run(None, fetches, feed_dict, options_ptr,
--> 340                          run_metadata_ptr)
    341       if run_metadata:
    342         proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc in _run(self, handle, fetches, feed_dict, options, run_metadata)
    562     try:
    563       results = self._do_run(handle, target_list, unique_fetches,
--> 564                              feed_dict_string, options, run_metadata)
    565     finally:
    566       # The movers are no longer used. Delete them.

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc in _do_run(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)
    635     if handle is None:
    636       return self._do_call(_run_fn, self._session, feed_dict, fetch_list,
--> 637                            target_list, options, run_metadata)
    638     else:
    639       return self._do_call(_prun_fn, self._session, handle, feed_dict,

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc in _do_call(self, fn, *args)
    657       # pylint: disable=protected-access
    658       raise errors._make_specific_exception(node_def, op, error_message,
--> 659                                             e.code)
    660       # pylint: enable=protected-access
    661 

InternalError: Dst tensor is not initialized.
     [[Node: _recv_Placeholder_3_0/_1007 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/gpu:0", send_device="/job:localhost/replica:0/task:0/cpu:0", send_device_incarnation=1, tensor_name="edge_312__recv_Placeholder_3_0", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/gpu:0"]()]]
     [[Node: Mean_1/_1011 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_319_Mean_1", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

我刚刚切换到较新版本的CUDA,所以也许与此有关吗?似乎此错误与将张量复制到GPU有关。

堆栈:EC2 g2.8xlarge机器,Ubuntu 14.04

更新:

print(sess.run(accuracy, feed_dict={x: batch_xs, y_: batch_ys}))运行正常。这使我怀疑问题是我正在尝试将巨大的张量传输到GPU,而它无法接受。像minibatch这样的小张量也可以正常工作。

更新2:

我已经弄清楚了导致这个问题的张量到底有多大:

batch_size = 7509 #Works.
print(sess.run(accuracy, feed_dict={x: mnist.test.images[0:batch_size], y_: mnist.test.labels[0:batch_size]}))

batch_size = 7510 #Doesn't work. Gets the Dst error.
print(sess.run(accuracy, feed_dict={x: mnist.test.images[0:batch_size], y_: mnist.test.labels[0:batch_size]}))
参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

为简便起见,当没有足够的内存来处理批处理大小时,将生成此错误消息。

扩展Steven的链接(我现在不能发表评论),这里有一些技巧来监视/控制Tensorflow中的内存使用情况:

  • 要在运行期间监视内存使用情况,请考虑记录运行元数据。然后,您可以在Tensorboard中的图形中查看每个节点的内存使用情况。有关更多信息和此示例,请参见Tensorboard信息页面
  • 默认情况下,Tensorflow将尝试分配尽可能多的GPU内存。您可以使用GPUConfig选项更改此设置,以便Tensorflow仅分配所需的内存。请参阅有关此文档 。在那里,您还可以找到一个选项,该选项仅允许您分配GPU内存的特定部分(尽管我发现有时这会损坏)。
收藏
评论

我认为该链接可以帮助https://github.com/aymericdamien/TensorFlow-Examples/issues/38#issuecomment-223793214 。在我的情况下,这是GPU繁忙(占93%繁忙),正在screen训练另一个模型。我需要终止该过程,后来很高兴看到工作正常。

收藏
评论

请记住,ec2 g2.8xlarge仅具有4 gb的gpu内存。
https://aws.amazon.com/ec2/instance-types/

除了以1的批处理大小运行模型外,我没有一种很好的方法来找出模型占用的空间,然后您可以减去一张图像占用的空间。

从那里您可以确定最大批量。这应该可以工作,但我认为tensorflow动态分配gpu内存,类似于割炬,并且与caffe不同,caffe会阻塞刚开始需要的最大gpu空间。因此,您可能希望对最大批处理量保持保守。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号