从 CSV 初始化字符串生成器

Initialize string producer from CSV

我有一个 CSV 文件,其中包含成对的图像文件名和一个标签。我想载入那些图片。

# Queue for reading input pairs
filename_queue = tf.train.string_input_producer([MY_CSV_FILE])

# Read CSV input pairs and label
pair_list_reader = tf.TextLineReader()
pair_list_key, pair_list_value = pair_list_reader.read(filename_queue)
record_defaults = [[''], [''], [-1]]
img1_path, img2_path, label = tf.decode_csv(pair_list_value, record_defaults=record_defaults)

# Load image 1
img1_filename_queue = tf.train.string_input_producer(img1_path)

如您所见,我逐行读取 CSV 文件,然后尝试使用从 CSV 解码器获得的文件名初始化第二个输入生成器。

不过我在最后一行遇到错误:

  File "tensorflow/python/training/input.py", line 138, in string_input_producer
    "fraction_of_%d_full" % capacity)
  File "tensorflow/python/training/input.py", line 106, in _input_producer
    enq = q.enqueue_many([input_tensor])
  File "tensorflow/python/ops/data_flow_ops.py", line 192, in enqueue_many
    batch_dim = ret.inputs[1].get_shape()[0]
  File "tensorflow/python/framework/tensor_shape.py", line 427, in __getitem__
    return self._dims[key]
IndexError: list index out of range

这是为什么?

提前致谢。

这是一个错误,因为 img1_pathshapes(0-D 或标量张量)和预期的 string_tensor 参数不兼容到 tf.train.string_input_producer(一维或向量,张量)。

幸运的是,解决方案很简单,使用 tf.expand_dimsimg1_path 转换为(单元素)向量:

# Convert img1_path from a scalar to a 1-element vector.
img1_path = tf.expand_dims(img1_path, 0)

跟踪张量的形状可能很棘手,因此 TensorFlow 提供了 Tensor.get_shape() 方法,您可以调用该方法来获取有关任何张量对象形状的信息。例如:

print img1_path.get_shape()
# ==> "TensorShape([])" (a 0-dimensional tensor, or scalar)
img1_path = tf.expand_dims(img1_path, 0)
print img1_path.get_shape()
# ==> "TensorShape([Dimension(1)])" (a 1-dimensional tensor with length 1)