DGL实现同构/异构图卷积模型

同构图卷积

from time import time
import numpy as np
import dgl
import torch
import torch.nn as nn
import torch.nn.functional as F# 模型
class TwoLayerModel(nn.Module):def __init__(self):super().__init__()# gcnself.conv1 = dgl.nn.GraphConv(256, 128)self.conv2 = dgl.nn.GraphConv(128, 128)# gat 同理,但是因为是3head,输出就变成了output_dim*3了,要注意一下其他地方维度变化# self.conv1 = dgl.nn.pytorch.conv.GATConv(256, 128, num_heads=3)# self.conv2 = dgl.nn.pytorch.conv.GATConv(3 * 128, 128, num_heads=3)layer_size = [128, 64, 32, 1]self.predict = nn.Sequential()for j in range(len(layer_size) - 1):self.predict.add_module("Linear_layer_%d" % j, nn.Linear(layer_size[j], layer_size[j + 1]))if j == len(layer_size) - 2:self.predict.add_module("Sigmoid_layer_%d" % j, nn.Sigmoid())else:self.predict.add_module("Relu_layer_%d" % j, nn.ReLU())self.lossfunc = nn.BCELoss(reduction='sum')self.epsilon = torch.FloatTensor([1e-12]) # 防除0def forward(self, blocks, x, label):x = self.feat_mapping[x]x = F.relu(self.conv1(blocks[0], x))x = F.relu(self.conv2(blocks[1], x))label = label.reshape(-1, 1).float()prob = self.predict(x / (torch.max(torch.norm(x, dim=1, keepdim=True), self.epsilon)))loss = self.lossfunc(prob, label)# 用于预测yp = prob.squeeze().detach().numpy()yt = label.squeeze().detach().numpy()return loss# 数据
def loadData(path):uu_fn = ["uu_tr.csv", "uu_te.csv"]  # user relationuf_fn = ["uf_tr.csv", "uf_te.csv"]  # user featurebg_l = []for i in range(2):uu = pd.read_csv(path + uu_fn[i], header=0)uf = pd.read_csv(path + uf_fn[i], header=0)g = dgl.graph((th.tensor(uu['uid'].values), th.tensor(uu['fid'].values)), num_nodes=uf.shape[0])bg = dgl.to_bidirected(g)bg = dgl.add_self_loop(bg)bg.ndata['feat'] = th.LongTensor(uf.iloc[:, 1:].values)print(bg)bg_l.append(bg)with open(path + "u_train_test.pickle", "rb") as fp:X_train_p, X_train_n, X_test_p, X_test_n = pickle.load(fp)train_label_map = torch.zeros(max(X_train_p + X_train_n) + 1)train_label_map[torch.LongTensor(X_train_p)] = 1test_label_map = torch.zeros(max(X_test_p + X_test_n) + 1)test_label_map[torch.LongTensor(X_test_p)] = 1return bg_l, X_train_p, X_train_n, X_test_p, X_test_n, train_label_map, test_label_map# 训练
if __name__ == "__main__":model = TwoLayerModel()optimizer = torch.optim.Adam(model.parameters(), lr=0.001, weight_decay=0.001)bg_l, X_train_p, X_train_n, X_test_p, X_test_n, train_label_map, test_label_map = loadData("../data_"+args.dataPercesent+"/")sampler = dgl.dataloading.MultiLayerFullNeighborSampler(2)dataloader = dgl.dataloading.NodeDataLoader(dgl.add_self_loop(bg_l[0]), X_train_p + X_train_n, sampler, batch_size=1024 * 8, shuffle=True, drop_last=False)dataloader2 = dgl.dataloading.NodeDataLoader(dgl.add_self_loop(bg_l[1]), X_test_p + X_test_n, sampler, batch_size=len(X_test_p + X_test_n), shuffle=False, drop_last=False)# trainr_l, p_l, f_l = [], [], []for epoch in range(200):t0 = time()model.train()train_loss = 0.for input_nodes, output_nodes, blocks in dataloader:optimizer.zero_grad()input_features = blocks[0].srcdata['feat']loss = model(blocks, input_features, train_label_map[torch.LongTensor(output_nodes)])loss_.backward()optimizer.step()train_loss += loss_.item()t1 = time()model.eval()with torch.no_grad():for input_nodes, output_nodes, blocks in dataloader2:input_features = blocks[0].srcdata['feat']test_loss= model(blocks, input_features, test_label_map[torch.LongTensor(output_nodes)])t2 = time()log.record('epoch[%d],TrainLoss[%.2f],TestLoss[%.2f],time[%.1f + %.1f]' % (epoch, train_loss, test_loss.item(), t1 - t0, t2 - t1))

