J'essaie d'en apprendre davantage sur le ML et j'ai essayé de créer un modèle linéaire simple, mais lorsque je l'exécute, la perte est nulle:

Terminal output

J'ai donc essayé de trouver quel était le problème. Si j'imprime les 10 premiers y_pred, seuls 17 d'entre eux ont des nombres, les autres sont nuls. Peut-être que je fais quelque chose de mal, aidez-moi.

import torch
from torch.utils.data import TensorDataset, DataLoader
import torch.nn as nn
import numpy as np

#Input (temp, rainfall, humidity)
inputs = np.array([[73, 67, 43], [91, 88, 64], [87, 134, 58], [102, 43, 37], [69, 96, 70], [73, 67, 43], [91, 88, 64], [87, 134, 58], [102, 43, 37], [69, 96, 70], [73, 67, 43], [91, 88, 64], [87, 134, 58], [102, 43, 37], [69, 96, 70]], dtype='float32')

#Target (apples, oranges)
targets = np.array([[56, 70], [81, 101], [119, 133], [22, 37], [103, 119], [56, 70], [81, 101], [119, 133], [22, 37], [103, 119], [56, 70], [81, 101], [119, 133], [22, 37], [103, 119]], dtype='float32')

inputs = torch.from_numpy(inputs)
targets = torch.from_numpy(targets)

#Define datasets
train_ds = TensorDataset(inputs, targets)
train_ds[0:3]

#Hyperparameters
batch_size = 5
num_epochs = 100
learning_rate = 0.01

train_dl = DataLoader(dataset=train_ds, batch_size=batch_size, shuffle=True)


model = nn.Linear(3,2) #inputs(temp, rainfall, humidity) , targets(apples, oranges)

loss_f = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)

for epoch in range(num_epochs):
    for xb, yb in train_dl:
        y_pred = model(xb)
        loss = loss_f(y_pred, yb)
        loss.backward()
        optimizer.step()
        optimizer.zero_grad()
        
    if(epoch+1) % 10 == 0:
        print(f'epoch = {epoch+1}/{num_epochs}, loss = {loss.item():.4f}')
        
print(f'Final loss = {loss.item():.4f}')

Éditer: y_pred.shape = torch.Size([5, 2]), yb.shape = torch.Size([5, 2])

0
stopcagic 28 août 2020 à 11:36

2 réponses

Meilleure réponse

Il ne s'agit pas de la fonction Loss. Votre modèle prédit les nombres Nan et Infy. Solution possible

  • Réduisez le taux d'apprentissage (par exemple :learning_rate = 0.001) ou
  • Réduisez la taille du lot (Ex.: batch_size = 2) ou
  • Ajoutez plus de couches dans le modèle avec des fonctions d'activation ou
  • Normaliser les entrées
2
Dishin H Goyani 28 août 2020 à 09:31

Avec la quantité d'informations donnée, ma première tentative changerait

loss_f = nn.MSELoss()

À

loss_f = nn.MSELoss(size_average=True)
0
BedirYilmaz 28 août 2020 à 08:49