GoogLeNet from Scratch
文件列表(压缩包大小 493.06K)
免费
概述
GoogLeNet系列,包括MiniGoogLeNet和GoogLeNet,并在CIFAR-10,Tiny ImageNet和ImageNet数据集上进行训练。
构造MiniGoogLeNet并在CIFAR-10数据集上训练网络以获得≥90%的准确性。
构建GoogLeNet并在Tiny ImageNet视觉识别挑战赛上训练网络,并在排行榜上排名第一。
MiniGoogLeNet内部包含三个模块,包括Conv模块,inception模块,downsample模块。 图1显示了MiniGoogLeNet架构。
可以在pipeline / nn / conv /
目录下的minigooglenet.py
中找到MiniGoogLeNet架构。 模型的输入包括图像的高度,宽度,深度和类别数。 在这一部分中,输入为(宽度= 32,高度= 32,深度= 3,类别= 10)。
googlenet_cifar10.py
负责训练网络,评估模型(包括绘制训练和验证集的损失和准确性曲线,提供分类报告),并将模型序列化保存。
这里有一个帮助器:
在pipeline / callbacks /
目录下的trainingmonitor.py
创建一个TrainingMonitor
反馈,在训练网络时将在每个时期结束时调用该反馈,监控器将绘制训练损失和准确性的图。 在训练期间应用此类反馈使我们能够暂缓训练过程并尽早发现过拟合,从而使我们可以中止实验并继续尝试调整参数。
我们可以使用以下命令来训练模型。
python googlenet_cifar10.py --model output/minigooglenet_cifar10.hdf5 --output output
config /
目录下的tiny_imagenet_config.py
存储项目的所有相关配置,包括输入图像的路径,类标签的总数,有关训练,验证和测试分割的信息,HDF5数据集的路径, 以及输出模型,图等的路径。
为HDF5数据集构建基础架构
pipeline / io /
目录下的hdf5datasetwriter.py
定义了一个类,该类有助于将原始图特征写入HDF5数据集。
build_tiny_imagenet.py
用于将原始图像序列化为HDF5数据集。 尽管Keras的方法可以使我们将磁盘上的原始文件路径用作训练过程的输入,但这种方法效率极低。,磁盘上的每个映像都需要一个I/O操作,这将延迟引入了训练过程。 HDF5不仅能够存储海量数据集,而且还针对I/O操作进行了优化。
我们可以使用以下命令来构建Tiny ImageNet数据集。
python build_tiny_imagenet.py
构建图像预处理器
pipeline / preprocessing /
目录下的meanpreprocessor.py
减去训练集中的平均红色,绿色和蓝色像素强度,这是数据标准化的一种形式。 平均减法用于减少分类期间照明变化的影响。
pipeline / preprocessing /
目录下的simplepreprocessor.py
定义了一个用于更改图像大小的类,此类仅用于确保每个输入图像的尺寸为64x64x3。
在pipeline / preprocessing /
目录下的imagetoarraypreprocessor.py
定义了一个类,用于将图像数据集转换为兼容keras的数组。
从头开始构建GoogLeNet架构
图2显示了GoogLeNet中的inception模块的微架构
表1说明了GoogLeNet架构
我没有在第一卷积层中使用跨度为2x2的7x7滤镜,而是使用步长为1x1的5x5滤镜,因为输入图像的尺寸为64x64x3,这与原始GoogLeNet的输入尺寸为224x224x3不同, 因此,步长为2x2的7x7滤镜会很快缩小尺寸。 同样,平均池化层的大小应为4x4而不是7x7,步幅为1。
你可以在nn / conv /
目录下的googlenet.py
中找到GoogleNet架构。
训练GoogLeNet并对其进行评估
我使用“ ctrl + c”的方法将模型训练为基线,通过使用这种方法,我可以以初始学习率(以及相关的超参数集)开始训练,监督训练,并根据输入的结果快速调整学习率。
train.py
负责训练基线模型。 TrainingMonitor
负责绘制训练和验证集的损失和准确性曲线。 EpochCheckpoint
负责每5个时代保存一次模型。
了解基线模型后,使用学习率衰减方法重新训练模型。 train_decay.py
将方法从“ ctrl + c”更改为学习率衰减,以重新训练模型。 TrainingMonitor
再次负责绘制训练和验证集的损失和准确性曲线。 LearningRateScheduler
负责学习率衰减。
rank_accuracy.py
通过使用测试集来测量模型的rank-1
和rank-5
准确性。
有一些用于训练过程的帮助程序,包括:
Pipeline / callbacks /
目录下的EpochCheckpoint.py
可以帮助存储GoogLeNet的各个检查点,因此我们不必从头开始重新训练网络。 该模型每5个周期存储一次。
pipeline / io /
目录下的hdf5datasetgenerator.py
从HDF5数据集中产生一批图像和标签。 这有助于提高我们处理太大而无法放入内存的数据集的能力。
pipeline / utils /
目录下的rank.py
包含一个辅助函数,用于在使用测试集评估模型时测量rank-1
和rank-5
的精度。
如果我们从头开始,则可以使用以下命令来训练模型。
python train.py --checkpoints output/checkpoints
如果我们在新纪元的中间开始训练(只需使用数字来代替{epoch_number_you_want_to_start}
):
python train.py --checkpoints output/checkpoints --model output/checkpoints/epoch_{epoch_number_you_want_to_start}.hdf --start_epoch {the_epoch_number_you_want_to_start}
对于学习率衰减,只需使用以下命令:
python train_decay.py --model output/googlenet_tinyimagenet_decay.hdf5
为了使用测试集评估网络,请使用以下命令:
python rank_accuracy.py
图3展示了训练和验证集的损失和准确性曲线。 图4显示了对网络的评估,该评估表明准确度为90%。
实验1
在实验1中,使用“ ctrl + c”方法,学习率进度表如表2所示。动量为0.9且Nesterov加速度的SGD
优化器被使用。 convolution_module
的顺序为CONV => BN => ReLU
图5展示了训练和验证集的损失和准确性曲线。 图6显示了对网络的评估,评估结果表明55.05%的rank-1精度和79.64%的rank-5精度。
实验2
在实验2中,仍然使用表2中的学习率。为了提高准确性,将convolution module
更改为使用CONV => RELU => BN
序列,而不是CONV => BN => RELU
。
图7展示了训练和验证集的损失和准确性曲线。 图8显示了对网络的评估,该评估表明55.41%的1级精度和80.68%的5级精度。 与实验1的结果相比,等级1的准确度大约增加0.35%,等级5的准确度增加1%。
实验3
在实验3中,我在实验2中使用了convolution module
,但是将方法从“ ctrl + c”更改为学习率衰减,并且纪元数仍然是70。
图9展示了训练和验证集的损失和准确性曲线。 图10显示了对网络的评估,评估结果表明该网络的1级精度为57.34%,5级精度为81.25%。
如果遇到文件不能下载或其他产品问题,请添加管理员微信:ligongku001,并备注:产品反馈
评论(0)