Как выполняется итерация по torch.utils.data.Загрузчик данных работает?

#python #pytorch #iteration

Вопрос:

Здесь изображение вывода

 trainloader = torch.utils.data.DataLoader(trainset,batch_size=64,shuffle=True)

import torch.optim as optim
model = NEURAL_NETWORK()
optimizer = optim.SGD(model.parameters(), lr = 0.03)
costfx = nn.CrossEntropyLoss()


def train_model(model,batches):
times = 0
for i in range(batches):
    accuracy = 0
    for image, label in trainloader:
        
        optimizer.zero_grad()
        
        output = model(image)
        times  = 1
        
        top_p, top_class = output.topk(1, dim=1)

        equals = top_class == label.view(*top_class.shape)
        
        accuracy  = torch.mean(equals.type(torch.FloatTensor))
        
        loss = costfx(output,label)
        loss.backward()
        optimizer.step()
    print("Batch number:{}, train_loss is: {}, accuracy: {}"
          .format(i 1,loss, accuracy/len(trainloader)), times)
 

Поскольку размер пакета равен 64, я ожидал, что повторная итерация по объекту загрузки поезда вернет times=64, но вместо этого times=938.
Может кто-нибудь объяснить, почему?

Комментарии:

1. Что именно batches здесь находится?

2. «На мой взгляд» это означало количество пакетов (изображений) для обучения нейронной сети. следовательно, пакеты=1—>64 изображения, пакеты=5—>>320 изображений и т. Д

3. время покажет (no. of samples in dataset / batch size) . Пожалуйста, проверьте, так ли это.

Ответ №1:

Способ работы загрузчиков данных в PyTorch довольно прост. Вы определяете набор данных и переносите его с помощью загрузчика данных. Эта функция полезности предназначена для выборки элементов из базового набора данных. Простое использование состоит в том, чтобы просто установить batch_size параметр: количество элементов в пакете. При повторении загрузки данных у вас будет доступ на каждом цикле итерации к одному пакету. Каждый пакет содержит ряд batch_size элементов, определенных в init.

В вашем примере, если вы определяете trainloader как DataLoader(trainset,batch_size=64,shuffle=True) , то в вашем цикле:

 for image, label in trainloader:
    pass
 

Оба image и label будут соответствовать одной партии, по 64 элемента в каждой (64 изображения и соответствующие им метки соответственно). Это означает, что вам не нужно повторять range(batches) . Тем не менее, вы можете несколько раз повторить загрузку данных, что, по сути, соответствует эпохам:

 for epoch in range(epochs):
    for image, label in trainloader:
        optimizer.zero_grad()
        output = model(image)
        # ...
 

Комментарии:

1. Итак, в своем комментарии вы предложили ссылаться на «эпохи» вместо «партии», и спасибо вам за это, в следующий раз я постараюсь избежать путаницы, но у меня остаются сомнения: откуда взялся этот 938 и почему это не 64?

2. Вы увеличиваетесь снова range(batches) и trainloader снова , поэтому i в конечном итоге окажетесь примерно на len(batches)*64 одном уровне .

3. Хорошо, но я поставил партии=1, в соответствии с тем, что вы сказали, следовательно, должно быть еще раз=64, я думаю, не так ли?

4. Да, это верно

5. И почему мой код возвращает время=938?