【问题标题】:How to perform string find and replace on Tensorflow String Tensor?如何在 Tensorflow 字符串张量上执行字符串查找和替换?
【发布时间】:2018-10-12 19:56:45
【问题描述】:

我目前正在使用 Tensorflow 数据集 api 对指定路径的图像进行一些扩充。文件名本身包含说明是否要扩充文件的信息。所以我想要做的是从数据集中读取文件并为每个文件,在文件名中执行查找,如果我找到特定的子字符串,然后设置一个布尔标志并将子字符串替换为“”。

我得到的错误是:

AttributeError: 'Tensor' 对象没有属性 'find'

我无法在具有 dtype 字符串条目的张量上执行“查找”,因为 find 不是张量的一部分,所以我试图弄清楚如何才能执行上述操作。我在下面分享了一些代码,我认为这些代码展示了我正在尝试做的事情。性能很重要,所以如果有人发现我通过 Dataset API 不正确地执行此操作,我宁愿以正确的方式执行此操作。

def preproc_img(filenames):
  def parse_fn(filename):
    augment_inst = False
    if cfg.SPLIT_INTO_INST:
      #*****************************************************
      #*** THIS IS WHERE THE LOGIC IS CURRENTLY BREAKING ***
      #*****************************************************
      if filename.find('_data_augmentation') != -1:
        augment_inst = True
        filename = filename.replace('_data_augmentation', '')

    image_string = tf.read_file(filename)
    img = tf.image.decode_image(image_string, channels=3)
    return dict(zip([filename], [img]))   

  dataset = tf.data.Dataset.from_tensor_slices(filenames)
  dataset = dataset.map(parse_fn)
  iterator = dataset.make_one_shot_iterator()
  return iterator.get_next()


def perform_train():
  if __name__ == '__main__':
    filenames = helper.get_image_paths()
    next_batch = preproc_img(filenames)

  with tf.Session() as sess:
    with sess .graph.as_default():
      sess.run(tf.local_variables_initializer())
      sess.run(tf.global_variables_initializer())

      dat = sess.run(next_batch)
      # I would now go about calling any of my tf op code below

【问题讨论】:

    标签: tensorflow tensorflow-datasets


    【解决方案1】:

    您可以使用 tf.regex_replace 替换 tf.string 张量中的文本。

    filename = tf.regex_replace(filename, "_data_augmentation", "")
    

    对于 TF 2.0

    filename = tf.strings.regex_replace(filename, "_data_augmentation", "")
    

    【讨论】:

    • 有没有办法检测子字符串是否在文件名中?我问的原因是因为我使用它来确定是否为增强处理设置标志。您是否也偶然知道添加了哪个版本的 TF?我正在运行 1.5,我收到消息“AttributeError:模块 'tensorflow' 没有属性 'regex_replace'”
    • 好吧,看来 regex_replace 从 1.7 开始可用,如果其他人也需要使用它,则更新版本。谢谢 nessuno!
    • 不客气!但是,如果要检查文件名是否包含字符串,可以执行以下操作:contains = tf.equal(tf.size(tf.string_split([filename],"")), tf.size(tf.string_split([tf.regex_replace(filename, "/_data_augmentation/", "")]))) 这会计算并比较应用 tf.regex_replace 之前和之后的字符串长度。另外,如果我解决了您的问题,请记得将答案标记为已接受!ì
    • 真的很有帮助!!标记为正确答案,再次感谢您!从昨天开始就一直在尝试解决这个问题:)
    • 我尝试对答案进行轻微修改,但因为它不是 6 个字符或更多,它不允许我提交。 TF 中的正则表达式无法在开头和结尾使用正斜杠,但没有它们也可以正常工作。所以上面的正则表达式应该是“_data_augmentation”,而不是将来遇到这个的人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多