...
		x = F.relu(self.fc2(x))
		x = self.fc3(x)
		return torch.sigmoid(x)

...
		criterion = F.binary_cross_entropy
		loss = criterion(out, target)

There might be other issues in the code, but one is that the binary_cross_entropy should receive logits, not probabilities. One way to fix that would be returning both logits and probabilities from your forward call:
    ...
    probas = F.softmax(logits, dim=1)
    return logits, probas