tf.contrib.learn load_csv_with_header 在 TensorFlow 1.1 中不工作

tf.contrib.learn load_csv_with_header not working in TensorFlow 1.1

我安装了最新的 TensorFlow (v1.1.0) 并且我尝试 运行 tf.contrib.learn Quickstart 教程,你想在其中为 IRIS 数据集构建一个分类器。但是,当我尝试时:

training_set = tf.contrib.learn.datasets.base.load_csv_with_header(
    filename=IRIS_TRAINING,
    target_dtype=np.int,
    features_dtype=np.float32)

我收到一个 StopIteration 错误。

当我检查 API 时,我没有找到任何关于 load_csv_with_header() 的信息。他们是否在不更新教程的情况下在最新版本中更改了它?我该如何解决这个问题?

编辑: 如果这有什么不同,我使用 Python3.6。

StopIteration 只有在 csv 文件为空时才会出现。您是否检查过该路径 (IRIS_TRAINING) 是否解析为您有权打开的内容?

这是因为 Python 2 和 Python 3 之间的差异。下面是我的代码,适用于 Python 3.5:

if not os.path.exists(IRIS_TRAINING):
    raw = urllib.request.urlopen(IRIS_TRAINING_URL).read().decode()
    with open(IRIS_TRAINING, 'w') as f:
        f.write(raw)

if not os.path.exists(IRIS_TEST):
    raw = urllib.request.urlopen(IRIS_TEST_URL).read().decode()
    with open(IRIS_TEST, 'w') as f:
        f.write(raw)

可能发生的情况是您的代码在 IRIS_TRAINING 之后创建了一个文件名。但是文件是空的。因此 StopIteration is raised。如果您查看 load_csv_with_header:

的实现
with gfile.Open(filename) as csv_file:
    data_file = csv.reader(csv_file)
    header = next(data_file)

StopIterationnext 未检测到任何其他要读取的项目时引发 https://docs.python.org/3.5/library/exceptions.html#StopIteration

请注意我的代码与 Python 2 版本相比的变化,如 Tensorflow 教程中所示:

  1. urllib.request.urlopen 而不是 urllib.urlopen
  2. decode()read()
  3. 之后执行

或者您可以将 csv 文件写入二进制文件而不是添加 decode()

if not os.path.exists(IRIS_TRAINING):
    raw = urllib.request.urlopen(IRIS_TRAINING_URL).read()
    with open(IRIS_TRAINING, 'wb') as f:
        f.write(raw)

如果上述答案无效,您可以在 urlopen() 方法中指定 iris_training.csv 和 iris_test.csv 文件的路径。