# 实验三:AlexNet
## 一、实验目的
利用AlexNet设计LeNet-5网络结构,送一数据加载器、损失函数,构建完整的训练过程。以fashionMNIST数据集为对象,利用Pytorch进行AlexNet模型设计、数据加载、损失函数及优化器的定义,评估模型的性能并使结果可视化。
## 二、实验内容
### 2.1导入所需的依赖包
```
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
import matplotlib.pyplot as plt
```
### 2.2导入训练数据
```
batch_size = 512
device = torch.device('cuda')
trainloader = torch.utils.data.DataLoader(datasets.FashionMNIST('data',train = True,download = True,
transform = transforms.Compose([transforms.Resize((224,224)),transforms.ToTensor()])),
batch_size = batch_size,shuffle = True)
testloader = torch.utils.data.DataLoader(datasets.FashionMNIST('data',train = False,download = True,
transform = transforms.Compose([transforms.Resize((224,224)),transforms.ToTensor()])),
batch_size = batch_size,shuffle = True)
```
### 2.3定义模型
```
class Alex(nn.Module):
def __init__(self,):
super().__init__()
self.conv1 = nn.Conv2d(1,96,kernel_size = 11,stride = 4,padding = 1)
self.conv2 = nn.Conv2d(96,256,kernel_size = 5, padding = 2)
self.conv3 = nn.Conv2d(256,384,kernel_size = 3, padding = 1)
self.conv4 = nn.Conv2d(384,384,kernel_size = 3, padding = 1)
self.conv5 = nn.Conv2d(384,256,kernel_size = 3, padding = 1)
self.fc1 = nn.Linear(6400,4096)
self.fc2 = nn.Linear(4096,4096)
self.clf = nn.Linear(4096,10)
def forward(self,x):
x = F.relu(self.conv1(x))
x = F.max_pool2d(x,kernel_size = 3, stride = 2)
x = F.relu(self.conv2(x))
x = F.max_pool2d(x,kernel_size = 3, stride = 2)
x = F.relu(self.conv3(x))
x = F.relu(self.conv4(x))
x = F.relu(self.conv5(x))
x = F.max_pool2d(x,kernel_size = 3, stride = 2)
x = x.flatten(start_dim=1)
x = F.relu(self.fc1(x))
x = F.dropout(x,p = 0.2)
x = F.relu(self.fc2(x))
x = F.dropout(x,p = 0.2)
out = self.clf(x)
return out
```
### 2.4进行模型初始化
```
model = Alex().to(device)
optimizer = optim.Adam(model.parameters())
model
```
### 2.5对模型进行训练
```
epochs = 10
accs,losses = [],[]
for epoch in range(epochs):
for batch_idx,(x,y) in enumerate(trainloader):#遍历数据加载器
x,y = x.to(device),y.to(device)
optimizer.zero_grad()
# 清楚之前批次的梯度,以避免梯度累积
out = model(x)
loss = F.cross_entropy(out,y)
loss.backward()
# 通过反向传播计算损失函数对模型参数的梯度
optimizer.step()
# 根据梯度更新模型参数,使用优化器进行参数更新
correct = 0
testloss = 0
with torch.no_grad():
for batch_idx,(x,y) in enumerate(testloader):
x,y = x.to(device),y.to(device)
out = model(x)
testloss += F.cross_entropy(out,y).item()
pred = out.max(dim = 1,keepdim = True)[1]
correct += pred.eq(y.view_as(pred)).sum().item()
acc = correct/len(testloader.dataset)
testloss = testloss/(batch_idx+1)
accs.append(acc)
losses.append(testloss)
print('epoch:{},loss{:.4f},acc:{:.4f}'.format(epoch,testloss,acc))
```
### 训练结果:
batch_size=512:
![输入图片说明](Experiment4-1image.png)
batch_size=1024:
![输入图片说明](Experiment4-3image.png)
### 2.6特征图可视化
```
feature1 = model.conv1(x) # 计算第一个卷积层的输出特征
feature2 = model.conv2(feature1) # 计算第二个卷积层的输出特征
n = 5 # 可视化的样本数量
img = x.detach().cpu().numpy()[:n] # 将张量转换为numpy数组,并选择前n个样本
feature_map1 = feature1.detach().cpu().numpy()[:n] # 获取第一个卷积层的特征图
feature_map2 = feature2.detach().cpu().numpy()[:n] # 获取第二个卷积层的特征图
# 创建一个包含3行n列的子图
fig, ax = plt.subplots(3, n, figsize=(10, 10))
# 遍历每个样本
for i in range(n):
# 显示输入图像
ax[0, i].imshow(img[i].sum(0), cmap='gray')
ax[0, i].set_title('Input Image') # 设置标题
# 显示第一个卷积层的特征图
ax[1, i].imshow(feature_map1[i].sum(0), cmap='gray')
ax[1, i].set_title('Conv1 Feature Map') # 设置标题
# 显示第二个卷积层的特征图
ax[2, i].imshow(feature_map2[i].sum(0), cmap='gray')
ax[2, i].set_title('Conv2 Feature Map') # 设置标题
plt.show()
```
### 可视化结果:
![输入图片说明](Experiment4-5image.png)
### 2.7训练过程可视化
```
# 绘制损失函数和准确率的折线图
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.plot(losses, label='Test Loss')
plt.title('Test Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(accs, label='Test Accuracy')
plt.title('Test Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
```
#### batch_size = 512的结果:
![输入图片说明](Experiment4-2image.png)
#### 修改参数:batch_size = 1024的结果:
![输入图片说明](Experiment4-4image.png)
## 三、实验总结
(一)batch_size的大小对训练结果的影响为:
小批量(Batch Size小)
优点:
1.更快的更新频率:参数更新更频繁,这样模型的训练更加灵活,可能更快适应新的数据模式。
2.内存需求低:适用于内存有限的设备或较大的模型。
3.更好地避免局部最优:通过更高的梯度波动,模型可能有助于跳出局部最优。
缺点:
1.训练时间长:总的迭代次数多,可能导致训练时间更长。
2.梯度噪声大:可能导致不稳定的训练和模型收敛问题,特别是当学习率设置不当时。
大批量(Batch Size大)
优点:
1.训练效率高:利用并行处理硬件进行高效计算,训练时间可能更短。
2.稳定的梯度更新:每次更新使用更多样本,有助于减小梯度的波动性,使得训练过程更稳定。
缺点:
1.可能陷入局部最优:由于梯度变化较小,模型可能陷入局部最优。
2.更高的内存需求:需要更大的显存或内存。
3.泛化性能下降:大批量可能导致模型泛化能力降低,无法适应不同数据分布的变化。
(二)AlexNet与LeNet-5对比:
AlexNet的特征层输出较复杂,因为它有更多的卷积层和更小的卷积核,能提取更细致的特征,适合于复杂的图像任务。卷积层数量和大小的增加使其特征空间更加多样化。
LeNet-5的特征层输出较简单,因为它的卷积层数量少,卷积核尺寸较大,因此提取的特征较粗糙,适合于简单的任务。
没有合适的资源?快使用搜索试试~ 我知道了~
AlexNet训练MNIST数据集
共9个文件
png:5个
md:2个
license:1个
0 下载量 58 浏览量
2024-11-13
13:40:16
上传
评论
收藏 316KB ZIP 举报
温馨提示
AlexNet训练MNIST数据集
资源推荐
资源详情
资源评论
收起资源包目录
Experiment4-master.zip (9个子文件)
Experiment4-master
Experiment4-5image.png 211KB
LICENSE 1KB
Experiment4-3image.png 9KB
Experiment4-1image.png 9KB
.gitignore 2KB
README.en.md 847B
Experiment4-2image.png 42KB
README.md 7KB
Experiment4-4image.png 48KB
共 9 条
- 1
资源评论
0仰望星空007
- 粉丝: 4163
- 资源: 575
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功