Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
jantic
GitHub Repository: jantic/deoldify
Path: blob/master/fastai/callbacks/oversampling.py
781 views
1
from ..torch_core import *
2
from ..basic_data import DataBunch
3
from ..callback import *
4
from ..basic_train import Learner,LearnerCallback
5
from torch.utils.data.sampler import WeightedRandomSampler
6
7
__all__ = ['OverSamplingCallback']
8
9
10
11
class OverSamplingCallback(LearnerCallback):
12
def __init__(self,learn:Learner,weights:torch.Tensor=None):
13
super().__init__(learn)
14
self.labels = self.learn.data.train_dl.dataset.y.items
15
_, counts = np.unique(self.labels,return_counts=True)
16
self.weights = (weights if weights is not None else
17
torch.DoubleTensor((1/counts)[self.labels]))
18
self.label_counts = np.bincount([self.learn.data.train_dl.dataset.y[i].data for i in range(len(self.learn.data.train_dl.dataset))])
19
self.total_len_oversample = int(self.learn.data.c*np.max(self.label_counts))
20
21
def on_train_begin(self, **kwargs):
22
self.learn.data.train_dl.dl.batch_sampler = BatchSampler(WeightedRandomSampler(self.weights,self.total_len_oversample), self.learn.data.train_dl.batch_size,False)
23