【发布时间】: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_epoch 和validation_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),它会在 4280 和 4288 之间引发形状大小不匹配。所以,看起来,有了这个step size 和batch size,模型正在预测下一批的8 样本。接下来,我们将batch_size 设置为等于40,它可以被子集的总数(4280)整除。足够好,但(当然)再次面临4279 和4280 之间形状的Fold 2 尺寸不匹配。一种简单的解决方法是将3 样本添加到折叠2,3,4 -_-
有什么摆脱它的一般技巧吗?谢谢。
【问题讨论】:
标签: python tensorflow keras generator