Насколько я понимаю, аргумент '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 и увидел, что никто не ответил. Я боролся с этим сам, но так и не смог найти никакой помощи. Если это не имеет смысла, просто скажите об этом, и я отредактирую его и сделаю его более понятным, когда у меня будет свободное время.