При этом я пытался перебрать гиперпараметры модели, но не помогло
У меня большие сомнения, что я правильно использую функцию потерь CrossEntropyLoss, но поиск в Интернете не помог мне найти ответ на этот вопрос
Код: Выделить всё
import torch
from torch import nn , optim
from torch.utils.data import DataLoader, Dataset
device = 'cuda' if torch.cuda.is_available() else 'cpu'
x = df_train.drop(['Response'], axis =1) #Response - Target
y = df_train['Response']
x_train, x_test, y_train, y_test = train_test_split(x,y, stratify=y)
x_train, x_test, y_train, y_test = x_train.to_numpy(), x_test.to_numpy(), y_train.to_numpy(), y_test.to_numpy()
class model_nn(nn.Module):
def __init__(self,input_size,output_size):
super(model_nn,self).__init__()
self.input_size = input_size
self.output_size= output_size
self.linear_1 = nn.Linear(self.input_size, 10)
self.act_1 = nn.Tanh()
self.linear_2 = nn.Linear(10, self.output_size)
self.softmax = nn.Softmax()
self.act_2 = nn.Sigmoid()
self.double()
def forward(self,x):
x = self.act_1(self.linear_1(x))
x = self.act_2(self.linear_2(x))
return x
model = model_nn(10,2).to(device)
class Dataset(Dataset):
def __init__(self,x,y):
self.x = torch.from_numpy(x)
self.y = torch.from_numpy(y)
def __getitem__(self, index):
return self.x[index], self.y[index]
def __len__(self):
return len(self.x)
train_dataset = Dataset(x_train, y_train)
test_dataset = Dataset(x_test, y_test)
train_loader = DataLoader(dataset = train_dataset, batch_size=256, shuffle=True)
test_loader = DataLoader(dataset = test_dataset, batch_size=256, shuffle=True)
optimazer = optim.Adam(model.parameters(), lr = 0.01)
loss_fm = nn.CrossEntropyLoss()
def train(model,train_loader,test_loader):
for epoch in range(40):
run_loss_train = 0
run_loss_valid = 0
for num_batch, (inputs , outputs) in enumerate(train_loader):
model.train()
inputs = inputs.to(device)
outputs = outputs.to(device)
optimazer.zero_grad()
predict_outputs = model(inputs)
loss = loss_fm(predict_outputs, outputs.long() )
loss.backward()
optimazer.step()
run_loss_train += loss.item()
run_loss_train = run_loss_train/num_batch
with torch.no_grad():
model.eval()
for num_batch_val, (inpiut , output) in enumerate(test_loader):
predict_out = model(inpiut)
loss = loss_fm(predict_out,output.long())
run_loss_valid += loss.item()
run_loss_valid = run_loss_valid/num_batch_val
if epoch%10 == 0:
print(epoch,'run_loss_train',np.round(run_loss_train,3), 'run_loss_valid',np.round(run_loss_valid,3))
train(model,train_loader,test_loader)
Подробнее здесь: https://stackoverflow.com/questions/787 ... in-pytorch