异构图卷积

from time import time
import torch
import torch.nn as nn
import random
from torch.optim import lr_scheduler
import dgl
import dgl.function as fn
import numpy as np
import pandas as pd# 模型定义
class HeteroGNN(nn.Module):def __init__(self, G):super(HeteroGNN, self).__init__()self.G = Gself.hgl = HeteroRGCNLayer()self.G.nodes['group'].data['emb'] = nn.Parameter(torch.randn(3320,64))self.G.nodes['ip'].data['emb'] = nn.Parameter(torch.randn(1242,64))self.uf_mapping = nn.Linear(88, 64)self.gf_mapping = nn.Linear(33, 64)self.pf_mapping = nn.Linear(690, 64)self.weight = nn.ModuleDict({'user': nn.Sequential(nn.Linear(64, 1), nn.Sigmoid()),'group': nn.Sequential(nn.Linear(64, 1), nn.Sigmoid())})layer_size = [128, 64, 32, 1]self.predict = nn.Sequential()for j in range(len(layer_size) - 1):self.predict.add_module("Linear_layer_%d" % j, nn.Linear(layer_size[j], layer_size[j + 1]))if j == len(layer_size) - 2:self.predict.add_module("Sigmoid_layer_%d" % j, nn.Sigmoid())else:self.predict.add_module("Relu_layer_%d" % j, nn.ReLU())self.lossfunc = nn.BCELoss()def forward(self, up, un, flag):# 对user/group的属性特征编码self.G.nodes['user'].data['emb'] = self.uf_mapping(self.G.nodes['user'].data['feat'])self.G.nodes['group'].data['emb'] = self.gf_mapping(self.G.nodes['group'].data['feat'])self.G.nodes['ip'].data['emb'] = self.pf_mapping(self.G.nodes['ip'].data['feat'])# 采样# self.G.nodes['user'].data['s'] = self.weight['user'](self.G.nodes['user'].data['emb'])# self.G.nodes['group'].data['s'] = self.weight['group'](self.G.nodes['group'].data['emb'])# for etype in self.G.etypes:#     self.G.apply_edges(message_func, etype=etype)# SG = dgl.sampling.select_topk(self.G, {'have': 6, 'belong': 6, 'trust': 6}, 's', edge_dir='in', ascending=True)SG = self.Gself.hgl(SG)user = torch.LongTensor(np.concatenate([np.array(up), np.array(un)], 0))label = torch.LongTensor(np.concatenate([np.ones(len(up)), np.zeros(len(un))], 0)).reshape(-1, 1).float()user_femb = self.predict1(self.G.nodes['user'].data['h'])prob = self.predict2(user_femb[user])loss = self.lossfunc(prob, label)# 预测yp1 = prob.squeeze().detach().numpy()yt = label.detach().numpy()return lossclass HeteroRGCNLayer(nn.Module):def __init__(self):super(HeteroRGCNLayer, self).__init__()self.weight = nn.ModuleDict({'user': nn.Sequential(nn.Linear(64, 32)),'group': nn.Sequential(nn.Linear(64, 32)),'ip': nn.Sequential(nn.Linear(64, 32)),})def forward(self, G):# 聚合user到group上funcs = {}srctype, etype, dsttype = 'user', 'belong', 'group'G.nodes[srctype].data['Wh'] = self.weight[srctype](G.nodes[srctype].data['emb'])funcs[etype] = (fn.copy_u('Wh', 'm'), fn.max('m', 'guh'))# 聚合user到ip上srctype, etype, dsttype = 'user', 'belong2', 'ip'funcs[etype] = (fn.copy_u('Wh', 'm'), fn.max('m', 'puh'))G.multi_update_all(funcs, 'max')# 聚合group到user上funcs = {}srctype, etype, dsttype = 'group', 'have', 'user'G.nodes[srctype].data['Wh'] = self.weight[srctype](G.nodes[srctype].data['emb'])funcs[etype] = (fn.copy_u('Wh', 'm'), fn.max('m', 'gh'))# 聚合ip到user上srctype, etype, dsttype = 'ip', 'have2', 'user'G.nodes[srctype].data['Wh'] = self.weight[srctype](G.nodes[srctype].data['emb'])funcs[etype] = (fn.copy_u('Wh', 'm'), fn.max('m', 'ph'))G.multi_update_all(funcs, 'max')# 聚合user到user上funcs = {}# funcs['trust'] = (fn.copy_u('Wh', 'm'), fn.max('m', 'uh'))funcs['have'] = (fn.copy_u('guh', 'm'), fn.max('m', 'uh'))funcs['have2'] = (fn.copy_u('puh', 'm'), fn.max('m', 'uh'))G.multi_update_all(funcs, 'max')G.nodes['user'].data['h'] = torch.cat([G.nodes['user'].data['Wh'], G.nodes['user'].data['uh'], G.nodes['user'].data['gh'],  G.nodes['user'].data['ph']], 1)# 加载数据
def loadData():ug = pd.read_csv("ug.csv")uf = pd.read_csv("user_feat.csv", sep=",", header=None)gf = pd.read_csv("group_feat.csv", sep=",", header=None)user_group = (th.tensor(ug['u'].values), th.tensor(ug['g'].values))group_user = (th.tensor(ug['g'].values), th.tensor(ug['u'].values))with open("data/u_train_test.pickle", "rb") as fp:up_train, up_test, un_train, un_test = pickle.load(fp)hg = dgl.heterograph({('user', 'belong', 'group'): user_group,('group', 'have', 'user'): group_user})hg.nodes['user'].data['feat'] = th.tensor(uf.values, dtype=th.float)hg.nodes['group'].data['feat'] = th.tensor(gf.values, dtype=th.float)return hg, up_train, up_test, un_train, un_test# 训练
if __name__ == "__main__":G, up_train, up_test, un_train, un_test = loadData()model = HeteroGNN(G)optimizer = torch.optim.Adam(model.parameters(), lr=0.005) save = Falser_l,p_l,f_l = [],[],[]# nusample = random.sample(un_test, k=len(up_test))for epoch in range(200):t0 = time()model.train()optimizer.zero_grad()neg = random.sample(un_train, k=5 * len(up_train))train_loss, tauc, tf1 = model(up_train, neg, 0)train_loss.backward()optimizer.step()t1 = time()model.eval()with torch.no_grad():test_loss = model(up_test, un_test, 0)t2 = time()print('epoch[%d],TrainLoss[%.2f],TestLoss[%.2f],time[%.1f + %.1f]' % (epoch, train_loss.item(), test_loss.item(),t1 - t0, t2 - t1))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Facebook提出生成式实体链接、文档检索,大幅刷新SOTA!

