【发布时间】:2020-10-07 20:32:37
【问题描述】:
我对 Python 中的 OOP 还很陌生,而且总体上很生疏。我想扩展 PyTorch 的 'nn.Sequential' 对象,使其传递一个包含每层中节点数的元组,根据这些节点自动生成一个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”对象,而是采用元组。
class Network(nn.Sequential):
def__init__(self, n_nodes):
super().__init__()
**** INSERT LOGIC FROM LAST SNIPPET ***
所以这似乎行不通,因为当我的Network 类调用super().__init__() 时,它会想要查看层激活字典。我如何编写自己的网络以绕过这个问题,但仍然具有 PyTorche 的顺序对象的所有功能?
我的想法是这样的:
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 中是否允许和/或良好做法。
【问题讨论】:
标签: python oop neural-network pytorch