【问题标题】:What if the validation step does not fit into numbers of samples?如果验证步骤不适合样本数量怎么办?
【发布时间】:2021-03-09 17:05:23
【问题描述】:

pytorch 不同,tf.keras 生成器仍然面临这个问题有点烦人。有很多关于这个的讨论,然而,仍然坚持下去。已访问:

问题

我有一个由大约 21397 组成的数据集。我写了一个自定义数据加载器,它返回样本总数如下:

class NGenerator(Sequence):
  ...

    def __len__(self):
        return int(np.ceil(float(len(self.data)) / float(self.batch_size)))
  ...

根据数据,我制作了 5 折子集。每个折叠包含以下内容:

Fold   Amount
1.0    4280
0.0    4280
2.0    4279
3.0    4279
4.0    4279

对于每个折叠,我设置了step_per_epochvalidation_per_epoch 如下:

# here, train_labels is the df of the subset based on fold
steps_per_epoch  = np.ceil(float(len(train_labels)) / float(batch_size)) 
validation_steps = np.ceil(float(len(val_labels)) / float(batch_size)) 

现在,为了获得 OOF 分数,我们在验证集上进行预测,并希望将结果存储如下:

batch_size = 64
oof = np.zeros(len(df))
...
for each_fold, (trn_idx, val_idx) in enumerate(skf...): 
   train_labels = df.iloc[self.trn_idx].reset_index(drop=True) 
   val_labels = df.iloc[self.val_idx].reset_index(drop=True) 
   ....
   train_gen, val_gen = ..., model.fit()

   pred = model.predict(val_gen, steps=validation_steps)
   oof[self.val_idx] = np.argmax(pred, axis=1)  < --------- HERE 

训练后,在索引时 (oof),它会在 42804288 之间引发形状大小不匹配。所以,看起来,有了这个step sizebatch size,模型正在预测下一批的8 样本。接下来,我们将batch_size 设置为等于40,它可以被子集的总数(4280)整除。足够好,但(当然)再次面临42794280 之间形状的Fold 2 尺寸不匹配。一种简单的解决方法是将3 样本添加到折叠2,3,4 -_-

有什么摆脱它的一般技巧吗?谢谢。

【问题讨论】:

    标签: python tensorflow keras generator


    【解决方案1】:

    没有时间浏览您的所有代码,但我认为下面的代码可能对您有用。可变长度应设置为样本数。然后代码确定batch sizesteps per epoch 使得length = batch_size*steps 每个时期。变量b_max 应设置为您将根据内存容量允许的最大批量大小。请注意,如果length 是质数,批量大小将最终为1,而steps 将最终为length

    def get_bs(length, b_max):
       batch_size=sorted([int(length/n) for n in range(1,length+1) if length % n ==0 and 
       length/n<=b_max],reverse=True)[0]  
       steps=(length/batch_size)
       return batch_size, steps
    

    我使用它来设置validation steps,因此在验证期间,验证集中的样本只被处理一次。下面是一个例子。

    batch_size, steps = get_bs(2048, 90)
    print ('batch_size = ', batch_size, '   steps = ', steps)
    # result is batch_size =  64    steps =  32.0
    

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 2013-01-13
      • 2019-10-10
      • 2013-06-05
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      相关资源
      最近更新 更多