【问题标题】:Creating training data from individual .npy files从单个 .npy 文件创建训练数据
【发布时间】:2020-11-30 03:28:16
【问题描述】:

我正在尝试为我的 NN 项目创建训练数据。我有 3 个通道作为输入数据,代表不同的空间字段:UxUyUz。目前,我已将数据格式化如下:

UxUyUz 都是它们自己的文件夹,其中包含 ~300-400 个 .npy 文件,具体取决于 case。我有 8 种不同的情况,所以我的总数据量约为 3000。每个 numpy 数组的大小为 100x60

case_1 >
  Ux >
    Ux_1.npy
    ...
    Ux_350.npy 
  Uy >
    Uy_1.npy
    ...
    Uy_350.npy
  Uz >
    Uz_1.npy 
    ...
    Uz_350.npy

case_2 >
  Ux >
    Ux_1.npy
    ...
    Ux_330.npy 
  Uy >
    Uy_1.npy 
    ...
    Uy_330.npy
  Uz >
    Uz_1.npy
    ...
    Uz_330.npy

....

我希望我的 NN 输入数据有 3 个通道,如下所示:

[[Ux_1, Uy_1, Uz_1], .. [Ux_350, Uy_350, Uz_350]]

对于所有 8 种情况,基本上是 (3000, (3, 100, 60)) 的形状。不必区分这些案例,它们都是相同训练数据的一部分。我想要一些关于如何开始这样做的指导。习惯了已经准备好的数据集,不知道如何将所有.npy文件合并成一个大张量进行训练。

【问题讨论】:

    标签: python numpy pytorch


    【解决方案1】:

    您不需要在启动时构建包含 3000 个 3 层映射的单个张量。我的建议是您实现自己的Dataset class。这很容易,并且允许您控制数据的操作方式。除此之外,您还将按需获取.npy。如果您的数据集增长,这很好。

    最重要的部分是您能够将唯一的整数映射到唯一的(Ux_i, Uy_i, Uz_i) 三元组。这里棘手的部分是您的“is”分布在 8 个不同的 case 目录中。所以必须计划好。

    给定整数index,我们需要找出它属于哪种情况。为此,我们可以使用案例大小的累积数组。我们将遍历它以找到正确的 case,然后计算该字段在特定 case 中的位置。

    这是我将如何实现它:

    class FieldDataset(Dataset):
        def __init__(self, root):
            self.root = root
            self.cases = os.listdir(self.root)
    
            case_sizes = map(lambda case: self.case_size(case), self.cases)
            self.cum_sizes = np.cumsum(case_sizes)
    
        def __getitem__(self, index):
            for case_i, cum_size in enumerate(self.cum_sizes):
                if index < cum_size:
                    break # will leave the loop when index is between cum_sizes[case_i-1] and cum_size
            
            case = self.cases[case_i]
            index -= self.cum_sizes[case_i - 1] # substract sum of all previous cases 
                                                # to get the index in the case of interest 
    
            fields = []
            for axis in ('x', 'y', 'z'):
                filename = os.sep.join((self.root, case, 'U%s' % axis, 'U%s_%i' % (axis, index))
                layer = np.load(filename)
                fields.append(layer)
    
            return np.stack(fields, axis=0).
    
        def case_size(self, case):
            return len(os.listdir((self.root, case, 'Ux'))) # Using the 1st subdirectory 'Ux' to count
    
        def __len__(self):
            return self.cum_sizes[-1] # last element will be the sum of all case sizes
    

    这只是给你一个想法,然后你可以适应你的需要或创建你自己的!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-28
      • 2016-09-08
      • 2019-05-16
      • 2019-08-19
      • 2015-05-04
      • 2019-06-23
      • 2017-04-07
      • 1970-01-01
      相关资源
      最近更新 更多