1: проблемы с pytorch nn. сделал автоматический кодировщик из линейных слоев для проекта преобразования тензорного потока (для использования pysyft в будущем)
2: убедился, что прямой метод действительно возвращает значение, работает в других ситуациях.
3: полная ошибка:
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "B:\tools and software\PyCharm 2020.1\plugins\python\helpers\pydev\_pydev_bundle\pydev_umd.py", line 197, in runfile
pydev_imports.execfile(filename, global_vars, local_vars) # execute the script
File "B:\tools and software\PyCharm 2020.1\plugins\python\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "B:/projects/openProjects/githubprojects/BotnetTrafficAnalysisFederaedLearning/anomaly-detection/pytorch_conversion.py", line 157, in <module>
torch.from_numpy(x_test).float(), tr=1)
File "B:/projects/openProjects/githubprojects/BotnetTrafficAnalysisFederaedLearning/anomaly-detection/pytorch_conversion.py", line 88, in test
x_test_predictions = net(x_test.detach().numpy())
File "B:\tools and software\Anaconda\envs\pysyft-pytorch\lib\site-packages\torch\nn\modules\module.py", line 532, in __call__
result = self.forward(*input, **kwargs)
File "B:/projects/openProjects/githubprojects/BotnetTrafficAnalysisFederaedLearning/anomaly-detection/pytorch_conversion.py", line 121, in forward
x = torch.tanh(self.fc1(x))
File "B:\tools and software\Anaconda\envs\pysyft-pytorch\lib\site-packages\torch\nn\modules\module.py", line 532, in __call__
result = self.forward(*input, **kwargs)
File "B:\tools and software\Anaconda\envs\pysyft-pytorch\lib\site-packages\torch\nn\modules\linear.py", line 87, in forward
return F.linear(input, self.weight, self.bias)
File "B:\tools and software\Anaconda\envs\pysyft-pytorch\lib\site-packages\torch\nn\functional.py", line 1368, in linear
if input.dim() == 2 and bias is not None:
AttributeError: 'numpy.ndarray' object has no attribute 'dim'
метод:
def test(net, x_test, tr):
correct = 0
total = 0
x_test_predictions = net(x_test.detach().numpy())
print("Calculating MSE on test set...")
mse_test = np.mean(np.power(x_test - x_test_predictions, 2), axis=1)
over_tr = mse_test > tr
false_positives = sum(over_tr)
test_size = mse_test.shape[0]
print(f"{false_positives} false positives on dataset without attacks with size {test_size}")
with torch.no_grad():
for i in tqdm(range(len(x_test))):
real_class = torch.argmax(x_test[i])
net_out = net(x_test[i])
predicted_class = torch.argmax(net_out)
if predicted_class == real_class:
correct += 1
total += 1
print("Accuracy: ", round(correct / total, 3))
enter code here
NN:
class Net(nn.Module):
def __init__(self, input_dim=10):
super().__init__()
self.fc1 = nn.Linear(input_dim, int(0.75 * input_dim))
self.fc2 = nn.Linear(int(0.75 * input_dim), int(0.5 * input_dim))
self.fc3 = nn.Linear(int(0.5 * input_dim), int(0.33 * input_dim))
self.fc4 = nn.Linear(int(0.33 * input_dim), int(0.25 * input_dim))
self.fc5 = nn.Linear(int(0.25 * input_dim), int(0.33 * input_dim))
self.fc6 = nn.Linear(int(0.33 * input_dim), int(0.5 * input_dim))
self.fc7 = nn.Linear(int(0.5 * input_dim), int(0.75 * input_dim))
self.fc8 = nn.Linear(int(0.75 * input_dim), input_dim)
def forward(self, x):
x = torch.tanh(self.fc1(x))
x = torch.tanh(self.fc2(x))
x = torch.tanh(self.fc3(x))
x = torch.tanh(self.fc4(x))
x = torch.tanh(self.fc5(x))
x = torch.tanh(self.fc6(x))
x = torch.tanh(self.fc7(x))
x = self.fc8(x)
return torch.softmax(x, dim=1)