pyg-team / pytorch_geometric

Graph Neural Network Library for PyTorch
https://pyg.org
MIT License
21.24k stars 3.64k forks source link

Create only one batch for data #1357

Closed hagianga21 closed 4 years ago

hagianga21 commented 4 years ago

❓ Questions & Help

Hi, my dataset size is 32. I only want to create one batch and feed them all to my network. How could I do it? Thank you so much.

rusty1s commented 4 years ago
data = Batch.from_data_list(dataset)
hagianga21 commented 4 years ago

Hi, I got this error: IndexError: dimension specified as 0 but tensor has no dimensions

Here is my list: [Data(B_corr=[3, 2], edge_index=[2, 736], pos=[97, 2], val=[], valid_set=[3], x=[100, 2], xn=[2, 1], y=[100, 1]), Data(B_corr=[3, 2], edge_index=[2, 686], pos=[92, 2], val=[], valid_set=[8], x=[100, 2], xn=[2, 1], y=[100, 1]), Data(B_corr=[3, 2], edge_index=[2, 618], pos=[85, 2], val=[], valid_set=[15], x=[100, 2], xn=[2, 1], y=[100, 1]), Data(B_corr=[3, 2], edge_index=[2, 694], pos=[93, 2], val=[], valid_set=[7], x=[100, 2], xn=[2, 1], y=[100, 1]), Data(B_corr=[3, 2], edge_index=[2, 756], pos=[99, 2], val=[], valid_set=[1], x=[100, 2], xn=[2, 1], y=[100, 1]), Data(B_corr=[3, 2], edge_index=[2, 638], pos=[87, 2], val=[], valid_set=[13], x=[100, 2], xn=[2, 1], y=[100, 1]), Data(B_corr=[3, 2], edge_index=[2, 660], pos=[89, 2], val=[], valid_set=[11], x=[100, 2], xn=[2, 1], y=[100, 1]), Data(B_corr=[3, 2], edge_index=[2, 744], pos=[98, 2], val=[], valid_set=[2], x=[100, 2], xn=[2, 1], y=[100, 1])]

rusty1s commented 4 years ago

What's the value of val? Can you cast it to a 1-dim tensor?

hagianga21 commented 4 years ago

Awesome. Thank you so much.

hagianga21 commented 4 years ago

When I pass again to my network, it gives the errors: RuntimeError: copy_if failed to synchronize: cudaErrorAssert: device-side assert triggered

My Data: Batch(B_corr=[24, 2], B_corr_batch=[24], batch=[800], edge_index=[2, 5386], pos=[723, 2], pos_batch=[723], val=[8, 1], valid_set=[77], x=[800, 2], xn=[16, 1], y=[800, 1])

My Network: ` class DQN(torch.nn.Module): def init(self, n_actions): super(DQN, self).init() self.conv1 = GCNConv(2, 32) self.conv2 = GCNConv(32, 16)

    self.lin1 = torch.nn.Linear(2, 16)
    self.lin2 = torch.nn.Linear(32, 16)
    self.lin3 = torch.nn.Linear(16, n_actions)

def forward(self, data):
    #Process Data
    pos, edge_index, xn, val, B_corr, valid_set = data.pos, data.edge_index, data.xn, data.val, data.B_corr, data.valid_set
    pos_batch = data.pos_batch
    B_corr_batch = data.B_corr_batch

    #Branch 1
    x = self.conv1(pos, edge_index)
    x = F.relu(x)
    x = F.dropout(x, training=self.training)
    x = self.conv2(x, edge_index)

    x = global_max_pool(x, pos_batch)

    #Add Corr Features
    corr_features = self.lin1(B_corr)
    corr_features = global_max_pool(corr_features, B_corr_batch)

    #Total branch
    x = torch.cat([x, corr_features], dim=1)
    #print(x.shape)
    x = self.lin2(x)
    x = self.lin3(x)

    return x `

Does it because of different input size elements in batch?

rusty1s commented 4 years ago

Can you look at the error message when running on CPU?

hagianga21 commented 4 years ago

RuntimeError Traceback (most recent call last)

in 3 model.train() 4 datareal = datatest ----> 5 out = model(datareal.to(device)) 6 #print(out) 7 #print(out.max(1)[1].item()) ~/anaconda3/envs/cs231n36/lib/python3.6/site-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs) 530 result = self._slow_forward(*input, **kwargs) 531 else: --> 532 result = self.forward(*input, **kwargs) 533 for hook in self._forward_hooks.values(): 534 hook_result = hook(self, input, result) in forward(self, data) 23 24 #Branch 1 ---> 25 x = self.conv1(pos, edge_index) 26 x = F.relu(x) 27 x = F.dropout(x, training=self.training) ~/anaconda3/envs/cs231n36/lib/python3.6/site-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs) 530 result = self._slow_forward(*input, **kwargs) 531 else: --> 532 result = self.forward(*input, **kwargs) 533 for hook in self._forward_hooks.values(): 534 hook_result = hook(self, input, result) ~/anaconda3/envs/cs231n36/lib/python3.6/site-packages/torch_geometric/nn/conv/gcn_conv.py in forward(self, x, edge_index, edge_weight) 100 edge_index, norm = self.norm(edge_index, x.size(self.node_dim), 101 edge_weight, self.improved, --> 102 x.dtype) 103 else: 104 norm = edge_weight ~/anaconda3/envs/cs231n36/lib/python3.6/site-packages/torch_geometric/nn/conv/gcn_conv.py in norm(edge_index, num_nodes, edge_weight, improved, dtype) 77 78 row, col = edge_index ---> 79 deg = scatter_add(edge_weight, row, dim=0, dim_size=num_nodes) 80 deg_inv_sqrt = deg.pow(-0.5) 81 deg_inv_sqrt[deg_inv_sqrt == float('inf')] = 0 RuntimeError: Invalid index in scatterAdd at /opt/conda/conda-bld/pytorch_1579022034529/work/aten/src/TH/generic/THTensorEvenMoreMath.cpp:721 The above operation failed in interpreter. Traceback (most recent call last): File "/home/giang/anaconda3/envs/cs231n36/lib/python3.6/site-packages/torch_scatter/scatter.py", line 22 size[dim] = int(index.max()) + 1 out = torch.zeros(size, dtype=src.dtype, device=src.device) return out.scatter_add_(dim, index, src) ~~~~~~~~~~~~~~~~ <--- HERE else: return out.scatter_add_(dim, index, src)
rusty1s commented 4 years ago

That indicates that edge_index has a value greater than 722. That may happen because it shapes of x and pos do not match. You can fix that by setting data.num_nodes explicitly for each graph.

hagianga21 commented 4 years ago

Thank you so much. It's solved.