【问题标题】:Input multiple files into Tensorflow dataset将多个文件输入到 TensorFlow 数据集中
【发布时间】:2018-08-17 06:30:06
【问题描述】:

我有以下 input_fn。

def input_fn(filenames, batch_size):
    # Create a dataset containing the text lines.
    dataset = tf.data.TextLineDataset(filenames).skip(1)

    # Parse each line.
    dataset = dataset.map(_parse_line)

    # Shuffle, repeat, and batch the examples.
    dataset = dataset.shuffle(10000).repeat().batch(batch_size)

    # Return the dataset.
    return dataset

filenames=['file1.csv']filenames=['file2.csv'] 效果很好。如果filenames=['file1.csv', 'file2.csv'],它会给我一个错误。在 Tensorflow documentation 中,它说 filenames 是一个包含一个或多个文件名的 tf.string 张量。如何导入多个文件?

以下是错误。似乎忽略了上面input_fn中的.skip(1)

InvalidArgumentError: Field 0 in record 0 is not a valid int32: row_id
 [[Node: DecodeCSV = DecodeCSV[OUT_TYPE=[DT_INT32, DT_INT32, DT_FLOAT, DT_INT32, DT_FLOAT, ..., DT_INT32, DT_INT32, DT_INT32, DT_INT32, DT_INT32], field_delim=",", na_value="", use_quote_delim=true](arg0, DecodeCSV/record_defaults_0, DecodeCSV/record_defaults_1, DecodeCSV/record_defaults_2, DecodeCSV/record_defaults_3, DecodeCSV/record_defaults_4, DecodeCSV/record_defaults_5, DecodeCSV/record_defaults_6, DecodeCSV/record_defaults_7, DecodeCSV/record_defaults_8, DecodeCSV/record_defaults_9, DecodeCSV/record_defaults_10, DecodeCSV/record_defaults_11, DecodeCSV/record_defaults_12, DecodeCSV/record_defaults_13, DecodeCSV/record_defaults_14, DecodeCSV/record_defaults_15, DecodeCSV/record_defaults_16, DecodeCSV/record_defaults_17, DecodeCSV/record_defaults_18)]]
 [[Node: IteratorGetNext = IteratorGetNext[output_shapes=[[?], [?], [?], [?], [?], ..., [?], [?], [?], [?], [?]], output_types=[DT_FLOAT, DT_INT32, DT_INT32, DT_STRING, DT_STRING, ..., DT_INT32, DT_FLOAT, DT_INT32, DT_INT32, DT_INT32], _device="/job:localhost/replica:0/task:0/device:CPU:0"](Iterator)]]

【问题讨论】:

    标签: tensorflow tensorflow-serving tensorflow-datasets tensorflow-estimator


    【解决方案1】:

    您使用tf.data.TextLineDataset 的想法是正确的。但是,您当前的实现所做的是在其文件名的输入张量中产生每个文件的每一行,但第一个文件的第一个除外。您跳过第一行的方式现在只影响第一个文件中的第一行。在第二个文件中,第一行没有被跳过。

    基于Datasets guide 上的示例,您应该调整您的代码以首先从文件名创建一个常规Dataset,然后在每个文件名上运行flat_map 以使用TextLineDataset 读取它,同时跳过第一个行:

    d = tf.data.Dataset.from_tensor_slices(filenames) 
    # get dataset from each file, skipping first line of each file
    d = d.flat_map(lambda filename: tf.data.TextLineDataset(filename).skip(1))
    d = d.map(_parse_line) # And whatever else you need to do
    

    这里,flat_map 通过读取文件内容并跳过第一行,从原始数据集的每个元素创建一个新数据集。

    【讨论】:

      猜你喜欢
      • 2018-05-18
      • 1970-01-01
      • 2021-08-10
      • 2022-01-10
      • 2011-09-28
      • 2020-12-07
      • 2020-08-26
      • 2018-07-31
      • 1970-01-01
      相关资源
      最近更新 更多