Федеративное обучение с зашифрованной градиентной агрегацией - PullRequest
0 голосов
/ 20 февраля 2020

Я хотел бы провести федеративное обучение с зашифрованной градиентной агрегацией. Для этого я обучил модель из набора данных следующим образом:

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)

Однако, когда я не разделяю модель среди рабочих, она успешно делает предсказание , Буду признателен, если вы поможете мне в том, что мне здесь не хватает.

...