Бинарная классификация в pytorchPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Бинарная классификация в pytorch

Сообщение Anonymous »

Я хочу сделать бинарную классификацию. Классы в исходном наборе данных несбалансированы: 90% и 10%. При использовании CrossEntropyLoss() на выходе моей функции я получаю, что все объекты принадлежат нулевому классу
При этом я пытался перебрать гиперпараметры модели, но не помогло
У меня большие сомнения, что я правильно использую функцию потерь 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»