基于轻量化CNN实现自动驾驶方向预测
在深度学习计算机视觉领域,CNN(卷积神经网络)凭借强大的空间特征提取能力,成为自动驾驶环境感知任务的核心技术支撑。真实自动驾驶场景复杂且数据获取成本高,对于新手而言,很难快速上手并验证模型效果。
本次我们将通过极致简化但贴合核心逻辑的场景,从零搭建一个轻量化CNN模型,实现「车辆姿态自适应(纵向/横向切换)+ 车头与行驶方向强绑定」的自动驾驶方向预测,全程代码可复现、无环境坑,最终达成测试集99.2%的高准确率,帮你快速打通「数据生成→模型搭建→训练评估」的深度学习实战闭环。
一、项目核心背景与目标
1. 项目背景
自动驾驶的核心流程可拆解为「环境感知→决策规划→执行控制」,其中环境感知是基础——车辆需要通过摄像头、激光雷达等设备获取自身与环境的相对位置,再通过模型输出最优行驶策略。真实场景中,车辆姿态、道路环境、障碍物、光照变化等因素都会增加模型学习难度,甚至导致数据标注成本激增(需人工标注大量车辆位置、行驶方向样本)。
为降低实战门槛,同时保留核心逻辑,本次项目做了针对性简化设计,聚焦「车辆位置→行驶方向」的映射关系,剥离无关干扰:
环境简化:用「32×32黑白方格图」模拟平坦无障碍物的行驶道路,方格线清晰可辨,便于模型捕捉车辆与环境的相对位置;
车辆简化:用「自适应姿态长方体」模拟车辆,避免复杂车辆轮廓建模,同时支持姿态切换(上下行驶纵放、左右行驶横放),贴合真实车辆行驶逻辑;
方向标记:用「内置深灰色小方块」标记车头,与黑色车身形成明显视觉区分,且车头方向直接对应车辆行驶方向,避免方向歧义;
标注简化:通过代码自动生成标注数据,无需人工标注,降低实战成本,同时保证数据标注的准确性和一致性。
通过以上简化,我们可专注于理解CNN的空间特征提取逻辑、数据集生成原理、模型训练与优化流程,为后续学习复杂自动驾驶场景打下坚实基础。
2. 核心目标
实现车辆姿态自适应生成:根据车辆行驶方向(上下/左右)自动切换车身姿态,上下行驶时纵放(尺寸8×4)、左右行驶时横放(尺寸4×8),保证视觉合理性与真实行驶逻辑一致;
完成车头与行驶方向强绑定:车头朝向直接决定车辆可行驶范围,模型仅输出「车头方向」或「直行」两种结果,无跨方向、不合理的预测输出,贴合真实驾驶决策逻辑;
构建自动化数据集生成流程:通过代码随机生成指定数量(5000张)的样本图,自动完成环境、车辆、车头的绘制及方向标签标注,保证数据集的结构化与可复现性;
搭建轻量化CNN模型并掌握其设计逻辑:理解卷积层、池化层、全连接层的作用,掌握参数设置(滤波器数量、 kernel尺寸、 dropout比例等)的设计考量,实现模型轻量化(低参数、快训练);
完成模型训练、优化与全面评估:掌握模型编译、训练回调函数的使用,通过测试集验证模型效果,分析训练曲线,达成高准确率(≥99%),形成完整的深度学习实战闭环。
二、前期准备
1. 环境配置
本次项目采用「Python 3.11 + TensorFlow 2.20.0」组合,该组合兼容性强、稳定性高,可有效避免新版Python与TensorFlow的适配问题,核心依赖库及作用如下(明确每一步依赖的必要性,便于新手理解):
tensorflow==2.20.0:核心框架,用于搭建、编译、训练轻量化CNN模型,提供丰富的神经网络层(卷积层、池化层等)与回调函数,简化模型开发流程;numpy:用于数据处理与矩阵运算,核心作用是将生成的图像转换为数组格式、处理数据维度(如增加通道维度)、生成随机坐标等,是深度学习数据处理的基础;opencv-python:用于图像绘制,核心作用是绘制方格背景、自适应姿态车辆、深灰色车头,实现样本图的可视化生成,无需手动制作图像;matplotlib:用于结果可视化,核心作用是绘制训练损失/准确率曲线、展示样本验证图,便于分析模型训练效果与数据生成质量;scikit-learn:用于数据集划分,核心作用是将生成的样本按7:2:1的比例划分为训练集、验证集、测试集,确保模型训练、优化、评估的独立性,避免数据泄露。
环境搭建步骤
- 安装Python 3.11:避免安装Python 3.12及以上版本,此类新版本与TensorFlow 2.20.0存在适配问题,可能导致依赖库安装失败或模型训练报错;
- 新建虚拟环境并激活:虚拟环境可隔离不同项目的依赖库,避免因依赖版本冲突导致项目无法运行,建议使用conda或venv创建(新手推荐venv,操作简单);。
2. 核心思路梳理(详细拆解,闭环逻辑):
1 | 数据自动生成(环境+车辆+车头+标签)→ 数据预处理(格式转换+one-hot编码)→ 数据集划分 → 轻量化CNN模型搭建 → 模型编译与训练(添加回调优化)→ 模型评估(测试集验证)→ 结果可视化(样本+训练曲线) |
逐步骤详细解读核心思路:
数据自动生成:这是本次项目的基础的核心步骤,也是降低实战门槛的关键。通过编写专门的函数,自动完成“方格背景绘制→车辆姿态切换→车头绘制→方向标签标注”,无需人工干预,既保证数据质量,又提升效率。核心设计逻辑是“姿态与方向绑定”——上下行驶对应纵向车辆,左右行驶对应横向车辆,车头方向直接决定标签判断维度(纵向车辆判断纵向偏移,横向车辆判断横向偏移);
数据预处理:生成的原始数据(图像、标签)无法直接输入CNN模型,需进行两项关键处理:一是格式转换(将图像列表转换为numpy数组,并增加通道维度,适配CNN单通道灰度图输入格式);二是标签one-hot编码(将整数标签转换为one-hot向量,适配多分类交叉熵损失函数,避免标签权重不均导致的训练偏差);
数据集划分:按7:2:1的比例划分为训练集、验证集、测试集,三者作用明确且独立:训练集用于模型学习数据规律(车辆位置与方向的映射);验证集用于训练过程中优化模型(调整权重、避免过拟合);测试集用于最终评估模型泛化能力(未见过的数据上的表现),确保评估结果真实可靠;
轻量化CNN模型搭建:核心设计原则是“轻量化、高效果”,避免复杂结构导致的训练缓慢(普通CPU可快速运行)。搭建3层卷积层(逐步提取空间特征)+ 2层全连接层(分类决策),配合批量归一化(加速收敛)、最大池化(降低维度、减少计算量)、dropout(防止过拟合),平衡特征提取能力与训练效率;
模型编译与训练:编译时选择合适的优化器、损失函数、评估指标——Adam优化器(收敛稳定、学习率自适应,适合新手使用)、多分类交叉熵损失(适配one-hot标签多分类任务)、准确率(直观评估模型分类效果)。训练时添加回调函数(早停法、模型保存),优化训练过程:早停法避免无效训练(验证集损失10轮不下降则停止),模型保存自动留存最优模型,无需手动记录;
模型评估:用测试集对训练好的模型进行评估,输出测试集损失与准确率,核心判断标准是“损失低、准确率高”,且测试集准确率与训练集、验证集准确率差距较小,说明模型无过拟合、泛化能力强;
结果可视化:通过两种可视化方式验证项目效果:一是样本验证图(展示5张随机样本,直观查看车辆姿态、车头方向、标签的绑定效果,确认数据生成无误);二是训练曲线(损失曲线、准确率曲线,分析训练趋势,判断模型是否收敛、是否过拟合)。
三、实现思路
1. 核心参数配置(支持车辆姿态切换,可复现性设计)
参数配置是项目可复现、可配置的关键,所有参数均有明确设计考量,并非随意设置,核心参数及详细解读如下(重点说明姿态切换相关参数):
图像尺寸参数(IMAGE_SIZE=32):设置为32×32,核心考量是“轻量化”——减小图像尺寸可降低CNN模型的计算量,让普通CPU能快速训练,同时32×32的尺寸足够容纳车辆(8×4或4×8)与方格背景,避免图像过于拥挤;
车辆姿态参数(CAR_LONG=8、CAR_SHORT=4):这是车辆姿态切换的核心参数,设计逻辑是“姿态与方向匹配”——上下行驶时,车辆纵向摆放,此时车身纵向长度(CAR_LONG=8)大于横向宽度(CAR_SHORT=4),贴合真实车辆上下行驶的视觉效果;左右行驶时,互换两个参数,车辆横向摆放(横向长度8、纵向宽度4),确保姿态合理;
车头参数(HEAD_SIZE=2):设置为2×2的小方块,核心考量是“与车身区分、不遮挡车身”——2×2的尺寸足够清晰标记车头方向,同时不会过大遮挡车身(8×4或4×8),颜色选择深灰色(与黑色车身区分),便于模型捕捉车头特征(车头方向是标签判断的关键);
偏移阈值(OFFSET=8):用于判断车辆是否偏离背景中心,进而确定行驶方向标签。设计逻辑是“背景中心±8像素”作为直行与转向的分界,32×32图像的中心是16像素,偏移超过8像素(即车身中心超出8-24像素范围),则判断为对应方向行驶,否则为直行,该阈值经过多次测试,可确保标签判断合理,无过多歧义样本;
可复现性参数(SEED=42):固定随机种子,核心作用是“确保每次运行代码,生成的数据集、模型训练结果完全一致”——避免随机因素(如随机生成车辆坐标、随机划分数据集)导致的结果波动,便于新手复现项目、调试代码;
数据集与训练参数(NUM_SAMPLES=5000、EPOCHS=20、BATCH_SIZE=64):5000张样本足够模型学习规律(避免样本过少导致过拟合),且不会过多占用内存;20轮训练可确保模型收敛(配合早停法,无需训练满20轮);64的批次大小适配普通CPU,平衡训练速度与内存占用。
此外,定义行驶方向标签(DIRECTIONS)与车头方向(MOVE_DIRECTIONS),建立两者的映射关系,确保标签与车头方向、车辆姿态强绑定,避免方向歧义(仅输出up、down、left、right、straight五种标签,对应5分类任务)。
2. 核心函数设计思路(车辆生成+姿态切换+方向绑定)
核心函数(create_car_image)是数据自动生成的核心,负责单张样本图的完整生成,函数内部逻辑拆解为4个关键模块,每个模块的设计思路、实现逻辑详细说明如下:
模块1:方格背景生成
核心目的是模拟平坦行驶道路,便于模型捕捉车辆与环境的相对位置。设计思路:首先初始化32×32的白色背景(灰度图,255表示白色),然后绘制8×8的方格线(黑色,线宽1)——方格步长为4(32÷8=4),即每4个像素绘制一条横向、纵向线,形成均匀的方格网格,模拟真实道路的分隔效果,同时方格线可帮助模型定位车辆位置(判断车辆中心与背景中心的偏移)。
模块2:车辆姿态自适应切换
这是函数的核心亮点,设计思路是“车头方向决定车辆姿态”——随机选择车头方向(up、down、left、right),然后根据车头方向切换车身尺寸与摆放姿态:
车头方向为up、down(上下行驶):车辆纵向摆放,车身高度=CAR_LONG(8),车身宽度=CAR_SHORT(4),确保纵向长度大于横向宽度,贴合上下行驶的视觉逻辑;
车头方向为left、right(左右行驶):车辆横向摆放,车身高度=CAR_SHORT(4),车身宽度=CAR_LONG(8),互换尺寸,确保横向长度大于纵向宽度,贴合左右行驶的视觉逻辑。
同时,随机生成车身左上角坐标,核心约束是“车身完全在背景内,不截断”——坐标范围为(0IMAGE_SIZE - 车身宽度,0IMAGE_SIZE - 车身高度),避免车身超出32×32的背景范围,确保样本图的完整性。
模块3:车头绘制(与方向强绑定)
核心目的是标记车辆行驶方向,为标签标注提供依据,设计思路是“车头位置与车辆姿态、车头方向完全匹配”,确保车头方向直观、无歧义:
车头朝上(up):纵向车辆,车头位于车身顶端中心,坐标计算为(车身x坐标 + 车身宽度//2 - 车头尺寸//2,车身y坐标),确保车头在顶端中心,与车身对齐;
车头朝下(down):纵向车辆,车头位于车身底端中心,坐标计算为(车身x坐标 + 车身宽度//2 - 车头尺寸//2,车身y坐标 + 车身高度 - 车头尺寸),避免车头超出车身;
车头朝左(left):横向车辆,车头位于车身左端中心,坐标计算为(车身x坐标,车身y坐标 + 车身高度//2 - 车头尺寸//2),确保车头在左端中心;
车头朝右(right):横向车辆,车头位于车身右端中心,坐标计算为(车身x坐标 + 车身宽度 - 车头尺寸,车身y坐标 + 车身高度//2 - 车头尺寸//2),避免车头超出车身。
车头颜色设置为深灰色(128),与黑色车身(0)形成明显区分,便于模型快速捕捉车头特征,进而学习车头方向与行驶方向的映射关系。
模块4:方向标签自动标注
核心逻辑是“根据车辆中心与背景中心的偏移量,结合车头方向,自动标注标签”,确保标签标注准确、贴合真实驾驶逻辑,具体设计思路如下:
计算车辆中心与背景中心:车辆中心根据车身姿态自适应计算(横向车辆中心=车身x+宽度//2、y+高度//2;纵向车辆同理),背景中心固定为16(32//2);
标签初始化:默认标签为“直行(straight)”,对应标签4,设计逻辑是“大多数车辆处于中心附近,默认直行,减少极端标签占比”;
标签判断逻辑(核心:车头方向决定偏移判断维度):
车头朝上(up):仅判断纵向偏移,若车辆中心y坐标 > 背景中心+偏移阈值(16+8=24),说明车辆偏下,需朝上行驶,标注标签0(up);否则保持直行;
车头朝下(down):仅判断纵向偏移,若车辆中心y坐标 < 背景中心-偏移阈值(16-8=8),说明车辆偏上,需朝下行驶,标注标签1(down);否则保持直行;
车头朝左(left):仅判断横向偏移,若车辆中心x坐标 > 背景中心+偏移阈值(24),说明车辆偏右,需朝左行驶,标注标签2(left);否则保持直行;
车头朝右(right):仅判断横向偏移,若车辆中心x坐标 < 背景中心-偏移阈值(8),说明车辆偏左,需朝右行驶,标注标签3(right);否则保持直行。
该设计逻辑的核心优势是“无跨方向标注”——纵向车辆仅判断纵向偏移,横向车辆仅判断横向偏移,避免出现“车头朝上却标注朝左”的不合理情况,贴合真实驾驶中“车头方向决定行驶范围”的逻辑。
3. 数据集生成与预处理思路
数据集生成与预处理是模型训练的基础,核心思路是“批量生成、规范格式、合理划分”,确保数据符合CNN模型输入要求,具体拆解如下:
(1)批量数据集生成
调用核心函数(create_car_image),循环5000次,批量生成样本图,同时保存图像数据、方向标签、车头方向、车辆姿态,便于后续可视化验证。设计思路是“固定随机种子(SEED=42)”,确保每次生成的数据集完全一致,便于复现与调试;循环次数对应样本数量(5000张),足够模型学习数据规律,同时避免样本过多导致内存占用过高。
(2)数据格式转换
生成的原始数据(图像列表、标签列表)无法直接输入CNN模型,需进行两项关键转换,设计思路贴合CNN模型输入要求:
图像格式转换:将图像列表转换为numpy数组,同时增加通道维度([…, np.newaxis]),最终格式为(5000, 32, 32, 1)——5000是样本数量,32×32是图像尺寸,1是通道数(灰度图),适配CNN模型“(样本数, 图像高度, 图像宽度, 通道数)”的输入格式;
标签格式转换:将整数标签(0-4)转换为one-hot编码,例如标签0转换为[1,0,0,0,0],标签4转换为[0,0,0,0,1]。设计思路是“适配多分类交叉熵损失函数”,one-hot编码可避免标签权重不均(如整数标签4的权重高于0),确保模型训练时对每个类别平等对待。
(3)数据集划分
采用sklearn的train_test_split函数,按7:2:1的比例划分为训练集、验证集、测试集,设计思路是“兼顾训练效果与评估可靠性”:
第一步:将所有数据按7:3划分为训练集(70%,3500张)与临时集(30%,1500张);
第二步:将临时集按2:1划分为验证集(20%,1000张)与测试集(10%,500张);
划分约束:固定随机种子(SEED=42),确保划分结果可复现;划分时同时划分图像数据与one-hot标签,确保图像与标签一一对应,避免数据错乱。
4. 轻量化CNN模型搭建思路
模型搭建的核心原则是“轻量化、高效果、易训练”,避免复杂结构,普通CPU可快速运行,同时保证特征提取能力,模型结构为“3层卷积模块 + 2层全连接模块”,每层设计思路、参数考量详细拆解如下:
(1)卷积模块(3层,特征提取核心)
卷积模块的核心作用是提取图像的空间特征(车辆位置、车头方向、车身姿态),每层卷积后配合批量归一化与最大池化,设计思路是“逐步深化特征提取、降低计算量、加速收敛”:
卷积层1:滤波器数量32,kernel尺寸(3,3),激活函数relu。设计思路:32个滤波器用于提取基础空间特征(如方格线、车身轮廓),(3,3)的kernel是卷积层最常用尺寸,可有效捕捉局部特征;relu激活函数可引入非线性,解决线性模型无法拟合复杂数据的问题,同时计算简单、不易梯度消失;
批量归一化(BatchNormalization):每个卷积层后添加,核心作用是“加速模型收敛、缓解梯度消失”——将卷积层输出的特征图进行归一化处理,使数据分布更均匀,避免因数据尺度差异导致的训练缓慢;
最大池化(MaxPooling2D):尺寸(2,2),核心作用是“降低特征图维度、减少计算量、保留关键特征”——将2×2的区域取最大值作为输出,可去除冗余信息,同时避免过拟合;
卷积层2:滤波器数量64,kernel尺寸(3,3),激活函数relu。设计思路:滤波器数量翻倍,逐步提取更精细的特征(如车头位置、车身姿态),随着层数增加,特征提取能力逐步增强;
卷积层3:滤波器数量128,kernel尺寸(3,3),激活函数relu。设计思路:继续增加滤波器数量,深化特征提取,捕捉车辆位置与方向的映射关系,为后续分类决策提供足够的特征支撑。
经过3层卷积模块处理后,原始32×32的图像逐步降维为2×2的特征图,滤波器数量从32增加到128,实现“从基础特征到精细特征”的逐步提取,同时通过池化层控制计算量,确保轻量化。
(2)全连接模块(2层,分类决策核心)
全连接模块的核心作用是将卷积模块提取的特征图转换为分类结果,设计思路是“逐步压缩特征维度、避免过拟合、输出分类概率”:
Flatten(展平层):核心作用是“连接卷积模块与全连接模块”——将卷积模块输出的2×2×128的特征图(三维)展平为一维向量(512维),适配全连接层的输入格式;
全连接层1(Dense(256, relu)):输出维度256,激活函数relu。设计思路:将512维特征压缩为256维,进一步筛选关键特征,relu激活函数继续引入非线性,增强模型拟合能力;
Dropout(0.4):核心作用是“防止过拟合”——随机丢弃40%的神经元,避免模型过度依赖某部分特征,增强模型泛化能力(在未见过的数据上表现更好);
全连接层2(Dense(64, relu)):输出维度64,激活函数relu。设计思路:继续压缩特征维度,将256维特征压缩为64维,简化分类决策过程,同时保留关键特征;
Dropout(0.3):继续随机丢弃30%的神经元,进一步防止过拟合,平衡模型拟合能力与泛化能力;
输出层(Dense(5, softmax)):输出维度5(对应5个行驶方向),激活函数softmax。设计思路:softmax激活函数可将输出转换为5个类别的概率分布(概率和为1),对应最大概率的类别即为模型预测的行驶方向,适配多分类任务。
(3)模型轻量化设计亮点
该模型总计约24.1万参数(944.02 KB),属于轻量化模型,普通CPU可在几分钟内完成20轮训练,核心轻量化设计亮点:
图像尺寸小(32×32),降低输入数据量;
卷积层kernel尺寸固定为(3,3),计算量小;
全连接层维度逐步压缩(512→256→64→5),减少参数数量;
通过最大池化降低特征图维度,减少后续计算量。
5. 模型编译与训练优化思路
模型编译与训练是实现高准确率的关键,核心思路是“合理配置编译参数、优化训练过程、避免无效训练”,具体拆解如下:
(1)模型编译
编译时需配置优化器、损失函数、评估指标,三者选择均贴合项目需求,设计思路如下:
优化器:Adam,学习率1e-4。设计思路:Adam优化器结合了SGD和RMSprop的优势,收敛稳定、学习率自适应,适合新手使用;学习率设置为1e-4(较小),避免学习率过大导致训练震荡、不收敛,同时保证训练速度;
损失函数:categorical_crossentropy(多分类交叉熵损失)。设计思路:适配多分类任务与one-hot标签,可有效衡量模型预测概率与真实标签的差距,损失值越小,模型预测越准确;
评估指标:accuracy(准确率)。设计思路:直观评估模型分类效果,准确率=预测正确的样本数/总样本数,便于快速判断模型训练效果。
(2)训练回调函数(优化核心)
添加两项关键回调函数,优化训练过程,避免过拟合与无效训练,设计思路如下:
EarlyStopping(早停法):监控验证集损失(val_loss),耐心值(patience)=10。设计思路:训练过程中,若验证集损失连续10轮不下降,说明模型已收敛,继续训练会导致无效计算甚至过拟合,此时自动停止训练,并恢复验证集损失最小时的模型权重,确保模型处于最优状态;
ModelCheckpoint(模型保存):监控验证集准确率(val_accuracy),保存最优模型(save_best_only=True)。设计思路:自动保存验证集准确率最高的模型(保存为best_car_direction_model.keras),无需手动记录最优模型,后续可直接加载使用,避免重新训练。
(3)训练参数配置
训练时配置批量大小(batch_size)、训练轮数(epochs)、验证集,设计思路如下:
batch_size=64:适配普通CPU内存,每次训练64张样本,平衡训练速度与内存占用,避免批量过大导致内存不足,批量过小导致训练缓慢;
epochs=20:设置足够的训练轮数,确保模型有足够的时间学习数据规律,同时配合早停法,无需训练满20轮,避免无效训练;
validation_data=(X_val, y_val):训练过程中用验证集实时评估模型效果,根据验证集损失与准确率调整模型权重,避免模型只拟合训练集(过拟合)。
6. 模型评估与结果可视化思路
模型评估与可视化的核心目的是“验证模型效果、确认数据质量、分析训练趋势”,确保项目达到预期目标,具体思路如下:
(1)模型评估
用测试集(未参与训练、未参与验证)评估模型泛化能力,输出测试集损失与准确率,核心判断标准:
测试集损失:接近0,说明模型预测与真实标签差距小;
测试集准确率:≥99%,说明模型已充分学习车辆位置与行驶方向的映射关系,泛化能力强,无明显过拟合。
(2)结果可视化(两项关键可视化,全面验证)
样本验证图:随机选取5张样本图,展示图像、车头方向、行驶方向标签、车辆姿态,核心目的是“确认数据生成无误”——检查车辆姿态与车头方向是否匹配、标签标注是否合理、车辆与车头是否完整(无截断);
训练曲线:绘制两张曲线(损失曲线、准确率曲线),核心目的是“分析训练趋势”:
损失曲线:训练集损失(train_loss)与验证集损失(val_loss)逐步下降并趋于平稳,且两者差距较小,说明模型收敛、无过拟合;
准确率曲线:训练集准确率(train_accuracy)与验证集准确率(val_accuracy)逐步上升并趋于平稳,且两者差距较小,说明模型学习效果好、泛化能力强。
四、项目完整运行结果
以下是项目运行的完整终端输出,包含TensorFlow日志、模型结构、训练过程、最终评估结果,可直接对照自身运行结果验证项目正确性:
1 | "D:\my project\cnn-2\.venv\Scripts\python.exe" "D:\my project\cnn-2\cnn.py" |
五、运行结果分析与项目总结
1. 运行结果详细分析
结合上述运行结果,从模型结构、训练过程、最终效果三个维度,详细分析项目运行情况,验证项目是否达到预期目标:
(1)模型结构分析
模型总计241,669个参数(944.02 KB),属于轻量化模型,符合设计预期:
卷积模块参数占比最高(320+128+18496+256+73856+512=93568),核心用于特征提取,参数数量合理,既保证特征提取能力,又避免冗余;
全连接模块参数(131328+16448+325=148101),逐步压缩特征维度,参数数量可控,避免全连接层参数过多导致的过拟合与计算量激增;
非训练参数(448)为批量归一化层的参数,不参与训练,仅用于加速收敛,设计合理。
(2)训练过程分析
准确率趋势:训练集准确率从第1轮的71.40%逐步提升至第20轮的98.49%,验证集准确率从0.0440提升至99.10%,两者逐步趋于一致,说明模型学习效果好,泛化能力强;
损失趋势:训练集损失从1.0157逐步下降至0.0552,验证集损失从2.5356下降至0.0428,两者均逐步趋于平稳,且差距较小(训练集0.0552,验证集0.0428),说明模型无过拟合,收敛稳定;
训练速度:每轮训练时间约1-3秒(普通CPU),20轮总计约30秒,符合轻量化模型的设计预期,新手可快速验证训练效果;
回调函数效果:验证集准确率逐步提升,未出现连续10轮不下降的情况,因此模型训练满20轮,最终保存的最优模型准确率可达99.10%(验证集),回调函数起到了有效的优化作用。
(3)最终效果分析
测试集损失0.0326,准确率99.20%,远超预期目标(≥99%),说明模型效果优异: