TensorFlow Dataset API 映射py_function中的 IDE 断点?



我正在使用Tensorflow Dataset API来准备数据以输入我的网络。在此过程中,我有一些自定义 Python 函数,这些函数使用tf.py_function映射到数据集。我希望能够调试进入这些函数的数据以及这些函数中的数据会发生什么。当调用py_function时,它会回调主 Python 进程(根据这个答案(。由于此函数在 Python 中,并且在主进程中,我希望常规 IDE 断点能够在此进程中停止。但是,情况似乎并非如此(下面的示例,其中断点不会停止执行(。有没有办法放入数据集map使用的py_function中的断点?

断点不停止执行的示例

import tensorflow as tf
def add_ten(example, label):
example_plus_ten = example + 10  # Breakpoint here.
return example_plus_ten, label
examples = [10, 20, 30, 40, 50, 60, 70, 80]
labels =   [ 0,  0,  1,  1,  1,  1,  0,  0]
examples_dataset = tf.data.Dataset.from_tensor_slices(examples)
labels_dataset = tf.data.Dataset.from_tensor_slices(labels)
dataset = tf.data.Dataset.zip((examples_dataset, labels_dataset))
dataset = dataset.map(map_func=lambda example, label: tf.py_function(func=add_ten, inp=[example, label],
Tout=[tf.int32, tf.int32]))
dataset = dataset.batch(2)
example_and_label = next(iter(dataset))

tf.data.Dataset的Tensorflow 2.0实现为每个调用打开一个C线程,而不会通知调试器。 使用pydevd手动设置跟踪函数,该函数将连接到默认调试器服务器并开始向其提供调试数据。

import pydevd
pydevd.settrace()

代码示例:

import tensorflow as tf
import pydevd
def add_ten(example, label):
pydevd.settrace(suspend=False)
example_plus_ten = example + 10  # Breakpoint here.
return example_plus_ten, label
examples = [10, 20, 30, 40, 50, 60, 70, 80]
labels =   [ 0,  0,  1,  1,  1,  1,  0,  0]
examples_dataset = tf.data.Dataset.from_tensor_slices(examples)
labels_dataset = tf.data.Dataset.from_tensor_slices(labels)
dataset = tf.data.Dataset.zip((examples_dataset, labels_dataset))
dataset = dataset.map(map_func=lambda example, label: tf.py_function(func=add_ten, inp=[example, label],
Tout=[tf.int32, tf.int32]))
dataset = dataset.batch(2)
example_and_label = next(iter(dataset))

注意:如果您使用的是已经捆绑了pydevd(例如PyDev或PyCharm(的IDE,则不必单独安装pydevd,它将在调试会话期间拾取。

相关内容

  • 没有找到相关文章

最新更新