|
- from icosagon.loss import CrossEntropyLoss
- from icosagon.declayer import Predictions, \
- RelationFamilyPredictions, \
- RelationPredictions
- from icosagon.data import Data
- from icosagon.trainprep import prepare_training, \
- TrainValTest
- import torch
-
-
- def test_cross_entropy_loss_01():
- d = Data()
- d.add_node_type('Dummy', 5)
- fam = d.add_relation_family('Dummy-Dummy', 0, 0, False)
- fam.add_relation_type('Dummy Rel', torch.tensor([
- [0, 1, 0, 0, 0],
- [1, 0, 0, 0, 0],
- [0, 0, 0, 1, 0],
- [0, 0, 0, 0, 1],
- [0, 1, 0, 0, 0]
- ], dtype=torch.float32))
-
- prep_d = prepare_training(d, TrainValTest(1., 0., 0.))
-
- assert len(prep_d.relation_families) == 1
- assert len(prep_d.relation_families[0].relation_types) == 1
- assert len(prep_d.relation_families[0].relation_types[0].edges_pos.train) == 5
- assert len(prep_d.relation_families[0].relation_types[0].edges_pos.val) == 0
- assert len(prep_d.relation_families[0].relation_types[0].edges_pos.test) == 0
-
- rel_pred = RelationPredictions(
- TrainValTest(torch.tensor([1, 0, 1, 0, 1], dtype=torch.float32), torch.zeros(0), torch.zeros(0)),
- TrainValTest(torch.zeros(0), torch.zeros(0), torch.zeros(0)),
- TrainValTest(torch.zeros(0), torch.zeros(0), torch.zeros(0)),
- TrainValTest(torch.zeros(0), torch.zeros(0), torch.zeros(0))
- )
- fam_pred = RelationFamilyPredictions([ rel_pred ])
- pred = Predictions([ fam_pred ])
-
- loss = CrossEntropyLoss(prep_d)
- print('loss: %.7f' % loss(pred))
- assert torch.abs(loss(pred) - 55.262043) < 0.000001
-
- loss = CrossEntropyLoss(prep_d, reduction='mean')
- print('loss: %.7f' % loss(pred))
- assert torch.abs(loss(pred) - 11.0524082) < 0.000001
|