如何编写 PyTorch 时序模型?
How to write a PyTorch sequential model?
到目前为止,我在 Keras 中编写了我的 MLP、RNN 和 CNN,但是现在 PyTorch 在深度学习社区中越来越受欢迎,所以我也开始学习这个框架。我是 Keras 中顺序模型的忠实粉丝,它使我们能够非常快速地制作简单的模型。我还看到 PyTorch 具有此功能,但我不知道如何编写代码。我这样试过
import torch
import torch.nn as nn
net = nn.Sequential()
net.add(nn.Linear(3, 4))
net.add(nn.Sigmoid())
net.add(nn.Linear(4, 1))
net.add(nn.Sigmoid())
net.float()
print(net)
但它给出了这个错误
AttributeError: 'Sequential' object has no attribute 'add'
另外,如果可能的话,您能否给出 PyTorch 顺序模型中 RNN 和 CNN 模型的简单示例?
Sequential
目前没有 add
方法,尽管有一些 debate 关于添加此功能。
正如您在 documentation nn.Sequential
takes as argument the layers separeted as sequence of arguments or an OrderedDict
中看到的那样。
如果您的模型有很多层,您可以先创建一个列表,然后使用 *
运算符将列表扩展为位置参数,如下所示:
layers = []
layers.append(nn.Linear(3, 4))
layers.append(nn.Sigmoid())
layers.append(nn.Linear(4, 1))
layers.append(nn.Sigmoid())
net = nn.Sequential(*layers)
这将导致您的代码结构与直接添加类似。
如正确答案所述,这就是它看起来的参数序列:
device = torch.device('cpu')
if torch.cuda.is_available():
device = torch.device('cuda')
net = nn.Sequential(
nn.Linear(3, 4),
nn.Sigmoid(),
nn.Linear(4, 1),
nn.Sigmoid()
).to(device)
print(net)
Sequential(
(0): Linear(in_features=3, out_features=4, bias=True)
(1): Sigmoid()
(2): Linear(in_features=4, out_features=1, bias=True)
(3): Sigmoid()
)
正如 McLawrence 所说,nn.Sequential
没有 add
方法。我认为也许您发现使用 add
的代码可能包含将 torch.nn.Module.add
修改为如下函数的行:
def add_module(self,module):
self.add_module(str(len(self) + 1 ), module)
torch.nn.Module.add = add_module
完成此操作后,您可以将 torch.nn.Module
添加到 Sequential
,就像您在问题中发布的那样。
layerlist = []
for i in layers:
layerlist.append(nn.Linear(n_in, i)) # n_in input neurons connected to i number of output neurons
layerlist.append(nn.ReLU(inplace=True)) # Apply activation function - ReLU
layerlist.append(nn.BatchNorm1d(i)) # Apply batch normalization
layerlist.append(nn.Dropout(p)) # Apply dropout to prevent overfitting
n_in = i # Reassign number of input neurons as the number of neurons from previous last layer
# Establish the FCC between the last hidden layer and output layer
layerlist.append(nn.Linear(layers[-1], out_sz))
self.layers = nn.Sequential(*layerlist)
到目前为止,我在 Keras 中编写了我的 MLP、RNN 和 CNN,但是现在 PyTorch 在深度学习社区中越来越受欢迎,所以我也开始学习这个框架。我是 Keras 中顺序模型的忠实粉丝,它使我们能够非常快速地制作简单的模型。我还看到 PyTorch 具有此功能,但我不知道如何编写代码。我这样试过
import torch
import torch.nn as nn
net = nn.Sequential()
net.add(nn.Linear(3, 4))
net.add(nn.Sigmoid())
net.add(nn.Linear(4, 1))
net.add(nn.Sigmoid())
net.float()
print(net)
但它给出了这个错误
AttributeError: 'Sequential' object has no attribute 'add'
另外,如果可能的话,您能否给出 PyTorch 顺序模型中 RNN 和 CNN 模型的简单示例?
Sequential
目前没有 add
方法,尽管有一些 debate 关于添加此功能。
正如您在 documentation nn.Sequential
takes as argument the layers separeted as sequence of arguments or an OrderedDict
中看到的那样。
如果您的模型有很多层,您可以先创建一个列表,然后使用 *
运算符将列表扩展为位置参数,如下所示:
layers = []
layers.append(nn.Linear(3, 4))
layers.append(nn.Sigmoid())
layers.append(nn.Linear(4, 1))
layers.append(nn.Sigmoid())
net = nn.Sequential(*layers)
这将导致您的代码结构与直接添加类似。
如正确答案所述,这就是它看起来的参数序列:
device = torch.device('cpu')
if torch.cuda.is_available():
device = torch.device('cuda')
net = nn.Sequential(
nn.Linear(3, 4),
nn.Sigmoid(),
nn.Linear(4, 1),
nn.Sigmoid()
).to(device)
print(net)
Sequential(
(0): Linear(in_features=3, out_features=4, bias=True)
(1): Sigmoid()
(2): Linear(in_features=4, out_features=1, bias=True)
(3): Sigmoid()
)
正如 McLawrence 所说,nn.Sequential
没有 add
方法。我认为也许您发现使用 add
的代码可能包含将 torch.nn.Module.add
修改为如下函数的行:
def add_module(self,module):
self.add_module(str(len(self) + 1 ), module)
torch.nn.Module.add = add_module
完成此操作后,您可以将 torch.nn.Module
添加到 Sequential
,就像您在问题中发布的那样。
layerlist = []
for i in layers:
layerlist.append(nn.Linear(n_in, i)) # n_in input neurons connected to i number of output neurons
layerlist.append(nn.ReLU(inplace=True)) # Apply activation function - ReLU
layerlist.append(nn.BatchNorm1d(i)) # Apply batch normalization
layerlist.append(nn.Dropout(p)) # Apply dropout to prevent overfitting
n_in = i # Reassign number of input neurons as the number of neurons from previous last layer
# Establish the FCC between the last hidden layer and output layer
layerlist.append(nn.Linear(layers[-1], out_sz))
self.layers = nn.Sequential(*layerlist)