当前位置:实例文章 » 其他实例» [文章]【动手学习深度学习--逐行代码解析合集】16深度卷积神经网络(AlexNet)

【动手学习深度学习--逐行代码解析合集】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更好的效果。

其他信息

其他资源

Top