4

.txt在 format 目录中有文件<text>\t<label>。我正在使用TextLineDatasetAPI 来使用这些文本记录:

filenames = ["/var/data/file1.txt", "/var/data/file2.txt"]

dataset = tf.contrib.data.Dataset.from_tensor_slices(filenames)

dataset = dataset.flat_map(
    lambda filename: (
        tf.contrib.data.TextLineDataset(filename)
        .map(_parse_data)))

def _parse_data(line):   
    line_split = tf.string_split([line], '\t')
    features = {"raw_text": tf.string(line_split.values[0].strip().lower()),
                "label": tf.string_to_number(line_split.values[1], 
                    out_type=tf.int32)}
    parsed_features = tf.parse_single_example(line, features)
    return parsed_features["raw_text"], raw_features["label"]

我想对 raw_text 功能进行一些字符串清理/处理。当我尝试运行时 line_split.values[0].strip().lower(),我收到以下错误:

AttributeError:“张量”对象没有属性“条带”

4

1 回答 1

13

该对象lines_split.values[0]tf.Tensor表示从 的第 0 个拆分的对象line。它不是 Python 字符串,因此它没有.strip()or.lower()方法。相反,您必须将 TensorFlow 操作应用于张量以执行转换。

TensorFlow 目前没有太多的字符串操作,但是你可以使用tf.py_func()op 在 a 上运行一些 Python 代码tf.Tensor

def _parse_data(line):
    line_split = tf.string_split([line], '\t')

    raw_text = tf.py_func(
        lambda x: x.strip().lower(), line_split.values[0], tf.string)

    label = tf.string_to_number(line_split.values[1], out_type=tf.int32)

    return {"raw_text": raw_text, "label": label}

请注意,问题中的代码还有其他几个问题:

  • 不要使用tf.parse_single_example(). 该操作仅用于解析tf.train.Example协议缓冲区字符串;解析文本时不需要使用它,可以直接从_parse_data().
  • 使用dataset.map()而不是dataset.flat_map(). flat_map()仅当映射函数的结果是对象时才需要使用Dataset(因此需要将返回值展平为单个数据集)。map()当结果是一个或多个tf.Tensor对象时必须使用。
于 2017-10-31T16:11:57.863 回答