我应该如何处理错误:-位置32的括号不平衡

时间:2019-06-03 05:37:11

标签: tensorflow-datasets

代码:-train_validation_split = tfds.Split.TRAIN.subsplit([6,4])

   (train_data, validation_data), test_data = tfds.load(
   name="imdb_reviews", 
   split=(train_validation_split, tfds.Split.TEST),
   as_supervised=True)

1)。错误=位置32上的括号不平衡。

2)。加载imdb数据集时出现此错误。

3)。 Image of Code with Error

2 个答案:

答案 0 :(得分:4)

tldr;

  • 这是Windows路径分隔符问题。 (为什么Windows会这样做?了解有关here的更多信息)

  • 分辨率:

    • 使用Google Colab来使用tensorflow_datasets(推荐)
    • 使用类似* nix的系统(路径分隔符为/

出了什么问题?

转义符 regex

what_ever_python/Lib/site-packages/tensorflow_datasets/text/imdb.py第156行

reg_path = "(?P<label>neg|pos)" if labeled else "unsup"
reg = re.compile(os.path.join("^%s" % directory, reg_path, ""))
  • 在Windows上

    1. os.path.join("^%s" % directory, reg_path, "") => '^aclImdb\\train\\(?P<label>neg|pos)\\'
    2. 这就是程序看到的'^aclImdb\train\(?P<label>neg|pos)\'
    3. 正则表达式请参见:^ + aclImdb + 标签 + rain + ((这是导致错误的转义字符unbalanced parenthesis)+ ... + (这是一个封闭组字符,其打开的同伴已被转义)+ ...
  • 在* nix上

    1. os.path.join("^%s" % directory, reg_path, "") => '^aclImdb/train/(?P<label>neg|pos)/'并没有转义

P / S:这些人只在{上使用Macbook忘记从不遇到放弃 {1}}?我再也不会使用Windows path problem

答案 1 :(得分:1)

我来晚了这篇帖子,但看来您正在关注one of the Tensorflow Beta tutorials

按照shioko的回答,在tensorflow_datasets库对Windows路径分隔符的处理中存在一个错误,尤其是在imdb.py数据集加载器中完成时。但是,我要指出的是,os.path.join()本身并不是问题,也不应怪罪于此。该功能不需要破坏,因为正如他们所说的,只是在执行其工作。我的建议是继续使用当前的开发环境(尤其是如果您拥有强大的GPU!),但请按照以下说明修复tensorflow_datasets中的错误。

真正的问题是Windows路径分隔符和正则表达式之间的交互,正则表达式将这些分隔符视为转义序列。有点大话,但是这里的基本建议如下:为了停止将转义序列视为转义序列,您必须对转义序列进行转义。反斜杠是常见的转义序列,因此已成为其自身流行的受害者。有时必须逃脱。有时,它必须逃避很多。有时必须逃避很多"^file:\\\\\\\\c:\\\\foo\\\\bar\\\\baz.txt$"级别。

因此,我推荐给tensorflow_datasets维护者(或愿意自己修补tensorflow_datasets/text/imdb.py的人们)的解决方案是使用如下所示的代码在调用join之前将路径分隔符通过re.escape()

reg = re.compile(re.escape(os.path.sep).join(["^%s" % re.escape(directory), reg_path, ""]))

这应该替换imdb.py的第159/160行周围以reg =开头的语句。我没有使用os.path.join(),因为它不完全适合此问题,但是我正在使用其弟兄os.path.sep。我也不会完全取消os.path.join(),因为它还有很多优点,例如在与非正则表达式相关的场景中加入路径组件。

请注意,我也在re.escape()的源目录中。这对于避免产生其他种类的bug很有用,例如将通配符视为路径名的元素。我可能只是将此更改作为请求请求提交给tensorflow_datasets库,该库有望有望免除遵循Tensorflow在Windows计算机上的官方教程(例如我本人)的其他ML爱好者不必手动将补丁应用于他们依赖的contrib库。