【问题标题】:Reading Dataset from files where some might be missing从可能缺少某些文件的文件中读取数据集
【发布时间】:2019-07-17 21:24:46
【问题描述】:

我正在尝试将文件加载到 TensorFlow 数据集,其中一些文件可能丢失(在这种情况下,我想用零替换这些文件)。

我试图从中读取数据的目录结构如下:

   |-data
   |---sensor_A
   |-----1.dat
   |-----2.dat
   |-----3.dat
   |---sensor_B
   |-----1.dat
   |-----2.dat
   |-----3.dat

.dat 文件是 .csv 文件,以空格键作为分隔符。每个文件的内容都是单个多行观察,其中列数是恒定的(例如 4),行数是未知的(时间序列数据)。

我已经成功地使用以下代码将每个传感器数据读取到单独的 TensorFlow 数据集:

import os
import tensorflow as tf

tf.enable_eager_execution()

data_root_dir = "data"

modalities_to_use = ["sensor_A", "sensor_B"]
timestamps = [1, 2, 3]

for mod_idx, modality in enumerate(modalities_to_use):
    # Will produce: ['data/sensor_A/1.dat', 'data/sensor_A/2.dat', 'data/sensor_A/3.dat']
    filenames = [os.path.join(data_root_dir, modality, str(timestamp) + ".dat") for timestamp in timestamps]

    dataset = tf.data.Dataset.from_tensor_slices((filenames,))


    def _parse_function_internal(filename):
        number_of_columns = 4
        single_observation = tf.read_file(filename)
        # Tokenise every value so we can cast these to floats later.
        single_observation = tf.string_split([single_observation], sep='\r\n ').values
        single_observation = tf.reshape(single_observation, (-1, number_of_columns))
        single_observation = tf.strings.to_number(single_observation, tf.float32)
        return filename, single_observation

    dataset = dataset.map(_parse_function_internal)

    print('Result:')
    for el in dataset:
        try:
            # Filename
            print(el[0])
            # Parsed file content
            print(el[1])
        except tf.errors.OutOfRangeError:
            break

成功打印出每个传感器的所有三个文件的内容。

我的问题是数据集中的某些时间戳可能会丢失。例如,如果 sensor_A 目录中的文件 1.dat 丢失,我会收到此错误:

tensorflow.python.framework.errors_impl.NotFoundError: NewRandomAccessFile failed to Create/Open: mock_data\sensor_A\1.dat : The system cannot find the file specified.
; No such file or directory
     [[{{node ReadFile}}]] [Op:IteratorGetNextSync]

在这一行抛出:

for el in dataset:

我尝试做的是用 try 块包围对 tf.read_file() 函数的调用,但显然它不起作用,因为在调用 tf.read_file() 时不会抛出错误,但是当从数据集。后来我想把这个数据集传递给一个 Keras 模型,所以我不能只用 try 块包围它。有什么解决方法吗?甚至支持吗?

谢谢!

【问题讨论】:

    标签: python tensorflow tensorflow-datasets


    【解决方案1】:

    我设法解决了问题,并分享了解决方案,以防其他人也遇到问题。我必须使用额外的布尔值列表来指定文件是否实际存在并将其传递给映射器。然后使用tf.cond() 函数我们决定是读取文件还是用零(或任何其他逻辑)模拟数据。

    import os
    import tensorflow as tf
    
    tf.enable_eager_execution()
    
    data_root_dir = "data"
    
    modalities_to_use = ["sensor_A", "sensor_B"]
    timestamps = [1, 2, 3]
    
    for mod_idx, modality in enumerate(modalities_to_use):
        # Will produce: ['data/sensor_A/1.dat', 'data/sensor_A/2.dat', 'data/sensor_A/3.dat']
        filenames = [os.path.join(data_root_dir, modality, str(timestamp) + ".dat") for timestamp in timestamps]
        files_exist = [os.path.isfile(filename) for filename in filenames]
    
        dataset = tf.data.Dataset.from_tensor_slices((filenames, files_exist))
    
    
        def _parse_function_internal(filename, file_exist):
            number_of_columns = 4
            single_observation = tf.cond(file_exist, lambda: tf.read_file(filename), lambda: ' '.join(['0.0'] * number_of_columns))
            # Tokenise every value so we can cast these to floats later.
            single_observation = tf.string_split([single_observation], sep='\r\n ').values
            single_observation = tf.reshape(single_observation, (-1, number_of_columns))
            single_observation = tf.strings.to_number(single_observation, tf.float32)
            return filename, single_observation
    
        dataset = dataset.map(_parse_function_internal)
    
        print('Result:')
        for el in dataset:
            try:
                # Filename
                print(el[0])
                # Parsed file content
                print(el[1])
            except tf.errors.OutOfRangeError:
                break
    

    【讨论】:

      猜你喜欢
      • 2013-11-10
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 1970-01-01
      相关资源
      最近更新 更多