Функция AddmmBackward вернула недопустимый градиент с индексом 2 — получила [2048, 100], но ожидаемая форма совместима с [2304, 100]

#python #deep-learning #neural-network #pytorch #tensor

Вопрос:

Я столкнулся с этой ошибкой во время обучения своей нейронной сети в pytorch. Я пытаюсь передать изображения размером 48*48 в формате Bamp;W, которые имеют только 3 функции. Как вы можете видеть здесь:

 torch.Size([3, 48, 48]) 0  

Я не уверен, насколько это актуально, но у меня есть 1000 различных изображений для обучения, а также 1000 для проверки.

Я новичок в этом, поэтому моя модель довольно проста. Это модель, которую я написал:

 model.fc = nn.Sequential(nn.Linear(2304, 100),  nn.Linear(100, 50),  nn.Linear(50, 20),  nn.Linear(20, 3),  nn.ReLU(),  nn.LogSoftmax(dim=1))  # criterion = nn.NLLLoss() criterion = nn.CrossEntropyLoss() #NLLLoss() lr = 0.001 optimizer = optim.Adam(model.fc.parameters(), lr) model.to(device)  

Всякий раз, когда я тренируюсь с помощью функции следующего поезда, я получаю следующую ошибку:

 def train(epochs):    # epochs = 10  steps = 0  running_loss = 0  print_every = 10  train_losses, val_losses = [], []   # start timeit  starttime = timeit.default_timer()  print(epochs)   for epoch in range(epochs):  for inputs, labels in train_dataloader:  steps  = 1  inputs, labels = inputs.to(device), labels.to(device)  optimizer.zero_grad()  logps = model.forward(inputs)  loss = criterion(logps, labels)  loss.backward()  optimizer.step()  running_loss  = loss.item()    if steps % print_every == 0:  val_loss = 0  accuracy = 0  model.eval()  with torch.no_grad():  for inputs, labels in val_dataloader:  inputs, labels = inputs.to(device),labels.to(device)  logps = model.forward(inputs)  batch_loss = criterion(logps, labels)  val_loss  = batch_loss.item()    ps = torch.exp(logps)  top_p, top_class = ps.topk(1, dim=1)  equals = top_class == labels.view(*top_class.shape)  accuracy  =torch.mean(equals.type(torch.FloatTensor)).item()  train_losses.append(running_loss/len(train_dataloader))  val_losses.append(val_loss/len(val_dataloader))   print(f"Epoch {epoch 1}/{epochs}.. "  f"Train loss: {running_loss/print_every:.3f}.. "  f"Val loss: {val_loss/len(val_dataloader):.3f}.. "  f"Val accuracy: {accuracy/len(val_dataloader):.3f}")  running_loss = 0  model.train()   torch.save(model, 'aerialmodel.pth')   print("Training took:", round(timeit.default_timer() - starttime, 3), "s.")  print(epochs, "epochs")  print("Learning rate:", lr)  print(f"Val accuracy: {accuracy/len(val_dataloader):.3f}")  

Ошибка:

 /usr/local/lib/python3.7/dist-packages/torch/autograd/__init__.py in backward(tensors, grad_tensors, retain_graph, create_graph, grad_variables, inputs)  147 Variable._execution_engine.run_backward(  148 tensors, grad_tensors_, retain_graph, create_graph, inputs, --gt; 149 allow_unreachable=True, accumulate_grad=True) # allow_unreachable flag  150   151   RuntimeError: Function AddmmBackward returned an invalid gradient at index 2 - got [2048, 100] but expected shape compatible with [2304, 100]  

Любая помощь приветствуется! Большое спасибо!

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

1. Я не вижу, чтобы вы выравнивали входные данные, как inputs.view(3, -1) это требуется здесь. Ты делаешь это в своем forward() ? Вы не дали своего forward() определения, поэтому не уверены.