У меня есть нейронная сеть, которую я использую для двоичной классификации. Я меняю размер тренировочных данных и прогнозирую на тестовом наборе. Если посмотреть на результаты, разница между tp
и fn
всегда одинакова, а разница между tn
и fp
всегда одинакова. Например, в итерации № 2 tp#2 - tp#1 = -91
и fn#2 - fn#1 = +91
. Также fp#2 - fp#1 = -46
и tn#2 - tn#1 = +46
. В качестве другого примера, tp#3 - tp#2 = -35
и fn#2 - fn#2 = +35
.
Iteration #1
tn=119, fp=173, fn=110, tp=407
Iteration #2
tn=165, fp=127, fn=201, tp=316
Iteration #3
tn=176, fp=116, fn=236, tp=281
Iteration #4
tn=157, fp=135, fn=207, tp=310
Iteration #5
tn=155, fp=137, fn=214, tp=303
Я пробовал различные архитектуры нейронных сетей, но я всегда получаю одинаковые числа. У вас есть идея, что не так.
Ниже приводится очень простая сеть, которую я использую:
class AllCnns(nn.Module):
def __init__(self, vocab_size, embedding_size):
torch.manual_seed(0)
super(AllCnns, self).__init__()
self.word_embeddings = nn.Embedding(vocab_size, embedding_size)
self.conv1 = nn.Conv1d(embedding_size, 64, 3)
self.drop1 = nn.Dropout(0.3)
self.max_pool1 = nn.MaxPool1d(2)
self.flat1 = nn.Flatten()
self.fc1 = nn.Linear(64*80, 100)
self.fc2 = nn.Linear(100, 1)
def forward(self, sentence):
embedding = self.word_embeddings(sentence).permute(0, 2, 1)
conv1 = F.relu(self.conv1(embedding))
drop1 = self.drop1(conv1)
max_pool1 = self.max_pool1(drop1)
flat1 = self.flat1(max_pool1)
fc1 = F.relu(self.fc1(flat1))
fc2 = torch.sigmoid(self.fc2(fc1))
return fc2