[英]why my model does not learn? Same on every epoch (Pytorch)
from sklearn import datasets
import pandas as pd
import numpy as np
import torch
from torch import nn
#loading the dataset
(data, target) = datasets.load_diabetes(as_frame=True,return_X_y=True) #with the as_frame=True data: pd.DataFrame
# converting data,target to tensors
data = torch.tensor(data.values,dtype=torch.float)
target = torch.tensor(target.values,dtype=torch.float)
#split the data 80% train 20% testing
a = 0.8
train_data , train_target = data[:int(a*len(data))] , data[:int(a*len(data))]
test_data , test_target = data[int(a*len(data)):] , data[int(a*len(data)):]
#constructing the model
# for this dataset dimentionality is 10 so the in_features will be 10
model = nn.Sequential(
nn.Linear(in_features=10, out_features=128),
nn.Linear(in_features=128, out_features=128),
nn.Linear(in_features=128, out_features=1)
)
#loss fn , optimizer
loss_fn = nn.L1Loss() #binary cross entropy
optimizer = torch.optim.SGD(params = model.parameters(),lr=0.001) #stochastic gradient descent
#training loop
epochs = 1000
for epoch in range(epochs):
#1. make prediction
model.train()
train_pred = model(train_data)
loss = loss_fn(train_pred, train_target)
optimizer.zero_grad()
loss.backward()
optimizer.step()
model.eval()
with torch.inference_mode():
test_pred = model(test_data)
loss_test = loss_fn(test_pred, test_target)
if epoch%(epochs//min(10,epochs))==0: print(f"{epoch} - training loss: {round(float(loss),4)} | test loss: {round(float(loss_test),4)}")- training loss: {loss} | test loss: {loss_test}")
Output
0 - 訓練損失:0.0837 | 測試損失:0.0806
100 - 訓練損失:0.0433 | 測試損失:0.0431
200 - 訓練損失:0.0426 | 測試損失:0.0425
300 - 訓練損失:0.042 | 測試損失:0.0419
400 - 訓練損失:0.0414 | 測試損失:0.0414
500 - 訓練損失:0.0408 | 測試損失:0.0408
600 - 訓練損失:0.0403 | 測試損失:0.0403
700 - 訓練損失:0.0398 | 測試損失:0.0398
800 - 訓練損失:0.0393 | 測試損失:0.0394
900 - 訓練損失:0.0388 | 測試損失:0.0389
首先,正如評論中提到的那樣,您可能的意思是:
train_data, train_target = data[:int(a*len(data))] , target[:int(a*len(data))]
test_data, test_target = data[int(a*len(data)):] , target[int(a*len(data)):]
接下來,您的目標大小與 output 大小不一致(這應該會給出警告)。 使用
loss = loss_fn(train_pred, train_target.unsqueeze(1))
and
loss_test = loss_fn(test_pred, test_target.unsqueeze(1))
應該給你一些牽引力。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.