Unittest функция пересылки pytorch

Я хочу выполнить unittest переопределенную функцию пересылки моей сетевой модели в Pytorch. Итак, я загрузил свою модель (предварительно обученную из Zoo) с помощью метода setUp, загрузил семя и создал случайную партию. В моем методе testForward я тестировал результат пересылки по форме и числу, но я также хочу проверить конкретное значение, которое оказывается равным 0. Я не был в этом уверен, поэтому также проверил свои параметры в setUp, который, похоже, не соответствует быть 0.

import unittest
import torch
from SemanticSegmentation.models.fcn8 import FCN8


class TestFCN8(unittest.TestCase):

    def setUp(self):
        self.model = FCN8(8, pretrained=True)
        torch.manual_seed(0)
        self.x = torch.rand((4, 3, 45, 45))
        for param in self.model.parameters():
            print(param.data)

    def testForward(self):
        self.assertEqual(self.model.forward(self.x).shape.numel(), 64800)
        self.assertEqual(str(self.model.forward(self.x).shape), 'torch.Size([4, 8, 45, 45])')
        print(self.model.named_parameters)


if __name__ == "__main__":
    unittest.main()

Итак, мой вопрос: sahpe тензора прямого возврата - это то, что я ожидаю, но почему этот тензор полностью равен нулю? Я ожидал по крайней мере нескольких значений.

Импортированная модель основана на сети VGG16 с повышением рейтинга после ConvLayer 4, 8 и 16. При необходимости я мог бы также представить код модели.


person MaKaNu    schedule 16.09.2020    source источник
comment
Какой вопрос?   -  person gspr    schedule 16.09.2020
comment
Я редактировал вопрос сейчас   -  person MaKaNu    schedule 16.09.2020


Ответы (1)


Хорошо, после того, как поработал и отладил функцию пересылки, я пришел к следующему объяснению:

Некоторая информация об архитектуре

Если вы выполняете классы от Andrew Ng или других, вы научитесь не инициализировать веса одинаковыми значениями, как в примере 0. Это то, что делают авторы оригинальной Paper of FCN, и они говорят, потому что это не влияет на производительность или не привело к более быстрой сходимости (FCN-Paper).

Мое решение

Поэтому для целей тестирования я инициализирую в модуле тестирования засеянные случайные значения, которые я могу проверить:

import unittest
import torch
from SemanticSegmentation.models.fcn8 import FCN8


class TestFCN8(unittest.TestCase):

    def setUp(self):
        self.model = FCN8(8, pretrained=True)
        torch.manual_seed(0)
        # instead of zero init for score tensors use random init
        self.model.score_fr[6].weight.data.random_()
        self.model.score_fr[6].bias.data.random_()
        self.model.score_pool3.weight.data.random_()
        self.model.score_pool3.bias.data.random_()
        self.model.score_pool4.weight.data.random_()
        self.model.score_pool4.bias.data.random_()
        self.x = torch.rand((4, 3, 45, 45))

    def testForward(self):
        self.assertEqual(
            self.model.forward(self.x).shape.numel(), 64800)
        self.assertEqual(
            list(self.model.forward(self.x).shape), [4, 8, 45, 45])
        self.assertEqual(
            float(self.model.forward(self.x)[3][4][44][4]), 2277257216.0))

if __name__ == "__main__":
    unittest.main()
person MaKaNu    schedule 16.09.2020