Я хотел бы провести федеративное обучение с зашифрованной градиентной агрегацией. Для этого я обучил модель из набора данных следующим образом:
class Network(nn.Module):
def __init__(self):
super(Network, self).__init__()
self.fc1 = nn.Linear(784, 256)
self.fc2 = nn.Linear(256, 128)
self.fc3 = nn.Linear(128, 64)
self.fc4 = nn.Linear(64, 10)
def forward(self, x):
x = x.view(-1, 784)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = F.relu(self.fc3(x))
x = F.log_softmax(self.fc4(x), dim=1)
return x
def train(model, criterion, opt, iterations=10):
model.train()
for iter in range(iterations):
for i, (images, label) in enumerate(train_loader):
opt.zero_grad()
pred = model(images.float())
loss = criterion(pred, label)
loss.backward()
opt.step()
model = Network()
opt = optim.SGD(model.parameters(), lr=0.003)
criterion= nn.NLLLoss()
train(model, criterion, opt)
И затем поделился ею с работниками:
model.fix_precision().share(bob, alice, crypto_provider = w_aggrigator)
После этого я поделился данными испытаний среди работников следующим образом:
test_loader = th.utils.data.DataLoader(public_data_test, shuffle=False, batch_size=batch_size)
shared_test = []
for data, target in test_loader:
shared_test.append((
data.fix_prec().share(bob, alice, crypto_provider = w_aggrigator),
target.fix_prec().share(bob, alice, crypto_provider = w_aggrigator)
))
Но, когда я попытался сделать прогноз на тестовом наборе, возникает ошибка. Вот часть предсказания:
output = th.zeros(0, dtype=th.long)
model.eval()
for data, label in test_loader:
new_labels = model(data.float()) # Error is raised on this line
ps = th.argmax(th.exp(new_labels), dim=1)
output = th.cat((output, ps))
И вот короткая ошибка:
IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1)
Однако, когда я не разделяю модель среди рабочих, она успешно делает предсказание , Буду признателен, если вы поможете мне в том, что мне здесь не хватает.