首页 > 其他分享 >FedR——攻击代码的学习

FedR——攻击代码的学习

时间:2023-07-28 20:44:27浏览次数:44  
标签:攻击 代码 list ent FedR c1 c0 data embed

攻击客户机1
这段代码是用于进行攻击的部分。它试图通过使用客户端0的信息(实体嵌入和关系嵌入)来破解客户端1的信息(部分实体和关系的嵌入)。攻击的过程包括以下步骤:

  1. 加载训练得到的模型参数:通过torch.load()函数加载之前训练得到的模型参数,其中ent_embedrel_embed分别表示实体嵌入和关系嵌入。

  2. 创建客户端0的字典信息:从数据中提取客户端0的实体,并将其与对应的实体嵌入组成字典c0_ent_embed_dict

  3. 对客户端0的实体进行映射:由于在客户端1的数据中,实体的索引可能与客户端0的数据中不同,因此需要建立映射关系c0_mapping来将客户端0的实体索引映射到客户端1的实体索引。

  4. 在客户端1上执行攻击:对客户端1进行攻击,通过在客户端1的实体池中选择一部分实体(由p参数控制选择比例),然后计算这些实体与客户端0的实体的嵌入之间的余弦距离,并选择距离最近的客户端0的实体作为对应的伪造实体,形成伪造实体列表syc_ent_list

  5. 计算攻击成功率:计算成功破解的实体的比例和关系的比例,即伪造实体列表中与客户端1的实体池中实体相同的实体数量与客户端1数据中所有三元组数量之间的比值。

请注意,这段代码是为了演示攻击方法,并且使用余弦距离来测量实体之间的相似性。在实际应用中,可能需要更复杂的攻击策略和更准确的相似性度量来实现更高效的攻击。
已知客户机0的信息,攻击客户机1的信息

import torch
import pickle
import numpy as np
import random
from scipy import spatial

emb = torch.load('./state/fb15k237_fed3_fed_TransE.best', map_location=torch.device('cpu'))
ent_embed = emb['ent_embed']
rel_embed = emb['rel_embed']
data = pickle.load(open("Fed_data/FB15K237-Fed3.pkl", "rb" ))

#生成第一个客户端的字典信息
c0_ent = np.unique(data[0]['train']['edge_index'])
c0_ent_embed_dict = {}
value = ent_embed[0]
for idx,ent in enumerate(c0_ent):
    c0_ent_embed_dict[ent] = value[idx]

c0_mapping = dict(zip(data[0]['train']['edge_index'][0], data[0]['train']['edge_index_ori'][0]))
c0_mapping.update(dict(zip(data[0]['train']['edge_index'][1], data[0]['train']['edge_index_ori'][1])))

c0_ent_embed_dict_mapped = dict((c0_mapping[key], value) for (key, value) in c0_ent_embed_dict.items())
c0_ent_pool_mapped = [c0_mapping[i] for i in c0_ent]

# map local to global
c1_mapping = dict(zip(data[1]['train']['edge_index'][0], data[1]['train']['edge_index_ori'][0]))
c1_mapping.update(dict(zip(data[1]['train']['edge_index'][1], data[1]['train']['edge_index_ori'][1])))


c1_ent = np.unique(data[1]['train']['edge_index'])

random.seed(10)
np.random.seed(10)
p = 1

c1_ent_pool = np.random.choice(c1_ent, int(p * len(c1_ent)), replace = False)
c1_ent_embed = ent_embed[1][[c1_ent_pool]]

c1_ent_pool_mapped = [c1_mapping[i] for i in c1_ent_pool]

syn_ent_list = [] # synthetic entity label

for i in c1_ent_pool:
    c1_ent_embed = ent_embed[1][i]
    count = 0
    loss_bound = 0
    ent_idx = []
    for j in c0_ent_embed_dict_mapped:
        loss = spatial.distance.cosine(c1_ent_embed.detach().numpy(), c0_ent_embed_dict_mapped[j].detach().numpy())
        if count == 0: # first round
            loss_bound = loss
            ent_idx.append(j)
            count += 1
        else:
            if loss < loss_bound:
                loss_bound = loss
                ent_idx.append(j)
    syn_ent_list.append(ent_idx[-1]) # global index of the entity

tru_ent_list = [c1_mapping[i] for i in c1_ent_pool]
# calculate the number of correct reconstruction
sum(first == second for (first, second) in zip(syn_ent_list, tru_ent_list)) / len(c1_ent)

