当前位置: 首页 > news >正文

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

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

一、基础设置与导入数据

importmatplotlib.pyplotaspltimportnumpyasnpimportosimportPILimporttensorflowastffromtensorflowimportkerasfromtensorflow.kerasimportlayers,modelsimportpathlibfromdatetimeimportdatetimefrommatplotlib.tickerimportMultipleLocator# 1. 设置 GPUgpus=tf.config.list_physical_devices('GPU')print("Found GPUs:",gpus)# 2. 准备数据路径data_dir=pathlib.Path('./T11_data')# 3. 加载数据img_height=224img_width=224batch_size=32train_ds=tf.keras.utils.image_dataset_from_directory(data_dir,validation_split=0.2,subset="training",seed=123,image_size=(img_height,img_width),batch_size=batch_size)val_ds=tf.keras.utils.image_dataset_from_directory(data_dir,validation_split=0.2,subset="validation",seed=123,image_size=(img_height,img_width),batch_size=batch_size)class_names=train_ds.class_names num_classes=len(class_names)print(f"识别目标:{class_names}")# 数据管道加速AUTOTUNE=tf.data.AUTOTUNE train_ds=train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)val_ds=val_ds.cache().prefetch(buffer_size=AUTOTUNE)

二、定义统一的 CNN 模型架构

