JavaScript
x
55
55
1
from sklearn import datasets
2
import pandas as pd
3
import numpy as np
4
import torch
5
from torch import nn
6
7
#loading the dataset
8
(data, target) = datasets.load_diabetes(as_frame=True,return_X_y=True) #with the as_frame=True data: pd.DataFrame
9
10
11
# converting data,target to tensors
12
data = torch.tensor(data.values,dtype=torch.float)
13
target = torch.tensor(target.values,dtype=torch.float)
14
15
16
#split the data 80% train 20% testing
17
a = 0.8
18
train_data , train_target = data[:int(a*len(data))] , data[:int(a*len(data))]
19
test_data , test_target = data[int(a*len(data)):] , data[int(a*len(data)):]
20
21
22
#constructing the model
23
# for this dataset dimentionality is 10 so the in_features will be 10
24
model = nn.Sequential(
25
nn.Linear(in_features=10, out_features=128),
26
nn.Linear(in_features=128, out_features=128),
27
nn.Linear(in_features=128, out_features=1)
28
)
29
30
#loss fn , optimizer
31
loss_fn = nn.L1Loss() #binary cross entropy
32
optimizer = torch.optim.SGD(params = model.parameters(),lr=0.001) #stochastic gradient descent
33
34
#training loop
35
epochs = 1000
36
37
for epoch in range(epochs):
38
#1. make prediction
39
model.train()
40
train_pred = model(train_data)
41
42
loss = loss_fn(train_pred, train_target)
43
44
optimizer.zero_grad()
45
loss.backward()
46
optimizer.step()
47
48
model.eval()
49
with torch.inference_mode():
50
test_pred = model(test_data)
51
loss_test = loss_fn(test_pred, test_target)
52
53
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}")
54
55
Output
0 – training loss: 0.0837 | test loss: 0.0806
100 – training loss: 0.0433 | test loss: 0.0431
200 – training loss: 0.0426 | test loss: 0.0425
300 – training loss: 0.042 | test loss: 0.0419
400 – training loss: 0.0414 | test loss: 0.0414
500 – training loss: 0.0408 | test loss: 0.0408
600 – training loss: 0.0403 | test loss: 0.0403
700 – training loss: 0.0398 | test loss: 0.0398
800 – training loss: 0.0393 | test loss: 0.0394
900 – training loss: 0.0388 | test loss: 0.0389
Advertisement
Answer
First, as it was mentioned in the comments, you probably meant:
JavaScript
1
3
1
train_data, train_target = data[:int(a*len(data))] , target[:int(a*len(data))]
2
test_data, test_target = data[int(a*len(data)):] , target[int(a*len(data)):]
3
Next, your target size is not consistent with the output size (this should give a warning). Using
JavaScript
1
6
1
loss = loss_fn(train_pred, train_target.unsqueeze(1))
2
3
and
4
5
loss_test = loss_fn(test_pred, test_target.unsqueeze(1))
6
should give you some traction.