Влияние использования перетасовки данных в загрузчике данных Pytorch - PullRequest
0 голосов
/ 24 января 2019

Я реализовал сеть классификации изображений, чтобы классифицировать набор данных из 100 классов, используя Alexnet в качестве предварительно обученной модели и изменяя конечные выходные слои. Я заметил, когда я загружал свои данные как

trainloader = torch.utils.data.DataLoader(train_data, batch_size=32, shuffle=False)

, я получал точность набора данных проверки около 2-3% в течение примерно 10 эпох, но когда я только изменил shuffle=True и переобучил сеть, точность возросла до 70% в самой первой эпохе.

Мне было интересно, произошло ли это, потому что в первом случае сеть показывали один пример за другим непрерывно только для одного класса в течение нескольких случаев, что приводило к тому, что сеть делала плохие обобщения во время обучения, или есть какая-то другая причина?

Но я не ожидал, что это окажет столь радикальное влияние.

P.S .: Все код и параметры были одинаковыми для обоих случаев, кроме изменения параметра shuffle.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

PyTorch сделал много замечательных вещей, и один из них - класс DataLoader.

DataLoader класс берет набор данных (данные), устанавливает batch_size (то есть, сколько выборок для загрузки пакета) и вызывает сэмплер из списка классов:

  • DistributedSampler
  • SequentialSampler
  • RandomSampler
  • SubsetRandomSampler
  • WeightedRandomSampler
  • BatchSampler

enter image description here

Главное, что делают сэмплеры, - это реализуют метод iter().

В случае SequentionalSampler это выглядит так:

def __iter__(self):
    return iter(range(len(self.data_source))) 

Возвращает итератор для каждого элемента в источнике данных.

Когда вы устанавливаете shuffle=True, который будет использовать не SequentionalSampler, а вместо RandomSampler.

И это может улучшить учебный процесс.

0 голосов
/ 25 января 2019

Да, это полностью может повлиять на результат!Перестановка порядка данных, которые мы используем для подбора классификатора, так важна, поскольку пакеты между эпохами не похожи друг на друга.

Проверка Документации загрузчика данных гласит: "shuffle (bool, необязательно) - установите значение True, чтобы данные переставлялись в каждую эпоху "

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

В вашем случае этозначительное повышение точности (из-за недостаточной осведомленности о наборе данных), вероятно, связано с тем, как набор данных «организован», как, например, например, каждая категория попадает в отдельный пакет, и в каждой эпохе пакет содержит один и тот жекатегория, которая получается с очень плохой точностью при тестировании.

...