最近,我不得不构造一个需要包含张量的模块。尽管使用torch.nn.Parameter可以很好地进行反向传播,但是在打印网络对象时却没有显示出来。与其他模块(例如parameter)相比,为什么不包含layer? (它的行为是否像layer一样?)

import torch
import torch.nn as nn

class MyNet(torch.nn.Module):
    def __init__(self):
        super(MyNet, self).__init__()
        self.layer = nn.Linear(10, 10)
        self.parameter = torch.nn.Parameter(torch.zeros(10,10, requires_grad=True))

net = MyNet()
print(net)

输出:
MyNet(
  (layer): Linear(in_features=10, out_features=10, bias=True)
)

最佳答案

调用print(net)时,将调用__repr__方法。 __repr__ 给出对象的“正式”字符串表示形式。

在PyTorch的 nn.Module (您的MyNet模型的基类)中,__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

请注意,上述方法返回的main_str仅包含对_modulesextra_repr的调用,因此默认情况下仅打印模块。

PyTorch还提供了 extra_repr() 方法,您可以自己实现该模块的额外表示形式。

关于python - 为什么在打印net时未列出torch.nn.Parameter?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54770249/

10-12 23:23