ResNet实战:CIFAR-10图像分类PyTorch教程

本教程将引导您使用PyTorch实现ResNet模型,并将其应用于CIFAR-10数据集进行图像分类任务。

**1. 导入必要的库和模块:**pythonimport torchimport torch.nn as nnimport torch.optim as optimimport torchvisionimport torchvision.transforms as transforms

**2. 设置超参数:**pythonnum_epochs = 10batch_size = 128learning_rate = 0.1

**3. 准备数据集:**pythontransform_train = transforms.Compose([ transforms.RandomCrop(32, padding=4), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

transform_test = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

train_dataset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform_train)train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)

test_dataset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform_test)test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False)

**4. 定义ResNet模型:**pythonclass ResidualBlock(nn.Module): def init(self, in_channels, out_channels, stride=1): super(ResidualBlock, self).init() self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False) self.bn1 = nn.BatchNorm2d(out_channels) self.relu = nn.ReLU(inplace=True) self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(out_channels) self.stride = stride

def forward(self, x):        identity = x

    out = self.conv1(x)        out = self.bn1(out)        out = self.relu(out)

    out = self.conv2(out)        out = self.bn2(out)

    if self.stride != 1 or identity.shape[1] != out.shape[1]:            identity = nn.Conv2d(identity.shape[1], out.shape[1], kernel_size=1, stride=self.stride, bias=False)(identity)                out += identity        out = self.relu(out)

    return out

class ResNet(nn.Module): def init(self, block, num_blocks, num_classes=10): super(ResNet, self).init() self.in_channels = 64 self.conv = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, bias=False) self.bn = nn.BatchNorm2d(64) self.relu = nn.ReLU(inplace=True) self.layer1 = self.make_layer(block, 64, num_blocks[0], stride=1) self.layer2 = self.make_layer(block, 128, num_blocks[1], stride=2) self.layer3 = self.make_layer(block, 256, num_blocks[2], stride=2) self.layer4 = self.make_layer(block, 512, num_blocks[3], stride=2) self.avg_pool = nn.AdaptiveAvgPool2d((1, 1)) self.fc = nn.Linear(512, num_classes)

def make_layer(self, block, out_channels, num_blocks, stride):        strides = [stride] + [1] * (num_blocks - 1)        layers = []        for stride in strides:            layers.append(block(self.in_channels, out_channels, stride))            self.in_channels = out_channels        return nn.Sequential(*layers)

def forward(self, x):        out = self.conv(x)        out = self.bn(out)        out = self.relu(out)        out = self.layer1(out)        out = self.layer2(out)        out = self.layer3(out)        out = self.layer4(out)        out = self.avg_pool(out)        out = out.view(out.size(0), -1)        out = self.fc(out)        return out

model = ResNet(ResidualBlock, [2, 2, 2, 2])

**5. 定义损失函数和优化器:**pythoncriterion = nn.CrossEntropyLoss()optimizer = optim.SGD(model.parameters(), lr=learning_rate, momentum=0.9, weight_decay=5e-4)

**6. 训练模型:**pythontotal_step = len(train_loader)for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): outputs = model(images) loss = criterion(outputs, labels)

    optimizer.zero_grad()        loss.backward()        optimizer.step()

    if (i + 1) % 100 == 0:            print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, total_step, loss.item()))

**7. 在测试集上评估模型:**pythonmodel.eval()with torch.no_grad(): correct = 0 total = 0 for images, labels in test_loader: outputs = model(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item()

print('模型在10000张测试图像上的准确率为: {} %'.format(100 * correct / total))

总结:

本教程介绍了使用PyTorch实现ResNet模型并训练CIFAR-10图像分类器的步骤。您可以根据需要调整超参数和网络结构以获得更好的性能。

ResNet实战:CIFAR-10图像分类PyTorch教程

原文地址: https://www.cveoy.top/t/topic/bCZ5 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录