#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?