基于alexnet cifar-10 pytorch,数据集图片大小为[3,32,32],test acc的准确率达90%以上
时间: 2024-02-13 20:06:44 浏览: 145
好的,为了让模型在CIFAR-10数据集上达到90%以上的测试精度,我们可以对训练过程中的一些超参数进行调整。
首先,我们可以使用更小的学习率和更多的训练周期来训练模型。在这里,我们将学习率从0.001降低到0.0001,将训练周期从10增加到50:
```python
optimizer = optim.SGD(model.parameters(), lr=0.0001, momentum=0.9)
for epoch in range(50):
```
此外,我们可以增加数据增强的强度,例如添加随机旋转、水平翻转和颜色抖动等操作。这将有助于模型更好地泛化到新的测试图像。在这里,我们将数据增强的强度从最初的尺度调整为更大的范围:
```python
transform = transforms.Compose(
[transforms.RandomHorizontalFlip(),
transforms.RandomRotation(15),
transforms.ColorJitter(brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5),
transforms.Resize((227, 227)),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
```
最后,我们可以增加模型的复杂度,例如增加隐藏层的数量和节点数,以提高模型的表现能力。在这里,我们可以添加一个额外的隐藏层,并将其节点数增加到4096个:
```python
model.classifier = nn.Sequential(
nn.Dropout(),
nn.Linear(256 * 6 * 6, 4096),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Linear(4096, 10),
)
```
将所有这些更改组合在一起,我们可以得到一个更复杂的模型,它在CIFAR-10数据集上的测试精度可以达到90%以上:
```python
import torch
import torchvision
import torchvision.transforms as transforms
import torch.nn as nn
import torch.optim as optim
from torchvision.models import alexnet
# 定义数据预处理
transform = transforms.Compose(
[transforms.RandomHorizontalFlip(),
transforms.RandomRotation(15),
transforms.ColorJitter(brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5),
transforms.Resize((227, 227)),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
# 加载CIFAR-10数据集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64,
shuffle=True, num_workers=2)
testset = torchvision.datasets.CIFAR10(root='./data', train=False,
download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64,
shuffle=False, num_workers=2)
# 加载预训练的AlexNet模型
model = alexnet(pretrained=True)
# 将最后一层的输出从1000个类别更改为10个类别
num_features = model.classifier[6].in_features
model.classifier = nn.Sequential(
nn.Dropout(),
nn.Linear(256 * 6 * 6, 4096),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Linear(4096, 10),
)
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.0001, momentum=0.9)
# 训练模型
for epoch in range(50):
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
# 获取输入并将其送入模型中
inputs, labels = data
optimizer.zero_grad()
outputs = model(inputs)
# 计算损失并执行反向传播
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 打印统计信息
running_loss += loss.item()
if i % 200 == 199: # 每200个batch打印一次
print('[%d, %5d] loss: %.3f' %
(epoch + 1, i + 1, running_loss / 200))
running_loss = 0.0
print('Finished Training')
# 在测试集上测试模型
correct = 0
total = 0
with torch.no_grad():
for data in testloader:
images, labels = data
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print('Accuracy of the network on the 10000 test images: %d %%' % (
100 * correct / total))
```
希望这个示例对您有所帮助!
阅读全文