TensorFlow学习笔记:优化器对比实验

张开发
2026/4/14 20:43:15 15 分钟阅读

分享文章

TensorFlow学习笔记:优化器对比实验
本文为365天深度学习训练营 中的学习记录博客 原作者K同学啊一、基础设置与导入数据importmatplotlib.pyplotaspltimportnumpyasnpimportosimportPILimporttensorflowastffromtensorflowimportkerasfromtensorflow.kerasimportlayers,modelsimportpathlibfromdatetimeimportdatetimefrommatplotlib.tickerimportMultipleLocator# 1. 设置 GPUgpustf.config.list_physical_devices(GPU)print(Found GPUs:,gpus)# 2. 准备数据路径data_dirpathlib.Path(./T11_data)# 3. 加载数据img_height224img_width224batch_size32train_dstf.keras.utils.image_dataset_from_directory(data_dir,validation_split0.2,subsettraining,seed123,image_size(img_height,img_width),batch_sizebatch_size)val_dstf.keras.utils.image_dataset_from_directory(data_dir,validation_split0.2,subsetvalidation,seed123,image_size(img_height,img_width),batch_sizebatch_size)class_namestrain_ds.class_names num_classeslen(class_names)print(f识别目标:{class_names})# 数据管道加速AUTOTUNEtf.data.AUTOTUNE train_dstrain_ds.cache().shuffle(1000).prefetch(buffer_sizeAUTOTUNE)val_dsval_ds.cache().prefetch(buffer_sizeAUTOTUNE)二、定义统一的 CNN 模型架构defcreate_model():modelmodels.Sequential([layers.Rescaling(1./255,input_shape(img_height,img_width,3)),layers.Conv2D(16,3,paddingsame,activationrelu),layers.MaxPooling2D(),layers.Conv2D(32,3,paddingsame,activationrelu),layers.MaxPooling2D(),layers.Conv2D(64,3,paddingsame,activationrelu),layers.MaxPooling2D(),layers.Dropout(0.2),# Dropout层防止过拟合layers.Flatten(),layers.Dense(128,activationrelu),layers.Dense(num_classes)])returnmodel三、优化器对比训练 (Adam vs SGD)epochs20# --- 训练模型一Adam 优化器 ---print(\n--- 开始训练模型 1使用 Adam 优化器 ---)model_adamcreate_model()model_adam.compile(optimizeradam,losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue),metrics[accuracy])history_adammodel_adam.fit(train_ds,validation_dataval_ds,epochsepochs)# --- 训练模型二SGD 优化器 ---print(\n--- 开始训练模型 2使用 SGD 优化器 ---)model_sgdcreate_model()model_sgd.compile(optimizersgd,losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue),metrics[accuracy])history_sgdmodel_sgd.fit(train_ds,validation_dataval_ds,epochsepochs)四、训练结果可视化current_timedatetime.now().strftime(%Y-%m-%d %H:%M:%S)# 提取历史数据acc_adamhistory_adam.history[accuracy]val_acc_adamhistory_adam.history[val_accuracy]loss_adamhistory_adam.history[loss]val_loss_adamhistory_adam.history[val_loss]acc_sgdhistory_sgd.history[accuracy]val_acc_sgdhistory_sgd.history[val_accuracy]loss_sgdhistory_sgd.history[loss]val_loss_sgdhistory_sgd.history[val_loss]epochs_rangerange(epochs)# 设置高分辨率出图plt.rcParams[figure.dpi]150plt.figure(figsize(16,6))# 绘制 Accuracy 对比图ax1plt.subplot(1,2,1)plt.plot(epochs_range,acc_adam,labelTraining Accuracy - Adam)plt.plot(epochs_range,acc_sgd,labelTraining Accuracy - SGD)plt.plot(epochs_range,val_acc_adam,labelValidation Accuracy - Adam)plt.plot(epochs_range,val_acc_sgd,labelValidation Accuracy - SGD)plt.legend(loclower right)plt.title(Training and Validation Accuracy (Adam vs SGD))plt.xlabel(fEpochs\nTimestamp:{current_time})ax1.xaxis.set_major_locator(MultipleLocator(2))# 绘制 Loss 对比图ax2plt.subplot(1,2,2)plt.plot(epochs_range,loss_adam,labelTraining Loss - Adam)plt.plot(epochs_range,loss_sgd,labelTraining Loss - SGD)plt.plot(epochs_range,val_loss_adam,labelValidation Loss - Adam)plt.plot(epochs_range,val_loss_sgd,labelValidation Loss - SGD)plt.legend(locupper right)plt.title(Training and Validation Loss (Adam vs SGD))plt.xlabel(fEpochs\nTimestamp:{current_time})ax2.xaxis.set_major_locator(MultipleLocator(2))plt.tight_layout()plt.show()五、模型验证集最终评估print(\n--- 优化器对比实验最终评估结果 ---)print(Model with Adam Optimizer:)model_adam.evaluate(val_ds,verbose2)print(\nModel with SGD Optimizer:)model_sgd.evaluate(val_ds,verbose2)六、总结本次实验意在探究不同的优化器算法Optimizer对深度神经网络训练速度、收敛过程以及最终模型性能的影响。为了保证实验的严谨性采用控制变量法实验将网络架构搭建过程封装为 create_model() 函数。在保持数据集、网络层级三层 CNN Dropout、训练轮数Epochs20完全一致的前提下仅改变模型编译Compile时的优化器类型。优化器原理解析SGD随机梯度下降最经典的优化算法采用固定的学习率更新参数。其特点是路径相对曲折收敛速度较慢但在某些复杂任务中能找到更平缓、泛化能力更好的最优解。Adam自适应矩估计目前业界最常用的进阶优化器。它能够为每个参数动态计算并自适应调整学习率。其特点是起步快、收敛极速通常能在极短时间内大幅提升准确率。实验结果与深度分析通过将两组模型的评估数据Accuracy 与 Loss绘制于同构图表中呈现出极其显著的对比现象收敛速度的降维打击Adam 模型在训练初期的前几个 Epoch 内准确率Accuracy便出现了陡峭的爬升而 SGD 模型的准确率提升则呈现出缓慢的线性增长态势。过拟合风险的暴露由于 Adam 优化能力极强在面对样本量较小的数据集时极其容易在训练中后期陷入“死记硬背”的状态即 Training Loss 极低但 Validation Loss 停滞甚至出现反弹。最终结论Adam 优化器凭借自适应学习率展现出了更高的训练效率是日常模型验证的首选但优化器的选择必须结合数据规模在小样本任务中过于激进的 Adam 可能需要配合更严苛的正则化手段如增加 Dropout 比例或进行数据增强才能发挥最佳泛化效果。

更多文章