Почему эта строка не создает экземпляр класса? - PullRequest
0 голосов
/ 10 июля 2019

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

import torch.nn as nn

loss = nn.MSELoss()

print(loss)

>>MSELoss()

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

Ответы [ 3 ]

0 голосов
/ 10 июля 2019

Согласно документации , 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 голосов
/ 10 июля 2019

Когда вы печатаете какой-либо объект, вы фактически вызываете его метод __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 голосов
/ 10 июля 2019

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

...