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



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

  • validation_steps在克拉斯的含义
  • steps_per_epoch不适合样本数量

问题

我有一个由大约 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之间的形状的折叠 2中再次面临尺寸不匹配。一个简单的解决方法是在折叠2,3,4中添加3样本 -_-

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

没有时间浏览您的所有代码,但我认为下面的代码可能对您有用。可变长度应设置为样本数。然后,代码确定一个batch size,并steps per epoch,以便每个纪元length = batch_size*steps。可变b_max应设置为基于内存容量允许的最大批大小。请注意,如果length是质数批大小,则最终将1steps最终将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

最新更新