当前位置:网站首页>June 29, 2022 daily

June 29, 2022 daily

2022-07-05 06:23:00 mentalps

0 2022/6/29

1 Code

1.1 Calculate cosine similarity between update parameters

import numpy as np
def cos_sim(vector_a, vector_b):
    vector_a = np.mat(vector_a)
    vector_b = np.mat(vector_b)
    num = float(vector_a * vector_b.T)
    denom = np.linalg.norm(vector_a) * np.linalg.norm(vector_b)
    cos = num / denom
    sim = 0.5 + 0.5 * cos
    return sim

def weights_reshape(weights):
    new_weights = np.hstack((weights[0].reshape(-1), weights[1].reshape(-1), weights[2].reshape(-1), weights[3].reshape(-1)))
    return new_weights

def client_cos_sim(client_weights):
    all_cos = np.array([[0]*len(client_weights)]*len(client_weights), dtype=float)
    for i in range(len(client_weights)):
        for j in range(len(client_weights)):
            all_cos[i][j] = cos_sim(client_weights[i], client_weights[j])
    return all_cos

1.2 Aggregate clients whose similarity is higher than a certain value

import numpy as np

import data
import model

import aggregator
import classification
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import seaborn as sns
ClientNum = 5
EPOCH = 5
if __name__ == '__main__':
    data1, shards, x_test, y_test = data.generate_client_data(ClientNum)
    model_client = []
    for i in range(ClientNum):
        model_client.append(model.Model())

    global_model = model.Model()
    # shards[0] = data.generate_malice_data(shards[0])
    # shards[1] = data.generate_malice_data(shards[1])
    all_weights = []
    x_all = []
    y_all = []
    for i in range(ClientNum):
        xx, yy = zip(*shards[i])
        xx = np.array(xx)
        yy = np.array(yy)

        x_all.append(xx)
        y_all.append(yy)
    a_0 = np.argmax(global_model.predict(x_all[0][0:784]))
    global_model.saveModel('sever_model')
    for i in range(ClientNum):
        np.argmax(model_client[i].predict(x_all[0][0:784]))
    for i in range(EPOCH):
        client_difference_value = []
        client_difference_value_reshape = []
        for j in range(ClientNum):
            model_client[j].setWeights(global_model.getWeights())
        for j in range(ClientNum):
            model_client[j].run(x_all[j], y_all[j])
            all_weights.append(model_client[j].getWeights())
        for j in range(ClientNum):
            client_difference_value.append(np.array(global_model.getWeights()) - np.array(model_client[j].getWeights()))
            client_difference_value_reshape.append(classification.weights_reshape(client_difference_value[j]))
        all_cos = classification.client_cos_sim(client_difference_value_reshape)
        fedavg = aggregator.FedAvg(global_model, client_difference_value, ClientNum)
        global_model.saveModel('sever_model')
    x = []
    y = []
    for i in range(len(x_test)):
        if y_test[i] == 1:
            x.append(x_test[i])
            y.append(y_test[i])

    test_loss, test_acc = global_model.evaluate(x_test, y_test, verbose=2)
    print('\nTest accuracy:', test_acc)
    print(' Number of models :', len(all_weights))

原网站

版权声明
本文为[mentalps]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/186/202207050618520753.html