Я новичок в питоне, изучая нейронные сети и модуль факела PY. Я не совсем понимаю поведение этой линии.

import torch.nn as nn

loss = nn.MSELoss()

print(loss)

>>MSELoss()

Поскольку nn.MSELoss является классом, почему обращение к переменной loss не создает его как объект класса? Какой тип кода находится в классе MSELoss, что позволяет ему добиться такого поведения?

-1
calvinguy 10 Июл 2019 в 01:18

3 ответа

Лучший ответ

Когда вы печатаете какой-то объект, вы фактически вызываете его метод __str__ в Python или, если он не определен, то __repr__ (из представления ).

В вашем случае речь идет о обычном классе, но его __repr__ был переопределен:

def __repr__(self):
    # We treat the extra repr like the sub-module, one item per line
    extra_lines = []
    extra_repr = self.extra_repr()
    # empty string will be split into list ['']
    if extra_repr:
        extra_lines = extra_repr.split('\n')
    child_lines = []
    for key, module in self._modules.items():
        mod_str = repr(module)
        mod_str = _addindent(mod_str, 2)
        child_lines.append('(' + key + '): ' + mod_str)
    lines = extra_lines + child_lines

    main_str = self._get_name() + '('
    if lines:
        # simple one-liner info, which most builtin Modules will use
        if len(extra_lines) == 1 and not child_lines:
            main_str += extra_lines[0]
        else:
            main_str += '\n  ' + '\n  '.join(lines) + '\n'

    main_str += ')'
    return main_str
0
ipaleka 9 Июл 2019 в 22:29

Согласно документации, nn.MSELoss() создает критерий для измерения среднего квадрата ошибка, которую вы можете использовать следующим образом:

loss = nn.MSELoss()
input = torch.randn(3, 5, requires_grad=True)
target = torch.randn(3, 5)
output = loss(input, target)
output.backward()

Вы можете проверить, что loss является классом MSELoss:

print(type(loss).__name__)
>>> MSELoss
0
dallonsi 9 Июл 2019 в 22:24

Это создает экземпляр класса. Однако этот класс реализует специальный метод __call__, который позволяет вам использовать оператор вызова (), как если бы это была функция. Он также реализует метод __repr__, который настраивает способ его отображения при печати.

0
IronMan 9 Июл 2019 в 22:24