一、网络结构
AlexNet 总共有8层组成。其中用于学习的有五个卷积层和三个全连接层。下面是AlexNet的整个网络结构:AlexNet (
(features): Sequential (
(0): Conv2d(3, 64, kernel_size=(11, 11), stride=(4, 4), padding=(2, 2))
(1): ReLU(inplace)
(2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
(3): Conv2d(64, 192, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
(4): ReLU(inplace)
(5): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
(6): Conv2d(192, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(7): ReLU(inplace)
(8): Conv2d(384, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(9): ReLU(inplace)
(10): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(11): ReLU(inplace)
(12): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(avgpool): AdaptiveAvgPool2d(output_size=(6, 6))
(classifier): Sequential (
(0): Dropout(p=0.5, inplace)
(1): Linear(in_features=9216, out_features=4096, bias=True)
(2): ReLU(inplace)
(3): Dropout(p=0.5, inplace)
(4): Linear(in_features=4096, out_features=4096, bias=True)
(5): ReLU(inplace)
(6): Linear(in_features=4096, out_features=1000, bias=True)
)
)
如上所示, AlexNet在特征提取方面使用五个卷积层和三个最大化输出的层。在分类方面,AlexNet使用了三个完全连接层,并在最后一个完全连接层上使用了Softmax,从而输出概率分布。
二、优化器
AlexNet一般使用随机梯度下降(SGD)作为优化器。但要注意的是,在训练AlexNet时,还使用了不同的数据增强操作,例如随机剪切和随机移动等。此外,还可以使用加速神经网络训练的Adam优化器。三、数据集
AlexNet最初的训练采用了ImageNet中的超过120万张标记图像,共有1000个类别。大小为224x224。其中数量最多的150万张用于训练,10万张用于验证,以及10万张用于测试。四、代码实现
我们可以在pytorch 中调用已经实现好的alexnet模型。具体来说,我们需要使用torchvisoin库中的models部分来加载已经构建好的AlexNet模型。下面是一段示例代码:import torchvison
from torchvision.models import alexnet
net = alexnet(pretrained=True)
在上面的代码中,"pretrained=True"表明我们正在加载一个已经经过训练的AlexNet模型。如果需要训练自己的模型,则应为"pretrained=False"。值得注意的是,已经经过训练的模型可能包含不同的参数和权重,这取决于它们被训练的数据集以及它们的目的。
五、模型训练
在PyTorch中,训练模型通常需要四个步骤:1. 定义优化器(通常是SGD或Adam)
2. 定义损失函数
3. 定义训练循环,并在每个循环中更新模型和优化器权重
4. 在最后一个步骤(循环)之后,保存训练好的模型以备进一步评估和使用
下面是一个典型的AlexNet训练循环的示例代码:
import torch.optim as optim
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9)
# Train the model
for epoch in range(num_epochs):
for i, (inputs, labels) in enumerate(trainloader, 0):
inputs, labels = inputs.to(device), labels.to(device)
optimizer.zero_grad()
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# Save the model
PATH = './cifar_net.pth'
torch.save(net.state_dict(), PATH)
通过上述代码,我们就可以训练一个模型了,其中的损失函数使用了交叉熵损失,而优化器使用了SGD。