Tensorflow - Dataset API中的字符串处理

时间:2017-10-30 19:37:14

标签: tensorflow tensorflow-datasets

我在<div class="container"> <div class="circle">1</div> <img class="circle" src="https://pbs.twimg.com/profile_images/887828156886986752/F7XIdhSg_400x400.jpg" /> <div class="circle">KU</div> </div>格式的目录中有.txt个文件。我使用<text>\t<label> API来使用这些文本记录:

TextLineDataset

我想对raw_text功能进行一些字符串清理/处理。当我尝试运行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"] 时,出现以下错误:

  

属性错误:&#39; Tensor&#39;对象没有属性&#39; strip&#39;

1 个答案:

答案 0 :(得分:10)

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

TensorFlow目前没有很多string operations,但你可以使用tf.py_func() op在tf.Tensor上运行一些Python代码:

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