-
Notifications
You must be signed in to change notification settings - Fork 28
/
Copy pathmain.py
68 lines (59 loc) · 2.96 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import argparse
import pickle
import time
from util import Data, split_validation
from model import *
import os
parser = argparse.ArgumentParser()
parser.add_argument('--dataset', default='sample', help='dataset name: diginetica/Nowplaying/sample')
parser.add_argument('--epoch', type=int, default=30, help='number of epochs to train for')
parser.add_argument('--batchSize', type=int, default=100, help='input batch size')
parser.add_argument('--embSize', type=int, default=100, help='embedding size')
parser.add_argument('--l2', type=float, default=1e-5, help='l2 penalty')
parser.add_argument('--lr', type=float, default=0.001, help='learning rate')
parser.add_argument('--layer', type=float, default=3, help='the number of layer used')
parser.add_argument('--beta', type=float, default=0.01, help='ssl task maginitude')
parser.add_argument('--filter', type=bool, default=False, help='filter incidence matrix')
opt = parser.parse_args()
print(opt)
# os.environ['CUDA_VISIBLE_DEVICES'] = '0,1'
# torch.cuda.set_device(1)
def main():
train_data = pickle.load(open('../datasets/' + opt.dataset + '/train.txt', 'rb'))
test_data = pickle.load(open('../datasets/' + opt.dataset + '/test.txt', 'rb'))
if opt.dataset == 'diginetica':
n_node = 43097
elif opt.dataset == 'Tmall':
n_node = 40727
elif opt.dataset == 'Nowplaying':
n_node = 60416
else:
n_node = 309
train_data = Data(train_data, shuffle=True, n_node=n_node)
test_data = Data(test_data, shuffle=True, n_node=n_node)
model = trans_to_cuda(DHCN(adjacency=train_data.adjacency,n_node=n_node,lr=opt.lr, l2=opt.l2, beta=opt.beta, layers=opt.layer,emb_size=opt.embSize, batch_size=opt.batchSize,dataset=opt.dataset))
top_K = [5, 10, 20]
best_results = {}
for K in top_K:
best_results['epoch%d' % K] = [0, 0]
best_results['metric%d' % K] = [0, 0]
for epoch in range(opt.epoch):
print('-------------------------------------------------------')
print('epoch: ', epoch)
metrics, total_loss = train_test(model, train_data, test_data)
for K in top_K:
metrics['hit%d' % K] = np.mean(metrics['hit%d' % K]) * 100
metrics['mrr%d' % K] = np.mean(metrics['mrr%d' % K]) * 100
if best_results['metric%d' % K][0] < metrics['hit%d' % K]:
best_results['metric%d' % K][0] = metrics['hit%d' % K]
best_results['epoch%d' % K][0] = epoch
if best_results['metric%d' % K][1] < metrics['mrr%d' % K]:
best_results['metric%d' % K][1] = metrics['mrr%d' % K]
best_results['epoch%d' % K][1] = epoch
print(metrics)
for K in top_K:
print('train_loss:\t%.4f\tRecall@%d: %.4f\tMRR%d: %.4f\tEpoch: %d, %d' %
(total_loss, K, best_results['metric%d' % K][0], K, best_results['metric%d' % K][1],
best_results['epoch%d' % K][0], best_results['epoch%d' % K][1]))
if __name__ == '__main__':
main()