我正在研究二元分类问题。在下面的 torch 代码中,我一直获得 2.5% 的准确率。
class SimpleClassifier(nn.Module):
def __init__(self, input_size, hidden_size1, hidden_size2, output_size):
super(SimpleClassifier, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size1)
self.relu1 = nn.ReLU()
self.fc2 = nn.Linear(hidden_size1, hidden_size2)
self.relu2 = nn.ReLU()
self.fc3 = nn.Linear(hidden_size2, output_size)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
x = self.relu1(self.fc1(x))
x = self.relu2(self.fc2(x))
x = self.sigmoid(self.fc3(x))
return x
input_size = train_X.shape[1]
hidden_size1 = 64
hidden_size2 = 32
output_size = 1
model = SimpleClassifier(input_size, hidden_size1, hidden_size2, output_size)
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
num_epochs = 50
for epoch in range(num_epochs):
for inputs, labels in train_dataloader:
optimizer.zero_grad()
outputs = model(inputs)
# Reshape labels to match the shape of the outputs
labels = labels.view(-1, 1)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# Evaluation on the test set
with torch.no_grad():
model.eval()
predictions = model(test_X).squeeze()
predictions_binary = (predictions.round()).float()
accuracy = torch.sum(predictions_binary == test_Y) / (len(test_Y) * 100)
if(epoch%25 == 0):
print("Epoch " + str(epoch) + " passed. Test accuracy is {:.2f}%".format(accuracy))
但是,在下面的 Tensorflow 代码中,我得到的准确率约为 86%
model = Sequential()
model.add(Dense(64, input_dim=len(train_X[0]), activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(1, activation='sigmoid')) # assuming binary classification
# Compile the model
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(train_X, train_Y, epochs=50, batch_size=64)
# Evaluate the model
loss, accuracy = model.evaluate(test_X, test_Y)
print(f"Loss: {loss}, Accuracy: {accuracy}")
我相信我的火炬代码确实有问题,但我不明白我错过了什么?我该如何解决?
我认为你可以解决的问题之一是:
accuracy = torch.sum(predictions == test_Y).item() / len(test_Y) * 100
百分比转换顺序错误