我在文件夹中排序了一堆数据,如下图所示:
我需要构建一个 DataIterator 以便将数据放入神经网络模型中。当数据是图像时,我找到了很多例子来解决这个问题,使用 Keras 类图像数据生成器及其方法流自目录,但当数据是 csv 结构时则不然。
每个 csv 文件都是一个 512x11 浮点数组,表示传感器获取的功率。我考虑过将每个 CSV 转换为图像格式,然后应用图像数据生成器类,但压缩会导致信息丢失(在图像中,每个值都由 8 位整数表示,而我的数据是 32 位浮点数)。
因此,Keras 中有一个等效项图像数据生成器加载 csv 文件而不是图像?
是的,您可以通过子类化来编写自己的生成器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 文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)