Вы неправильно понимаете API. Когда вы добавляете какое-либо преобразование к вашему набору данных, это, по сути, функция, которая применяется к каждому образцу из этого набора данных и затем возвращается. transforms.Compose
применяет субпреобразования последовательно, а не возвращает несколько результатов (причем каждый перевод либо применяется, либо нет). Так
transforms.Compose([
transforms.RandomRotation(degrees = (90, -90)),
transforms.RandomRotation(degrees = (180, -180)),
])
просто повернет ваше изображение один раз на произвольный угол между 90 и 90 градусами (другими словами, точно на 90 градусов), а затем снова на 180. Это эквивалентно одному RandomRotation(degrees=(270, 270))
(на самом деле это хуже, потому что оно приводит к большему повреждению данных в процессе).
Итак, большинство transforms
такие же, как указано выше - «линейный» - один вход, один выход. Есть некоторые «разветвляющиеся» преобразования, которые производят больше выходов, чем входов. Примером является FiveCrop
. Пожалуйста, обратите внимание на заметку о том, как с этим бороться. Даже при «разветвлении» преобразований вы по-прежнему получаете такое же количество элементов в наборе данных, просто ваши партии будут больше.
Если вы специально хотите иметь набор данных, который содержит 4 по-разному повернутые копии каждого элемента и дает их случайным образом (т. Е. Возможно, каждый повернутый вариант поставляется в отдельном пакете), вам придется написать некоторую пользовательскую логику загрузки данных. Для этого вы можете основывать свою работу на источнике DatasetFolder
.
Почему API сделан таким, какой он есть? На практике большинству людей все в порядке с преобразованиями, какими они являются в настоящее время - на вашем месте они просто пишут преобразование, которое случайным образом переворачивается на 0, 90, 180 или 270 градусов, а затем обучают свою сеть в 4 раза больше эпох, чем вы бы , в среднем получая по одному образцу каждого.