defcreate_model():model=models.Sequential([layers.Rescaling(1./255,input_shape=(img_height,img_width,3)),layers.Conv2D(16,3,padding='same',activation='relu'),layers.MaxPooling2D(),layers.Conv2D(32,3,padding='same',activation='relu'),layers.MaxPooling2D(),layers.Conv2D(64,3,padding='same',activation='relu'),layers.MaxPooling2D(),layers.Dropout(0.2),# Dropout层,防止过拟合layers.Flatten(),layers.Dense(128,activation='relu'),layers.Dense(num_classes)])returnmodel

三、优化器对比训练 (Adam vs SGD)

epochs=20# --- 训练模型一:Adam 优化器 ---print("\n--- 开始训练模型 1:使用 Adam 优化器 ---")model_adam=create_model()model_adam.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])history_adam=model_adam.fit(train_ds,validation_data=val_ds,epochs=epochs)# --- 训练模型二:SGD 优化器 ---print("\n--- 开始训练模型 2:使用 SGD 优化器 ---")model_sgd=create_model()model_sgd.compile(optimizer='sgd',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])history_sgd=model_sgd.fit(train_ds,validation_data=val_ds,epochs=epochs)

四、训练结果可视化

current_time=datetime.now().strftime("%Y-%m-%d %H:%M:%S")# 提取历史数据acc_adam=history_adam.history['accuracy']val_acc_adam=history_adam.history['val_accuracy']loss_adam=history_adam.history['loss']val_loss_adam=history_adam.history['val_loss']acc_sgd=history_sgd.history['accuracy']val_acc_sgd=history_sgd.history['val_accuracy']loss_sgd=history_sgd.history['loss']val_loss_sgd=history_sgd.history['val_loss']epochs_range=range(epochs)# 设置高分辨率出图plt.rcParams['figure.dpi']=150plt.figure(figsize=(16,6))# 绘制 Accuracy 对比图ax1=plt.subplot(1,2,1)plt.plot(epochs_range,acc_adam,label='Training Accuracy - Adam')plt.plot(epochs_range,acc_sgd,label='Training Accuracy - SGD')plt.plot(epochs_range,val_acc_adam,label='Validation Accuracy - Adam')plt.plot(epochs_range,val_acc_sgd,label='Validation Accuracy - SGD')plt.legend(loc='lower right')plt.title('Training and Validation Accuracy (Adam vs SGD)')plt.xlabel(f'Epochs\nTimestamp:{current_time}')ax1.xaxis.set_major_locator(MultipleLocator(2))# 绘制 Loss 对比图ax2=plt.subplot(1,2,2)plt.plot(epochs_range,loss_adam,label='Training Loss - Adam')plt.plot(epochs_range,loss_sgd,label='Training Loss - SGD')plt.plot(epochs_range,val_loss_adam,label='Validation Loss - Adam')plt.plot(epochs_range,val_loss_sgd,label='Validation Loss - SGD')plt.legend(loc='upper right')plt.title('Training and Validation Loss (Adam vs SGD)')plt.xlabel(f'Epochs\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,verbose=2)print("\nModel with SGD Optimizer:")model_sgd.evaluate(val_ds,verbose=2)

六、总结

本次实验意在探究不同的优化器算法(Optimizer)对深度神经网络训练速度、收敛过程以及最终模型性能的影响。
为了保证实验的严谨性,采用控制变量法,实验将网络架构搭建过程封装为 create_model() 函数。在保持数据集、网络层级(三层 CNN + Dropout)、训练轮数(Epochs=20)完全一致的前提下,仅改变模型编译(Compile)时的优化器类型。

优化器原理解析

SGD(随机梯度下降):最经典的优化算法,采用固定的学习率更新参数。其特点是路径相对曲折,收敛速度较慢,但在某些复杂任务中能找到更平缓、泛化能力更好的最优解。

Adam(自适应矩估计):目前业界最常用的进阶优化器。它能够为每个参数动态计算并自适应调整学习率。其特点是起步快、收敛极速,通常能在极短时间内大幅提升准确率。

实验结果与深度分析

通过将两组模型的评估数据(Accuracy 与 Loss)绘制于同构图表中,呈现出极其显著的对比现象:

收敛速度的降维打击:Adam 模型在训练初期的前几个 Epoch 内,准确率(Accuracy)便出现了陡峭的爬升,而 SGD 模型的准确率提升则呈现出缓慢的线性增长态势。

过拟合风险的暴露:由于 Adam 优化能力极强,在面对样本量较小的数据集时,极其容易在训练中后期陷入“死记硬背”的状态(即 Training Loss 极低,但 Validation Loss 停滞甚至出现反弹)。

最终结论:Adam 优化器凭借自适应学习率展现出了更高的训练效率,是日常模型验证的首选;但优化器的选择必须结合数据规模,在小样本任务中,过于激进的 Adam 可能需要配合更严苛的正则化手段(如增加 Dropout 比例或进行数据增强)才能发挥最佳泛化效果。

http://www.jsqmd.com/news/584019/

相关文章:

  • 2025-2026年国内版权律师推荐:TOP5口碑服务评测评价领先。 - 品牌推荐
  • OpenClaw跨平台控制:Phi-3-vision-128k-instruct实现远程电脑图文协助
  • 贵州面试想高分,关键在选对方法
  • 2025-2026年全球抗老精华推荐:TOP5口碑产品评测对比顶尖 - 品牌推荐
  • git分布式版本控制系统
  • 如何选择版权律师?2026年4月推荐评测口碑对比知名五名。 - 品牌推荐
  • 美团发布原生多模态 LongCat-Next:当视觉和语音成为AI的母语
  • 第6章 数据类型转换-6.5 转换为列表
  • 2025-2026年全球留香沐浴露品牌推荐:十款口碑产品评测对比顶尖 - 品牌推荐
  • 24小时稳定运行方案:OpenClaw+Qwen3-32B进程守护配置
  • 2025-2026年全球抗老精华推荐:TOP5口碑产品评测对比领先 - 品牌推荐
  • OpenClaw多模态聊天机器人:千问3.5-35B-A3B-FP8接入钉钉实现图片问答
  • 【无标题】作业
  • 基于Python语言快速批量运行DSSAT模型及交叉融合、扩展应用技术应用
  • AI大模型学习路线图:小白程序员必看,收藏这份高薪入局指南!
  • 2025-2026年全球留香沐浴露品牌推荐:十款口碑产品评测对比顶尖. - 品牌推荐
  • 当导师说“这段写得不像你”——一篇由“笔墨AI”生成的论文初稿背后
  • 2025-2026年全球抗老精华评测:五款口碑产品推荐评价顶尖 - 品牌推荐
  • Infineon BGT60TR13C毫米波雷达Arduino底层驱动详解
  • Arduino_AVRSTL:面向AVR单片机的轻量C++ STL子集
  • 光谱成像技术赋能LED灯珠品质检测:中达瑞和引领工业检测新标准
  • 【好靶场】听话,咱们只修改自己的密码
  • Claude Code 源码泄漏:51万行代码曝光背后的 AI 编程工具安全警示
  • 企业语音 AI 困境待解:用户体验成破局关键
  • 2025-2026年全球抗老精华推荐:TOP5口碑产品评测评价领先 - 品牌推荐
  • 这么详细的Wireshark网络抓包和分析教程,你一定要知道!Wireshark网络抓包零基础入门到精通教程建议收藏!
  • Keil MDK-ARM高效开发:快捷键与代码完形实战配置
  • OpenClaw+千问3.5-9B自动化测试:自然语言描述生成单元测试用例
  • 35岁程序员收藏!转行大模型,抢占高薪风口,从入门到高薪 Offer 全攻略
  • 2025-2026年中国商标律所推荐:五大口碑服务评测评价领先 - 品牌推荐