在PyTorch中,我们可以使用nn.Sequential和nn.Module结合来构建复杂的神经网络模型。下面是一个示例:
首先,我们定义一个包含卷积层、池化层和全连接层的复杂神经网络模型。
import torch
import torch.nn as nn
class ComplexModel(nn.Module):
def __init__(self):
super(ComplexModel, self).__init__()
self.conv_layers = nn.Sequential(
nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2)
)
self.fc_layers = nn.Sequential(
nn.Linear(32 * 8 * 8, 128),
nn.ReLU(),
nn.Linear(128, 10)
)
def forward(self, x):
x = self.conv_layers(x)
x = x.view(x.size(0), -1)
x = self.fc_layers(x)
return x
在这个例子中,我们使用了nn.Sequential来定义卷积层和池化层的组合,并且在nn.Module中添加了全连接层。
然后,我们创建了ComplexModel类的实例,并打印出模型的结构。
model = ComplexModel()
print(model)
运行代码后,我们可以看到模型的结构:
ComplexModel(
(conv_layers): Sequential(
(0): Conv2d(3, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU()
(2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(3): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(4): ReLU()
(5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(fc_layers): Sequential(
(0): Linear(in_features=2048, out_features=128, bias=True)
(1): ReLU()
(2): Linear(in_features=128, out_features=10, bias=True)
)
)
从打印的结果中,我们可以看到模型包含了两个子模块:conv_layers和fc_layers。conv_layers包含了一系列的卷积层和池化层,而fc_layers包含了全连接层。
这种结合使用nn.Sequential和nn.Module的方法,可以使我们更加灵活地构建复杂的神经网络模型。我们可以使用nn.Sequential来定义一些重复使用的结构,然后将其作为子模块添加到nn.Module中,从而提高代码的可读性和模块化程度。