Pytorch - как сделать выборку с использованием weightedrandomsampler - PullRequest
0 голосов
/ 20 февраля 2020

У меня несбалансированный набор данных, и я хотел бы отобрать образец перепредставленного класса. Как мне go об этом. Я хотел бы использовать weightedrandomsampler, но я также открыт для других предложений.

Пока что я предполагаю, что мой код должен быть структурирован, как показано ниже. Но я не знаю, как точно это сделать.

trainset = datasets.ImageFolder(path_train,transform=transform) ... sampler = data.WeightedRandomSampler(weights=..., num_samples=..., replacement=...) ... trainloader = data.DataLoader(trainset, batchsize = batchsize, sampler=sampler)

Я надеюсь, что кто-то может помочь. Большое спасибо

1 Ответ

0 голосов
/ 09 апреля 2020

Насколько я понимаю, аргумент 'weights' pytorch WeightedRandomSampler чем-то похож на аргумент numpy .random.choice 'p', который представляет собой вероятность случайного выбора образца. Вместо этого Pytorch использует веса для случайной выборки обучающих примеров, и в do c они утверждают, что веса не должны суммироваться с 1, поэтому я имею в виду, что это не совсем случайный выбор numpy. Чем больше вес, тем больше вероятность того, что выборка будет выбрана.

Если у вас есть замена = True, это означает, что примеры тренировок можно рисовать более одного раза, что означает, что вы можете иметь копии примеров тренировок в своем поезде. установить, что привыкнуть тренировать свою модель; передискретизации. Наряду с этим, если веса низкие по сравнению с другими весами ОБРАЗЦОВ ОБУЧЕНИЯ, происходит обратное, что означает, что эти выборки имеют меньшую вероятность выбора для случайной выборки; недосэмплирование.

Я понятия не имею, как работает аргумент num_samples при его использовании с загрузчиком поезда, но я могу предупредить вас, что НЕ следует указывать размер пакета. Сегодня я попытался поставить размер партии, и это дало ужасные результаты. Мой сотрудник назвал количество классов * 100, и его результаты были намного лучше. Все, что я знаю, это то, что вы не должны указывать размер партии. Я также попытался указать размер всех моих тренировочных данных для num_samples, и это дало лучшие результаты, но обучение заняло целую вечность. В любом случае, поиграйте с этим и посмотрите, что работает лучше для вас. Я бы предположил, что безопаснее всего использовать количество обучающих примеров для аргумента num_samples.

Вот пример, который я видел, что кто-то другой использует, и я использую его также для двоичной классификации. Вроде работает просто отлично. Вы берете обратное число обучающих примеров для каждого класса и устанавливаете все обучающие примеры для этого класса с соответствующим весом.

Быстрый пример с использованием объекта вашего поезда

labels = np.array(trainset.samples)[:,1] # очередь массив и взять все столбцы индекса 1, которые являются метками

labels = labels.astype(int) # изменить на int

majority_weight = 1/num_of_majority_class_training_examples

minority_weight = 1/num_of_minority_class_training_examples

sample_weights = np.array([majority_weight, minority_weight]) # Предполагается, что вашим классом меньшинства является целое число 1 в объекте меток. Если нет, поменяйте местами так, чтобы он получал minority_weight, Major_weight.

weights = samples_weights[labels] #. Это проходит через каждый пример обучения и использует метки 0 и 1 в качестве индекса в объекте sample_weights, который является весом, который вы хотите для этого класса.

sampler = WeightedRandomSampler(weights=weights, num_samples=, replacement=True)

trainloader = data.DataLoader(trainset, batchsize = batchsize, sampler=sampler)

Так как pytorch do c говорит, что веса не должны составлять 1, я думаю, вы также можете просто использовать соотношение, которое между несбалансированными классами. Например, если у вас есть 100 примеров обучения в классе большинства и 50 примеров обучения в классе меньшинства, это будет соотношение 2: 1. Чтобы уравновесить это, я думаю, что вы можете просто использовать вес 1,0 для каждого примера обучения в классе большинства и вес 2,0 для всех примеров обучения в классе меньшинства, потому что технически вы хотите, чтобы класс меньшинства был в 2 раза более вероятным, чтобы сбалансировать ваш занятия во время случайного отбора.

Надеюсь, это немного помогло. Извините за небрежное написание, я был в огромном ру sh и увидел, что никто не ответил. Я боролся с этим сам, но так и не смог найти никакой помощи. Если это не имеет смысла, просто скажите об этом, и я отредактирую его и сделаю его более понятным, когда у меня будет свободное время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...