When I use the synthetic dataset not only for training, but also for testing and then change the batch size for testing only, I get different results. I think the test batch size should not have any influence on the final accuracy.
import os.path as osp
import random
import argparse
import torch
from torch_geometric.data import Data, DataLoader
import torch_geometric.transforms as T
from dgmc.models import DGMC, SplineCNN
parser = argparse.ArgumentParser()
parser.add_argument('--dim', type=int, default=256)
parser.add_argument('--rnd_dim', type=int, default=64)
parser.add_argument('--num_layers', type=int, default=2)
parser.add_argument('--num_steps', type=int, default=10)
args = parser.parse_args()
class RandomGraphDataset(torch.utils.data.Dataset):
def __init__(self, min_inliers, max_inliers, min_outliers, max_outliers,
min_scale=0.9, max_scale=1.2, noise=0.05, transform=None, len=32):
self.min_inliers = min_inliers
self.max_inliers = max_inliers
self.min_outliers = min_outliers
self.max_outliers = max_outliers
self.min_scale = min_scale
self.max_scale = max_scale
self.noise = noise
self.transform = transform
self.len = len
def __len__(self):
return self.len
def __getitem__(self, idx):
# get always different but reproducible instance
random.seed(idx)
torch.manual_seed(idx)
num_inliers = random.randint(self.min_inliers, self.max_inliers)
num_outliers = random.randint(self.min_outliers, self.max_outliers)
pos_s = 2 * torch.rand((num_inliers, 2)) - 1
pos_t = pos_s + self.noise * torch.randn_like(pos_s)
y_s = torch.arange(pos_s.size(0))
y_t = torch.arange(pos_t.size(0))
pos_s = torch.cat([pos_s, 3 - torch.rand((num_outliers, 2))], dim=0)
pos_t = torch.cat([pos_t, 3 - torch.rand((num_outliers, 2))], dim=0)
data_s = Data(pos=pos_s, y_index=y_s)
data_t = Data(pos=pos_t, y=y_t)
if self.transform is not None:
data_s = self.transform(data_s)
data_t = self.transform(data_t)
data = Data(num_nodes=pos_s.size(0))
for key in data_s.keys:
data['{}_s'.format(key)] = data_s[key]
for key in data_t.keys:
data['{}_t'.format(key)] = data_t[key]
return data
transform = T.Compose([
T.Constant(),
T.KNNGraph(k=8),
T.Cartesian(),
])
path = osp.join('..', 'data', 'PascalPF')
test_dataset = RandomGraphDataset(30, 60, 0, 20, transform=transform, len=64)
device = 'cuda' if torch.cuda.is_available() else 'cpu'
psi_1 = SplineCNN(1, args.dim, 2, args.num_layers, cat=False, dropout=0.0)
psi_2 = SplineCNN(args.rnd_dim, args.rnd_dim, 2, args.num_layers, cat=True,
dropout=0.0)
model = DGMC(psi_1, psi_2, num_steps=args.num_steps).to(device)
@torch.no_grad()
def test(dataset, batch_size=1):
model.eval()
test_loader = DataLoader(dataset, batch_size=batch_size, shuffle=False,
follow_batch=['x_s', 'x_t'])
correct = num_examples = 0
for i, data in enumerate(test_loader):
data = data.to(device)
S_0, S_L = model(data.x_s, data.edge_index_s, data.edge_attr_s,
data.x_s_batch, data.x_t, data.edge_index_t,
data.edge_attr_t, data.x_t_batch)
y = torch.stack([data.y_index_s, data.y_t], dim=0)
correct += model.acc(S_L, y, reduction='sum')
num_examples += y.size(1)
return correct / num_examples
# no training for minimal example
test_acc1 = 100 * test(test_dataset, 1)
test_acc4 = 100 * test(test_dataset, 4)
print(f'Acc1: {test_acc1:.2f}, Acc4: {test_acc4:.2f}')