【发布时间】: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