文 | 花小花Posy导言最近ICLR的rebutal 前后分数对比出来了,很多评委都改了分数,有改多的,也有改少的。今天给大家介绍的这篇高分论文竟然在rebuttal前后都保持高分,证明评委们对它的认可程度是很高的。实体检索任务的定义是&…

详解TCP协议的服务特点以及连接建立与终止的过程(俗称三次握手四次挥手)

转载请附本文的链接地址:http://blog.csdn.net/sahadev_/article/details/50780825 ,谢谢。 tcp/ip技术常常会在我们面试的时候出现,很多公司也要求需要掌握tcp/ip,socket等,所以掌握这项技术会为我们面试的时候加分。…

论文浅尝 | 知识库问答中关系检测的学习表示映射

论文笔记整理:吴涵,天津大学硕士,研究方向:自然语言处理。链接:Paper: https://arxiv.org/pdf/1907.07328v1.pdfCode: https://github.com/wudapeng268/KBQA-Adapter引入在关系检测任务中,对于训练数据中已…

LeetCode 1175. 质数排列

文章目录1. 题目2. 解题1. 题目 请你帮忙给从 1 到 n 的数设计排列方案,使得所有的「质数」都应该被放在「质数索引」(索引从 1 开始)上;你需要返回可能的方案总数。 让我们一起来回顾一下「质数」:质数一定是大于 1…

CV模型,全目标检测等

CV视频全目标检测:https://www.bilibili.com/video/BV1zi4y137Xy?p63

ICLR最高分论文揭秘模型泛化,GNN是潜力股

文 | Jerry Qiu编 | 小轶我们都知道,人类在很多任务上都可以很好地完成“外推”,例如:啊不——我是说——例如,我们学会两位数的加减乘除后,就可以轻松将其推广至任意大整数的四则运算:从数学的角度来讲&am…

Android系统原生应用解析之桌面闹钟及相关原理应用之时钟任务的应用(一)

前段时间我一个朋友在面试回来问我:那个公司要5天之内完成一个项目,功能包括每天早上6点开始执行定时任务,大批量图片上传,大批量数据库同步。我心想,后两个功能还好说,可就是每天早上6点开始执行的这种定时…

PyTorch 读取大数据

