资讯专栏INFORMATION COLUMN

alexnet

frontoldman / 2408人阅读
AlexNet是一种深度卷积神经网络,它在2012年的ImageNet大规模视觉识别竞赛中夺冠,成为深度学习领域的重要里程碑。本文将介绍如何使用Python和PyTorch编写一个简单的AlexNet模型。 首先,我们需要导入PyTorch和其他必要的库:
python
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.transforms as transforms
import torchvision.datasets as datasets
接下来,我们定义一个AlexNet类,它继承自PyTorch的nn.Module类。在AlexNet中,有5个卷积层和3个全连接层,我们需要在类中定义这些层:
python
class AlexNet(nn.Module):
    def __init__(self):
        super(AlexNet, self).__init__()
        self.conv1 = nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2)
        self.pool1 = nn.MaxPool2d(kernel_size=3, stride=2)
        self.conv2 = nn.Conv2d(64, 192, kernel_size=5, padding=2)
        self.pool2 = nn.MaxPool2d(kernel_size=3, stride=2)
        self.conv3 = nn.Conv2d(192, 384, kernel_size=3, padding=1)
        self.conv4 = nn.Conv2d(384, 256, kernel_size=3, padding=1)
        self.conv5 = nn.Conv2d(256, 256, kernel_size=3, padding=1)
        self.pool3 = 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)
        self.relu = nn.ReLU(inplace=True)
在这个类中,我们使用了PyTorch中的Conv2d、MaxPool2d和Linear等层。其中,Conv2d表示卷积层,MaxPool2d表示最大池化层,Linear表示全连接层。我们还定义了一个ReLU激活函数。 接下来,我们需要定义前向传播函数,它将输入数据传递给AlexNet模型中的各个层:
python
def forward(self, x):
    x = self.conv1(x)
    x = self.relu(x)
    x = self.pool1(x)
    x = self.conv2(x)
    x = self.relu(x)
    x = self.pool2(x)
    x = self.conv3(x)
    x = self.relu(x)
    x = self.conv4(x)
    x = self.relu(x)
    x = self.conv5(x)
    x = self.relu(x)
    x = self.pool3(x)
    x = x.view(-1, 256 * 6 * 6)
    x = self.fc1(x)
    x = self.relu(x)
    x = self.fc2(x)
    x = self.relu(x)
    x = self.fc3(x)
    return x
在这个函数中,我们按照AlexNet的结构依次调用了各个层,并使用了ReLU激活函数。最后,我们将输出数据展平,并传递给三个全连接层。 接下来,我们需要定义训练函数和测试函数:
python
def train(model, device, train_loader, optimizer, criterion, epoch):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = data.to(device), target.to(device)
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()

def test(model, device, test_loader, criterion):
    model.eval()
    test_loss = 0
    correct = 0
    with torch.no_grad():
        for data, target in test_loader:
            data, target = data.to(device), target.to(device)
            output = model(data)
            test_loss += criterion(output, target).item() * data.size(0)
            pred = output.argmax(dim=1, keepdim=True)
            correct += pred.eq(target.view_as(pred)).sum().item()
    test_loss /= len(test_loader.dataset)
    accuracy = 100. * correct / len(test_loader.dataset)
    print("Test set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)".format(
        test_loss, correct, len(test_loader.dataset), accuracy))
在训练函数中,我们将模型设置为训练模式,并依次处理每个batch的数据。在测试函数中,我们将模型设置为测试模式,并计算模型在测试集上的准确率和损失。 最后,我们需要定义一些超参数,并开始训练模型:
python
batch_size = 128
learning_rate = 0.01
momentum = 0.9
num_epochs = 10

transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                         std=[0.229, 0.224, 0.225])
])

train_dataset = datasets.ImageFolder("path/to/train/dataset", transform=transform)
test_dataset = datasets.ImageFolder("path/to/test/dataset", transform=transform)

train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False)

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

model = AlexNet().to(device)

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate, momentum=momentum)

for epoch in range(1, num_epochs + 1):
    train(model, device, train_loader, optimizer, criterion, epoch)
    test(model, device, test_loader, criterion)
在这段代码中,我们定义了一些超参数,包括batch_size、learning_rate、momentum和num_epochs等。我们还使用了PyTorch中的transforms模块对输入数据进行预处理,使用了datasets模块读取训练集和测试集。接下来,我们将数据加载到DataLoader中,并将模型和损失函数放到GPU或CPU上。最后,我们使用train函数和test函数训练和测试模型。 这就是一个简单的AlexNet模型的实现过程。当然,我们还可以对模型进行调参和优化,以提高模型的性能。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/130795.html

相关文章

  • GTAV智能驾驶源码详解(二)——Train the AlexNet

    摘要:智能驾驶源码详解二模型简介本使用进行图像分类前进左转右转。其性能超群,在年图像识别比赛上展露头角,是当时的冠军,由团队开发,领头人物为教父。 GTAV智能驾驶源码详解(二)——Train the AlexNet 模型简介: 本AI(ScooterV2)使用AlexNet进行图像分类(前进、左转、右转)。Alexnet是一个经典的卷积神经网络,有5个卷积层,其后为3个全连接层,最后的输出...

    jayzou 评论0 收藏0

发表评论

0条评论

frontoldman

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<