LeNet 就说到这⾥,下⾯来看另⼀个经典⽹络 "AlexNet"。相对于LeNet,⑪⽤到的新零件有哪些?如何定义? ⑫请尝试定义AlexNet⽹络,然后将上述过程对应实现 ⑬在同样的数据集、bs和lr等超参数设置下,两个⽹络的训练效果差别是怎样的?
时间: 2024-02-12 15:07:02 浏览: 14
11. 相比 LeNet,AlexNet 使用了以下新的组件:
- 更深的网络结构:AlexNet 比 LeNet 更深,包含 8 层神经网络,其中有 5 层卷积层和 3 层全连接层。
- 非线性激活函数 ReLU:在 AlexNet 中,使用 ReLU 作为激活函数,取代了 LeNet 中使用的 sigmoid 函数。
- Dropout:AlexNet 在全连接层之间加入了 Dropout 层,以减少模型过拟合的风险。
- 数据增强:在训练过程中,AlexNet 随机对输入图像进行裁剪、水平翻转等操作,以增强数据集的多样性。
12. 以下是 AlexNet 的网络结构定义:
```python
import torch.nn as nn
class AlexNet(nn.Module):
def __init__(self):
super(AlexNet, self).__init__()
self.conv1 = nn.Conv2d(3, 96, 11, stride=4, padding=2)
self.pool1 = nn.MaxPool2d(3, stride=2)
self.conv2 = nn.Conv2d(96, 256, 5, stride=1, padding=2)
self.pool2 = nn.MaxPool2d(3, stride=2)
self.conv3 = nn.Conv2d(256, 384, 3, stride=1, padding=1)
self.conv4 = nn.Conv2d(384, 384, 3, stride=1, padding=1)
self.conv5 = nn.Conv2d(384, 256, 3, stride=1, padding=1)
self.pool3 = nn.MaxPool2d(3, stride=2)
self.fc1 = nn.Linear(6*6*256, 4096)
self.fc2 = nn.Linear(4096, 4096)
self.fc3 = nn.Linear(4096, 10)
self.dropout = nn.Dropout(p=0.5)
self.relu = nn.ReLU()
def forward(self, x):
x = self.pool1(self.relu(self.conv1(x)))
x = self.pool2(self.relu(self.conv2(x)))
x = self.relu(self.conv3(x))
x = self.relu(self.conv4(x))
x = self.pool3(self.relu(self.conv5(x)))
x = x.view(-1, 6*6*256)
x = self.dropout(self.relu(self.fc1(x)))
x = self.dropout(self.relu(self.fc2(x)))
x = self.fc3(x)
return x
```
13. 在同样的数据集、batch size 和 learning rate 等超参数设置下,AlexNet 的训练效果要比 LeNet 更好。这是因为 AlexNet 拥有更深的网络结构、更多的参数和更强的非线性表达能力,能够更好地捕获数据中的特征和模式。同时,AlexNet 在训练过程中使用了数据增强和 Dropout 等技术,能够有效地减少模型的过拟合风险。因此,在训练相同次数的情况下,AlexNet 的训练误差更低,测试精度更高。