TLDR; Удалите shuffle=True
в этом случае, поскольку SubsetRandomSampler
уже перетасовывает данные.
Что делает torch.utils.data.SubsetRandomSampler
(пожалуйста, обратитесь к документации, если сомневаетесь ), это займет список индексы и возвращают их случайным образом.
В вашем случае indices
соответствует training
(это индексы элементов в обучающей части данных ) и validation
.
Давайте предположим, что они выглядят так:
train_indices = [0, 2, 3, 4, 5, 6, 9, 10, 12, 13, 15]
val_indices = [1, 7, 8, 11, 14]
Во время каждого прохода SubsetRandomSampler
будет возвращать одно число из этих списков в случайном порядке и они будут снова рандомизированы после того как все они были возвращены .
Так что SubsetRandomSampler
может вернуть что-то вроде этого для val_indices
(аналогично для train_indices
):
val_indices = [1, 8, 11, 7, 14] # Epoch 1
val_indices = [11, 7, 8, 14, 1] # Epoch 2
val_indices = [7, 1, 14, 8, 11] # Epoch 3
Теперь каждый из этого цифры указатель к вашему оригиналу dataset
. Обратите внимание, что оба validation
перетасовываются таким образом, как и train
без использования shuffle=True
+ оба делятся, как и должно быть.
Дополнительная информация
shuffle
использует torch.utils.data.RandomSampler
под капотом, если указано shuffle=True
, см. исходный код . Это, в свою очередь, эквивалентно использованию torch.utils.data.SubsetRandomSampler
с указанием всех индексов (np.arange(len(datatest))
). - вам не нужно предварительно перемешивать
np.random.shuffle(img_inds)
, так как индексы будут перетасовываться во время каждый проход в любом случае - не используйте
numpy
, если torch
обеспечивает те же функции . Существует torch.arange
, смешивание обеих библиотек практически никогда не требуется.
Вывод
Одиночное изображение
Просто передайте его через сеть для получения вывода, например:
module.eval()
with torch.no_grad():
output = module(dataset[5380])
Первая строка переводит модель в режим оценки (изменяет поведение некоторого слоя), менеджер контекста отключает градиент (так как он не нужен для прогнозов). Они почти всегда используются при «проверке вывода нейронной сети».
Проверка набора данных проверки
Что-то в этом духе, обратите внимание на те же идеи, что и для одного изображения:
module.eval()
total_batches = 0
batch_accuracy = 0
for images, labels in val_loader:
total_batches += 1
with torch.no_grad():
output = module(images)
# In case it outputs logits without activation
# If it outputs activation you may have to use argmax or > 0.5 for binary case
# Item gets float from torch.tensor
batch_accuracy += torch.mean(labels == (output > 0.0)).item()
print("Overall accuracy: {}".format(batch_accuracy / total_batches))
Другие случаи
Пожалуйста, посмотрите некоторые руководства для начинающих или учебные пособия и поймите эти концепции, так как StackOverflow не место для повторного выполнения этой работы (довольно конкретные и небольшие вопросы), спасибо.