如何提高二元分类感知器模型的准确性

问题描述 投票:0回答:1

我是初学者,正在编写二进制分类感知器模型。 这是我的数据集

import numpy as np

def generate_rand_samples(dot_num=100):
    x_p = np.random.normal(3., 1, dot_num)
    y_p = np.random.normal(3., 1, dot_num)
    y = np.ones(dot_num)
    C1 = np.array([x_p, y_p, y]).T
    x_n = np.random.normal(6., 1, dot_num)
    y_n = np.random.normal(0., 1, dot_num)
    y = np.ones(dot_num)*-1
    C2 = np.array([x_n, y_n, y]).T
    data_set = np.concatenate((C1, C2), axis=0)
    np.random.shuffle(data_set)
    return data_set[:,:2].astype(np.float32),data_set[:,2].astype(np.int32)

from scipy import stats
X_train, y_train = generate_rand_samples()
X_test, y_test = generate_rand_samples()

X_train = stats.zscore(X_train)
X_test = stats.zscore(X_test)

X_train_tensor = torch.from_numpy(X_train).float()
y_train_tensor = torch.from_numpy(y_train).float().unsqueeze(1)

X_test_tensor = torch.from_numpy(X_test).float()
y_test_tensor = torch.from_numpy(y_test).float().unsqueeze(1)

这是我的模型

import torch
from torch import nn

class Perceptron(nn.Module):
    def __init__(self, input_dim):
        super(Perceptron, self).__init__()
        self.fc = nn.Linear(input_dim, 1)

    def forward(self, x):
        return torch.sigmoid(self.fc(x))

    def compute_accuracy(self, x, y):
        with torch.no_grad():
            y_pred = self.forward(x)
            y_pred_labels = (y_pred > 0.5).float()
            accuracy = (y_pred_labels == y).float().mean()
        return accuracy

这是我的训练过程

import torch.optim as optim

lr = 0.001
optimizer = optim.SGD(model.parameters(), lr=lr)
criterion = nn.BCELoss()

num_epochs = 20000
for epoch in range(num_epochs):
    # compute loss
    y_pred = model(X_train_tensor)
    loss = criterion(y_pred, y_train_tensor)
    # compute accuracy
    accuracy = model.compute_accuracy(X_train_tensor, y_train_tensor)
    # update model
    optimizer.zero_grad()
    loss.backward()

    optimizer.step()
    # print progress
    if (epoch+1) % 1000 == 0:
        print(f'Epoch {epoch+1}/{num_epochs}: Loss={loss.item():.4f}, Accuracy={accuracy.item():.4f}')

我不知道为什么,但它的准确度小于 0.5,并且损失在 epoch 中越来越大。我尝试在模型中使用 softmax 代替 sigmoid,使用 CrossEntrophyLoss 代替 BCELoss,但它不起作用,我尝试调整 epochs 的数量和学习率,但准确性仍然很差,我的有什么问题吗模型或我训练过程中的任何错误?

我期望它做的是提高模型的准确性?

python machine-learning pytorch perceptron
1个回答
0
投票

尽管我尝试提高我的模型的准确性,但我正在经历准确性的降低和时代期间损失的增加。我已经尝试在模型中使用 softmax 代替 sigmoid,并使用 CrossEntrophyLoss 代替 BCELoss,但无济于事。此外,我尝试调整 epochs 的数量和学习率,但准确率仍然很低。我不确定我的模型是否有任何问题,或者我是否在训练过程中犯了任何错误。我的最终目标是提高模型的准确性。

© www.soinside.com 2019 - 2024. All rights reserved.