PyTorch 读取大数据 数据量太大,必须分批从磁盘加载,下面是单机单卡的思路: from torch.utils.data import Dataset, DataLoader import torchclass PretrainData(Dataset):def __init__(self):假设data是个数据量很大的文件,每…

配送交付时间轻量级预估实践

1. 背景 可能很多同学都不知道,从打开美团App点一份外卖开始,然后在半小时内就可以从骑手小哥手中拿到温热的饭菜,这中间涉及的环节有多么复杂。而美团配送技术团队的核心任务,就是将每天来自祖国各地的数千万份订单,迅…

论文浅尝 | 面向 cQA 的跨语言问题检索方法

论文笔记整理:谭亦鸣,东南大学博士生,研究方向为知识库问答。来源:WWW2019链接:https://dl.acm.org/citation.cfm?doid3308558.3313502本文提出了一种面向cQA的跨语言问题检索方法,旨在对于给定的问题检索…

揭秘Python并发编程——协程

原文链接:https://baijiahao.baidu.com/s?id1649450510185145678&wfrspider&forpc Python并发编程一直是进阶当中不可跨越的一道坎,其中包括进程、线程、协程,今天我们就来聊一聊协程。协程的定义很简单,从头到尾只有一条…

LeetCode 804. 唯一摩尔斯密码词(哈希+set)

文章目录1. 题目2. 解题1. 题目 国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如: “a” 对应 “.-”, “b” 对应 “-…”, “c” 对应 “-.-.”, 等等。 为了方便,所有26个英文字母对应摩尔…

Android系统原生应用解析之桌面闹钟及相关原理应用之时钟任务的应用(二)

这篇文章主要针对http://android.xsoftlab.net/training/scheduling/alarms.html#tradeoffs中的Scheduling Repeating Alarms一文进行大体翻译: Alarms(基于AlarmManager类)可以使你的应用在正常的生命周期之外执行基于时间的任务。举个例子,你可以使用…

Dataset、IterableDataset 读取大数据的思路

一、单进程读取数据 Dataset 在数据量很大,无法将全部数据加载到内存的情况下,可以在init中读出表数据行数,在__len__设置为长度返回,在__getitem__中根据idx读表,idx就可以表示读取的表的行数,一般在读表…

计算机基础晦涩难懂?那你是没看他的图解文章!

这年头,写计算机基础的人好之又少,能把枯燥无味的计算机基础写的通俗易懂的人更是少,而就有一位叫「小林coding」的公众号横空出世,真的是一股清流,他酷爱「图解」计算机基础文章,真正做到了图解&#xff0…

Litho在美团动态化方案MTFlexbox中的实践

1. MTFlexbox MTFlexbox是美团内部应用的非常成熟的一种跨平台动态化解决方案,它遵循了CSS3中提出的Flexbox规范来抹平多平台的差异。MTFlexbox适用于重展示、轻交互的业务场景,与现有HTML、React Native、Weex等跨平台方案相比,MTFlexbox具备…

服务器部署docker

服务器部署docker docker简介## 可以把docker是一个容器,可以让开发者将自己的项目部署到这个容器中,最常用的场景是将自己的后端项目部署到服务器的时候会将其打入docker镜像中,可以理解为一个开销更小的虚拟机。 docker好处## 可以轻易地让…

LeetCode 461. 汉明距离(异或^ 与)

文章目录1. 题目2. 解题1. 题目 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。 给出两个整数 x 和 y&#xff0c;计算它们之间的汉明距离。 注意&#xff1a; 0 ≤ x, y < 2^31.示例:输入: x 1, y 4输出: 2解释: 1 (0 0 0 1) 4 (0 1 0 0)…

论文浅尝 | NumNet: 一种带有数学推理的机器阅读理解模型

论文笔记整理&#xff1a;吴林娟。来源&#xff1a;EMNLP2019论文链接&#xff1a;https://arxiv.org/pdf/1910.06701.pdf开放源码&#xff1a;https://github.com/ranqiu92/NumNet概述本文提出了一个将数学推理融入机器阅读理解的模型——NumNet&#xff0c;其中利用数字感知的…

Android官方开发文档Training系列课程中文版:构建第一款安卓应用之入门指南

入门指南 欢迎来到安卓开发训练课&#xff0c;在这里你可以找到一系列课程来描述如何使用现有的代码示例来重新适用到你的APP上&#xff0c;你可以在左侧的导航栏顶部看到在若干个大项里有若干个有组织的子项课程。(导航栏请参见官方文档的导航栏) 在第一个大项里&#xff0c…