最近,我不得不构造一个需要包含张量的模块。尽管使用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
仅包含对_modules
和extra_repr
的调用,因此默认情况下仅打印模块。PyTorch还提供了
extra_repr()
方法,您可以自己实现该模块的额外表示形式。关于python - 为什么在打印net时未列出torch.nn.Parameter?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54770249/