神经网络作业报告
第三次作业报告
为了完成对这101个类别的分类任务,使用vgg
带块的卷积神经网络
VGG
网络结构的实现如下
vgg.py
from torch import nn |
下面对这个网络结构进行分析:
-
首先定义基本的vgg块:vgg块的初始化依赖外部传入的参数,即卷积层的数量、输入通道的数量、输出通道的数量,使用这三个参数初始化基本块(卷积层、输入通道和输出通道),返回由卷积层、激活函数和池化层组成的序列模型
-
然后使用这个vgg块定义vgg网络,因为彩色图像共有r, g, b三个输入通道,所有使用三个输入通道;之后通过一个循环遍历输入参数更新卷积层
-
vgg网络返回一个模型,该模型将卷积层输出的多维张量展平为一维向量,之后使用三个全连接层:
第一个全连接层 (
nn.Linear(out_channels \* 7 \* 7, 4096)
):- 输入维度是展平后的输出尺寸,即卷积层输出的通道数(
out_channels
)乘以空间尺寸(7x7
),即out_channels * 7 * 7
。 - 输出维度是 4096,即该层有 4096 个神经元。
nn.ReLU()
:对输出应用 ReLU 激活函数,增加非线性。nn.Dropout(0.5)
:在训练过程中,50% 的神经元会被随机丢弃,以减少过拟合。第二个全连接层 (
nn.Linear(4096, 4096)
):这是一个具有 4096 个神经元的全连接层,输入和输出大小均为 4096。第三个全连接层 (
nn.Linear(4096, 102)
):- 输出的维度是 102,表示网络的最终输出是 102 个类别的概率分布(假设你处理的是 102 个类的分类问题)
- 输入维度是展平后的输出尺寸,即卷积层输出的通道数(
超参数与优化器
训练时使用的优化器为随机梯度下降优化,损失函数使用交叉熵损失函数,学习率设置为0.01,训练轮数设置为20,设置批量大小batch_size为32。
结果
模型训练与测试的结果如下:
training on cuda |
数据增广
数据增广的策略如下
train_transform = transforms.Compose([ |
对于训练集:
- 将所有图像调整到统一的大小,224x224像素,确保图像能够适应神经网络的输入尺寸。
- 随机水平翻转图像,这有助于模型学习到不依赖于物体方向的特征。
- 随机旋转图像 +/- 10度,帮助模型学习到旋转不变的特征。
- 随机裁剪图像到224x224像素,这有助于模型学习到不同尺度和位置的特征。
- 随机调整图像的亮度、对比度、饱和度和色调。这些调整模拟了不同光照和色彩条件下的图像,增强了模型对这些变化的鲁棒性。
- 将
ndarray
转换为torch.Tensor
- 对图像的每个通道进行标准化,使用的参数是ImageNet数据集上预训练模型的统计值,用于匹配预训练模型的期望输入分布。
对于测试集:
- 将图像调整到224x224像素
- 统一转换为
tensor
张量 - 对图像的每个通道进行标准化
辅助代码
util.py
from torch import nn |
主程序代码
main.py
from vgg import * |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 (๑>ᴗ<๑)!
评论