Pytorch - Batch Normalizaiton простой вопрос - PullRequest
0 голосов
/ 11 ноября 2019

Я реализовал модель с пакетной нормализацией:

class FFNet(torch.nn.Module):
    def __init__(self, D_in, H_1, H_2, D_out):

        super(FFNet, self).__init__()
        self.linear1 = torch.nn.Linear(D_in, H_1)
        self.linear2 = torch.nn.Linear(H_1, H_2)
        self.bn2 = torch.nn.BatchNorm1d(H_2)
        self.linear4 = torch.nn.Linear(H_2, D_out)

    def forward(self, x):

        h_relu_1=F.relu(self.linear1(x))
        h_relu_2=F.relu(self.bn2(self.linear2(h_relu_1)))
        y_pred=self.linear4(h_relu_2)
        return y_pred

Также я написал обучающий цикл:

for epoch in range(epoches):

    running_loss = 0.0
    cnt = 0
    for i, data in enumerate(train_data, 0):
        local_X, local_y = data
        y_pred = model.forward(local_X)
        loss = criterion(y_pred, local_y)
        optimizer.zero_grad()
        #loss = criterion(y_pred, Y_local_output)
        loss.backward() # back props
        optimizer.step()
        running_loss = running_loss + loss.item()
        cnt+=1


    Validation_loss = 0.0
    cnt2 = 0
    # Validation
    for i, data in enumerate(validation_data, 0):
        Val_X, Val_Y = data

        y_pred = model.forward(Val_X)

        loss=criterion(y_pred, Val_Y)
        Validation_loss = Validation_loss + loss.item()
        cnt2+=1

У меня два вопроса: 1. Нет ли необходимости использоватьmodel.train () в этом коде? 2. Как оценить эту модель, используя eval? У меня есть одна выборка данных, размер которой (1xD_in), а размер пакета больше 1. При использовании приведенного ниже кода возникает ошибка:

    test_single = torch.tensor([aa, ab, ac, ad, ae, af, ag])
    test_single = test_single.unsqueeze(0)

    model.eval()
    [bb,cc] = model.forward(test_single)

Ошибка: «недостаточно значений для распаковки(ожидается 2, получил 1) '

1 Ответ

0 голосов
/ 11 ноября 2019

Если у вас есть нормализация партии, тогда вам нужно использовать model.train () и model.eval () при обучении и оценке соответственно.

2-я часть (код сжатия) не ошибочна. Тем не менее, есть только один выход вашей модели (см. Оператор return функции forward вашей модели), который вызывает ошибку, т.е. вы пытаетесь распаковать 2 значения, тогда как есть только одно. Итак, вы не можете сделать

[bb,cc] = model.forward(test_single)

Вы должны сделать

out = model.forward(test_single)

Я попробовал это, и это работает.

...