如果验证步骤不适合样本数量怎么办?
What if the validation step does not fit into numbers of samples?
有点烦人的是 tf.keras
生成器仍然面临这个问题,不像 pytorch
。关于这个有很多讨论,但是,仍然坚持下去。已经访问:
- steps_per_epoch does not fit into numbers of samples
问题
我有一个数据集包含大约 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_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 形状中再次面临尺寸不匹配。一种简单的解决方法是在折叠 2,3,4
-_-
中添加 3
个样本
有什么摆脱它的一般技巧吗?谢谢。
没有时间浏览您的所有代码,但我认为下面的代码可能对您有用。可变长度应设置为样本数。然后代码确定 batch size
和 steps 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
有点烦人的是 tf.keras
生成器仍然面临这个问题,不像 pytorch
。关于这个有很多讨论,但是,仍然坚持下去。已经访问:
- steps_per_epoch does not fit into numbers of samples
问题
我有一个数据集包含大约 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_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 形状中再次面临尺寸不匹配。一种简单的解决方法是在折叠 2,3,4
-_-
3
个样本
有什么摆脱它的一般技巧吗?谢谢。
没有时间浏览您的所有代码,但我认为下面的代码可能对您有用。可变长度应设置为样本数。然后代码确定 batch size
和 steps 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