【问题标题】:Keras ImageDataGenerator equivalent for csv filesKeras ImageDataGenerator 等效于 csv 文件
【发布时间】:2019-05-07 04:15:20
【问题描述】:

我有一堆数据排序在文件夹中,如下图所示:

我需要构建一个 DataIterator 以便将数据拟合到神经网络模型中。当数据是图像时,我找到了许多解决此问题的示例,使用 Keras 类 ImageDataGenerator 及其方法 flow_from_directory,但当数据是 csv 结构时则不然。

每个 csv 文件都是一个 512x11 浮点数组,表示传感器所需的功率。我考虑将这些 CSV 中的每一个转换为图像格式,然后应用 ImageDataGenerator 类,但是压缩会导致信息丢失(在图像中,每个值都由 8 位整数表示,而我的数据是 32 位浮点数)。

那么,Keras 中有一个等效的 ImageDataGenerator 来加载 csv 文件而不是图像?

【问题讨论】:

  • 您应该创建自己的生成器。例如,您可以从 keras.utils.Sequence 派生。您需要在此生成器中手动查找文件、加载和获取行。
  • @Ignacio 嘿,您是否设法创建了用于将 .npy 文件传递​​给 ImageDataGenerator 的代码?如果是这样,你会在这里分享你的代码吗?谢谢
  • @NeStack 不,我只是使用下面的代码生成了一个接受 csv 的类。我想您可以更改 READ_CSV_FUNCTION 来读取您的文件。

标签: python python-3.x tensorflow keras


【解决方案1】:

是的,您可以通过继承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 文件。

【讨论】:

  • 如果我理解正确,READ_CSV_FUNCTION(im) 应该以向量形式返回 csv 文件的内容,对吧?不是原始矩阵形式。类似 pd.read_csv(im).values.flatten()
  • 这取决于你想如何将它提供给你的模型。如果您的第一层是密集层,那么您希望它作为矢量,是的。对于将是矩阵的卷积层。
  • 我尝试了一个简单的模型,当我尝试拟合数据时,我在 keras 引擎中得到下一个错误:'DataSequence' 对象没有属性'ndim'...我应该创建那个您建议的 DataSequence 中的属性?
  • 您是否将它与 model.fit_generator() 一起使用?查看github.com/sdcubber/Keras-Sequence-boilerplate/blob/master/… 获取完整的图片示例
猜你喜欢
  • 2019-07-30
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多