PyTorch: разные точности обучения с использованием одного и того же случайного семени - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь оценить свою модель на всем тренировочном наборе после каждой эпохи. Вот что я сделал:

torch.manual_seed(1)
model = ConvNet(num_classes=num_classes)
cost_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)  

def compute_accuracy(model, data_loader):
    correct_pred, num_examples = 0, 0
    for features, targets in data_loader:
        logits = model(features)
        predicted_labels = torch.argmax(logits, 1)
        num_examples += targets.size(0)
        correct_pred += (predicted_labels == targets).sum()
    return correct_pred.float()/num_examples * 100

for epoch in range(num_epochs):
    model = model.train()
    for features, targets in train_loader:
        logits = model(features)
        cost = cost_fn(logits, targets)
        optimizer.zero_grad()
        cost.backward()
        optimizer.step()

    model = model.eval()
    print('Epoch: %03d/%03d training accuracy: %.2f%%' % (
          epoch+1, num_epochs, 
          compute_accuracy(model, train_loader)))

результат был убедительным:

Epoch: 001/005 training accuracy: 89.08%
Epoch: 002/005 training accuracy: 90.41%
Epoch: 003/005 training accuracy: 91.70%
Epoch: 004/005 training accuracy: 92.31%
Epoch: 005/005 training accuracy: 92.95%

Но затем я добавил еще одну строку в конце цикла обучения, чтобы также оценить модель навесь набор тестов после каждой эпохи:

for epoch in range(num_epochs):
    model = model.train()
    for features, targets in train_loader:
        logits = model(features)
        cost = cost_fn(logits, targets)
        optimizer.zero_grad()
        cost.backward()
        optimizer.step()

    model = model.eval()
    print('Epoch: %03d/%03d training accuracy: %.2f%%' % (
          epoch+1, num_epochs, 
          compute_accuracy(model, train_loader)))
    print('\t\t testing accuracy: %.2f%%' % (compute_accuracy(model, test_loader)))

Но точность обучения начала меняться:

Epoch: 001/005 training accuracy: 89.08%
         testing accuracy: 87.66%
Epoch: 002/005 training accuracy: 90.42%
         testing accuracy: 89.04%
Epoch: 003/005 training accuracy: 91.84%
         testing accuracy: 90.01%
Epoch: 004/005 training accuracy: 91.86%
         testing accuracy: 89.83%
Epoch: 005/005 training accuracy: 92.45%
         testing accuracy: 90.32%

Я что-то не так делаю? Я ожидал, что точность обучения останется неизменной, потому что в обоих случаях ручное начальное число равно 1. Это ожидаемый результат?

1 Ответ

0 голосов
/ 19 октября 2019

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

...