我是初学者,正在编写二进制分类感知器模型。 这是我的数据集
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 的数量和学习率,但准确性仍然很差,我的有什么问题吗模型或我训练过程中的任何错误?
我期望它做的是提高模型的准确性?
尽管我尝试提高我的模型的准确性,但我正在经历准确性的降低和时代期间损失的增加。我已经尝试在模型中使用 softmax 代替 sigmoid,并使用 CrossEntrophyLoss 代替 BCELoss,但无济于事。此外,我尝试调整 epochs 的数量和学习率,但准确率仍然很低。我不确定我的模型是否有任何问题,或者我是否在训练过程中犯了任何错误。我的最终目标是提高模型的准确性。