如果验证步骤不适合样本数量怎么办?

What if the validation step does not fit into numbers of samples?

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

问题

我有一个数据集包含大约 21397。我写了一个自定义数据加载器,其中 returns 样本总数如下:

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 形状中再次面临尺寸不匹配。一种简单的解决方法是在折叠 2,3,4 -_-

中添加 3 个样本

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

没有时间浏览您的所有代码,但我认为下面的代码可能对您有用。可变长度应设置为样本数。然后代码确定 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