[英]Extending PyTorch nn.Sequential class
我对 Python 中的 OOP 很陌生,而且总体上生锈。 我想扩展 PyTorch 的 'nn.Sequential' object,使其传递一个包含每层节点数的元组,根据这些节点自动生成一个OrderedDict
。 对于一个功能示例:
layers = (784, 392, 196, 98, 10)
n_layers = len(layers)
modules = OrderedDict()
# Layer definitions for inner layers:
for i in range(n_layers - 2):
modules[f'fc{i}'] = nn.Linear(layers[i], layers[i+1])
modules[f'relu{i}'] = nn.ReLU()
# Definition for output layer:
modules['fc_out'] = nn.Linear(layers[-2], layers[-1])
modules['smax_out'] = nn.LogSoftmax(dim=1)
# Define model and check attributes:
model = nn.Sequential(modules)
因此,在初始化nn.Sequential
时,我不想通过“OrderedDict” object ,而是希望我的 class 取而代之的是元组。
class Network(nn.Sequential):
def__init__(self, n_nodes):
super().__init__()
**** INSERT LOGIC FROM LAST SNIPPET ***
所以这似乎行不通,因为当我的Network
class 调用super().__init__()
时,它会想要查看层激活字典。 我如何 go 以这样的方式编写自己的网络以规避这个问题,但仍然具有 PyTorche 的顺序 object 的所有功能?
我的想法是这样的:
class Network(nn.Sequential):
def __init__(self, layers):
super().__init__(self.init_modules(layers))
def init_modules(self, layers):
n_layers = len(layers)
modules = OrderedDict()
# Layer definitions for inner layers:
for i in range(n_layers - 2):
modules[f'fc{i}'] = nn.Linear(layers[i], layers[i+1])
modules[f'relu{i}'] = nn.ReLU()
# Definition for output layer:
modules['fc_out'] = nn.Linear(layers[-2], layers[-1])
modules['smax_out'] = nn.LogSoftmax(dim=1)
return modules
我不确定 Python 中是否允许这种事情和/或良好做法。
您的实施是允许的并且很好。
而且,您还可以super().__init__()
空置,然后在循环中使用self.add_module(key, module)
来附加Linear
或Relu
或任何其他后续。 通过这种方式, function __init__
可以覆盖init_modules
的工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.