【动手学习深度学习--逐行代码解析合集】16深度卷积神经网络(AlexNet)
发布人:shili8
发布时间:2024-11-20 07:19
阅读次数:0
**深度卷积神经网络(AlexNet)**
在前面的文章中,我们已经介绍了多种深度学习模型,包括卷积神经网络(CNN)。但是,这些模型都没有达到我们想要的效果。因此,在本文中,我们将介绍一种新的模型——深度卷积神经网络(Deep Convolutional Neural Network, DCNN),也就是AlexNet。
**什么是AlexNet?**
AlexNet是一种深度卷积神经网络,主要用于图像分类任务。它由Alex Krizhevsky等人在2012年提出,并在ImageNet大赛中取得了惊人的成绩。
**AlexNet的结构**
AlexNet的结构如下:
* **输入层**:224x224的RGB图像* **卷积层1**:11x11的滤波器,步长为4,输出维度为55x55* **池化层1**:3x3的最大池化,步长为2,输出维度为27x27* **卷积层2**:5x5的滤波器,步长为1,输出维度为27x27* **池化层2**:3x3的最大池化,步长为2,输出维度为13x13* **全连接层1**:256个神经元* **全连接层2**:64个神经元* **输出层**:1000个神经元**AlexNet的代码**
下面是AlexNet的Python实现:
import torchimport torch.nn as nnimport torchvisionimport torchvision.transforms as transformsclass AlexNet(nn.Module): def __init__(self): super(AlexNet, self).__init__() self.conv1 = nn.Conv2d(3,96, kernel_size=11, stride=4) self.pool1 = nn.MaxPool2d(kernel_size=3, stride=2) self.conv2 = nn.Conv2d(96,256, kernel_size=5, padding=2) self.pool2 = nn.MaxPool2d(kernel_size=3, stride=2) self.fc1 = nn.Linear(256 *6 *6,4096) self.fc2 = nn.Linear(4096,4096) self.fc3 = nn.Linear(4096,1000) def forward(self, x): x = self.pool1(nn.functional.relu(self.conv1(x))) x = self.pool2(nn.functional.relu(self.conv2(x))) x = x.view(-1,256 *6 *6) x = nn.functional.relu(self.fc1(x)) x = nn.functional.relu(self.fc2(x)) x = self.fc3(x) return x# 初始化AlexNetmodel = AlexNet() # 定义损失函数和优化器criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 加载数据集transform = transforms.Compose([transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor()]) trainset = torchvision.datasets.ImageFolder(root='./data/train', transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=True) # 训练模型for epoch in range(10): for i, data in enumerate(trainloader): inputs, labels = data optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() if i %100 ==0: print('Epoch: {}, Iteration: {}, Loss: {:.4f}'.format(epoch +1, i +1, loss.item()))
**注释**
* `self.conv1 = nn.Conv2d(3,96, kernel_size=11, stride=4)`:定义第一个卷积层,输入通道数为3,输出通道数为96,滤波器大小为11x11,步长为4。
* `self.pool1 = nn.MaxPool2d(kernel_size=3, stride=2)`:定义第一个最大池化层,池化窗口大小为3x3,步长为2。
* `self.fc1 = nn.Linear(256 *6 *6,4096)`:定义第一个全连接层,输入维度为256*6*6,输出维度为4096。
**总结**
在本文中,我们介绍了深度卷积神经网络(AlexNet)的结构和代码实现。通过使用AlexNet,我们可以达到比传统CNN更好的效果。