我在文件夹中订购了一堆数据,如下图所示:
我需要构建一个DataIterator才能使数据适合神经网络模型。我发现使用Keras类 ImageDataGenerator 及其方法 flow_from_directory 解决了当数据为图像时解决此问题的许多示例,但当数据为csv结构时却没有。 / p>
每个csv文件都是一个512x11浮点数组,代表传感器所需的功率。我曾考虑过将这些CSV转换为图像格式,然后应用 ImageDataGenerator 类,但是压缩会导致信息丢失(在图像中,每个值都由8位表示整数,而我的数据是32位浮点数)。
那么,在Keras中,有什么等效于 ImageDataGenerator 来加载csv文件而不是图像?
答案 0 :(得分:2)
是的,您可以通过对Sequence
对象进行子类化来编写自己的生成器。这个想法是,您用两列组成某种数据框(例如,pandas数据框):一列用于标签,另一列包含csv文件的路径。您的数据生成器将使用此文件来确定数据集的长度(csv文件的数量),并批量读取文件并将其传递给模型。
您的代码可能看起来像这样:
class DataSequence(Sequence):
"""
Keras Sequence object to train a model on a list of csv files
"""
def __init__(self, df, batch_size, mode='train'):
"""
df = dataframe with two columns: the labels and a list of filenames
"""
self.df = df
self.bsz = batch_size
self.mode = mode
# Take labels and a list of image locations in memory
self.labels = self.df['label'].values
self.file_list = self.df['file_names']
def __len__(self):
return int(math.ceil(len(self.df) / float(self.bsz)))
def on_epoch_end(self):
self.indexes = range(len(self.im_list))
if self.mode == 'train':
# Shuffles indexes after each epoch if in training mode
self.indexes = random.sample(self.indexes, k=len(self.indexes))
def get_batch_labels(self, idx):
# Fetch a batch of labels
return self.labels[idx * self.bsz: (idx + 1) * self.bsz]
def get_batch_features(self, idx):
# Fetch a batch of inputs
return np.array([READ_CSV_FUNCTION(f) for f in self.file_list[idx * self.bsz: (1 + idx) * self.bsz]])
def __getitem__(self, idx):
batch_x = self.get_batch_features(idx)
batch_y = self.get_batch_labels(idx)
return batch_x, batch_y
您只需要用选择的功能替换READ_CSV_FUNCTION
即可读取和解析csv文件。