c0_rel = np.unique(data[0]['train']['edge_type_ori'])
# creat relation pool based on selected entities (global relation index)
c1_triple_all = np.array([data[1]['train']['edge_index_ori'][0],
                          data[1]['train']['edge_type_ori'],
                          data[1]['train']['edge_index_ori'][1]])

tru_trr_list = []
# the adversary knows all relation embeddings and their corresponding index, so here we use ori directly
len_c1_triple = c1_triple_all[0].shape[0]
for i in range(len_c1_triple):
    triple = c1_triple_all[:,i]
    h, r, t= triple[0], triple[1], triple[2]
    if (h in c1_ent_pool_mapped) and (t in c1_ent_pool_mapped):
        if h not in tru_trr_list:
            tru_trr_list.append(h)
        if t not in tru_trr_list:
            tru_trr_list.append(t)

syn_trr_list = []
for (first, second) in zip(syn_ent_list, tru_ent_list):
    if first == second:
        syn_trr_list.append(first)

# calculate the number of correct reconstruction
len(list(set(syn_trr_list).intersection(tru_trr_list))) / len_c1_triple

标签:攻击,代码,list,ent,FedR,c1,c0,data,embed
From: https://www.cnblogs.com/csjywu01/p/17588867.html

相关文章

  • Git代码托管服务
           ......
  • 命令执行_代码执行漏洞
    远程代码注入漏洞原理攻击者可利用代码注入漏洞执行任意代码,来操作服务器危害执行任意代码,来操作服务器操作数据库,插入恶意数据,可能获取系统权限攻击修改系统配置,修改网络配置,可能对服务器及网络造成影响可以进一步对网络渗透,由于代码注入攻击多半可获取系统权限,对网络的......
  • 5 线性数据结构 参考代码
    P3156[深基15.例1]询问学号#include<cstdio>constintMAXN=2000005;inta[MAXN];intmain(){intn,m;scanf("%d%d",&n,&m);for(inti=0;i<n;++i)scanf("%d",&a[i]);while(m--){int......
  • lazy 线段树代码
    描述 代码:1classNode{2intl,r;3intsum;4intlazy;5}67classSegmentTree{89privateNode[]tree;1011privateint[]nums;1213publicSegmentTree(int[]nums){14intn=nums.length;15......
  • idea远程连接服务器代码,进行debug操作
    1.配置远程断点 2.将你的springboot项目上传至远程服务器3.在你的远程服务器通过下面的命令启动你的项目nohupjava-Xdebug-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005-jarmonitor_26-0.0.1-SNAPSHOT.jar--server.port=8000>nohup.log......
  • 4 前缀和与差分 参考代码
    P8218[深进1.例1]求区间和数列\(\{a_n\}\)的前缀和为\(S_n=\sum_{i=1}^{n}a_i=a_1+a_2+\cdots+a_n\)则区间\([l,r]\)的区间和为\(a_l+a_{l+1}+\cdots+a_r=S_r-S_{l-1}\)预处理出前缀和,则单次区间和的查询就做到了\(O(1)\)复杂度#include<cs......
  • 如何在VSCode中配置GitHub GPT代码辅助提示工具
    安装GitHubGPT插件(如果有的话):在VSCode扩展市场中搜索并安装GitHubGPT插件。该插件可能还不存在,如果是这样,你可能需要开发自定义的代码提示插件。在此假设有一个现有的插件可用。安装VSCode:如果你还没有VSCode,首先要安装它。你可以从VSCode的官方网站(http://www.duozitu.com......
  • 写一段python爬虫下载登录用户商品图片的代码
    要下载登录用户的商品图片,你需要模拟登录网站并获取登录后的会话。下面是一个示例代码,用于登录网站并下载登录用户的商品图片:importrequestsimportosfrombs4importBeautifulSoupdeflogin(username,password):login_url="https://example.com/login"sessio......
  • zabbixn 源码中 ui / frontends 文件夹下的代码文件负责的是哪方面的职责
    ui/frontends代码的职责通过下载源码查看,可以看到在zabbix-4.X中前端代码在frontends目录下,zabbix-6.X在ui目录下,虽然换了个马甲,但里面都是一些php文件。在Zabbix源码中,ui/frontends文件夹下的代码文件负责处理与用户界面(UI)相关的职责。这些文件包含了Zabbix前端......
  • 3.2 排序 参考代码
    P1059[NOIP2006普及组]明明的随机数计数排序#include<cstdio>inta[1005];intmain(){ intn,cnt=0; scanf("%d",&n); for(inti=1;i<=n;i++){ intx;scanf("%d",&x); if(a[x]==0){//这个数没出现过(第一次出现) a[x]=......