Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 基于pytorch的图分类_Python 3.x_Machine Learning_Deep Learning_Pytorch - Fatal编程技术网

Python 3.x 基于pytorch的图分类

Python 3.x 基于pytorch的图分类,python-3.x,machine-learning,deep-learning,pytorch,Python 3.x,Machine Learning,Deep Learning,Pytorch,我正在尝试执行图形分类。我有一个DGL图列表,如下所示 DGLGraph(num_nodes=64267, num_edges=155523, ndata_schemes={} edata_schemes={'norm': Scheme(shape=(), dtype=torch.float32), 'rel_type': Scheme(shape=(17,), dtype=torch.float64) 它对应的标签是张量([0,1])。因为我不熟悉Pyto

我正在尝试执行图形分类。我有一个DGL图列表,如下所示

DGLGraph(num_nodes=64267, num_edges=155523,
         ndata_schemes={}
         edata_schemes={'norm': Scheme(shape=(), dtype=torch.float32), 'rel_type': Scheme(shape=(17,), dtype=torch.float64)
它对应的标签是张量([0,1])。因为我不熟悉Pytork,所以我一直在遵循一个示例。 模型定义如下所示

def gcn_message(edges):
    # The argument is a batch of edges.
    # This computes a (batch of) message called 'msg' using the source node's feature 'h'.
    return {'msg' : edges.src['h']}

def gcn_reduce(nodes):
    # The argument is a batch of nodes.
    # This computes the new 'h' features by summing received 'msg' in each node's mailbox.
    return {'h' : torch.sum(nodes.mailbox['msg'], dim=1)}

# Define the GCNLayer module
class GCNLayer(nn.Module):
    def __init__(self, in_feats, out_feats):
        super(GCNLayer, self).__init__()
        self.linear = nn.Linear(in_feats, out_feats)

    def forward(self, g, inputs):
        # g is the graph and the inputs is the input node features
        # first set the node features
        g.ndata['h'] = inputs
        # trigger message passing on all edges
        g.send(g.edges(), gcn_message)
        # trigger aggregation at all nodes
        g.recv(g.nodes(), gcn_reduce)
        # get the result node features
        h = g.ndata.pop('h')
        # perform linear transformation
        return self.linear(h)

class GCN(nn.Module):
    def __init__(self, in_feats, hidden_size, num_classes):
        super(GCN, self).__init__()
        self.gcn1 = GCNLayer(in_feats, hidden_size)
        self.gcn2 = GCNLayer(hidden_size, num_classes)

    def forward(self, g, inputs):
        h = self.gcn1(g, inputs)
        h = torch.relu(h)
        h = self.gcn2(g, h)
        return h
# The first layer transforms input features of size of 41 to a hidden size of 5.
# The second layer transforms the hidden layer and produces output features of
# size 2, corresponding to the two classification groups
net = GCN(7, 16, 2)

for epoch in range(epochs):
    epoch_loss = 0
    epoch_logits = []
    labs = []
    # Iterate over batches
    for i, (bg, labels) in enumerate(train_loader):
        logits = net(bg, bg.ndata['h'])
        # we save the logits for visualization later
        train_logits.append(logits.detach().numpy())
        epoch_logits.append(logits.detach().numpy()) 
        labs.append(labels.unsqueeze(1).detach().numpy())
        logp = F.softmax(logits, 1)
        loss = loss_fn(logp,labels)
调用loss\u fn时,我得到一个错误值error:Expected input batch\u size(64267)与目标batch\u size(64)匹配。。出于某种原因,我的图中的每个节点都被视为不同的输入值,模型会为其返回一个预条件。校对定义为:

def collate(samples):
    # The input `samples` is a list of pairs
    #  (graph, label).
    graphs, labels = map(list, zip(*samples))
    batched_graph = dgl.batch(graphs, node_attrs='h')
    batched_graph.set_n_initializer(dgl.init.zero_initializer)
    batched_graph.set_e_initializer(dgl.init.zero_initializer)
    return batched_graph, torch.stack(labels)
我在另一个模型中使用了这个比较,在这个模型中我使用了dgllife.model.model_zoo.gcnprodictor,它不会产生任何问题