繁体   English   中英

扩展 PyTorch nn.Sequential class

[英]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)来附加LinearRelu或任何其他后续。 通过这种方式, function __init__可以覆盖init_modules的工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM