T11:优化器对比实验

news2024/11/28 10:42:01

T11周:优化器对比实验

      • **一、前期工作**
        • 1.设置GPU,导入库
      • **二、数据预处理**
        • 1.导入数据
        • 2.检查数据
        • 3.配置数据集
        • 4.数据可视化
      • **三、构建模型**
      • **四、训练模型**
      • **五、模型评估**
      • 六、总结

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

🍺
本次主要是探究不同优化器、以及不同参数配置对模型的影响,在论文当中我们也可以进行优化器的比对,以增加论文工作量。·

⛽ 我的环境

  • 语言环境:Python3.10.12
  • 编译器:Google Colab
  • 深度学习环境:
    • TensorFlow2.17.0

一、前期工作

1.设置GPU,导入库
#os提供了一些与操作系统交互的功能,比如文件和目录操作
import os
#提供图像处理的功能,包括打开和显示、保存、裁剪等
import PIL
from PIL import Image
#pathlib提供了一个面向对象的接口来处理文件系统路径。路径被表示为Path对象,可以调用方法来进行各种文件和目录操作。
import pathlib

#用于绘制图形和可视化数据
import tensorflow as tf
import matplotlib.pyplot as plt
#用于数值计算的库,提供支持多维数组和矩阵运算
import numpy as np
#keras作为高层神经网络API,已被集成进tensorflow,使得训练更方便简单
from tensorflow import keras
#layers提供了神经网络的基本构建块,比如全连接层、卷积层、池化层等
#提供了构建和训练神经网络模型的功能,包括顺序模型(Sequential)和函数式模型(Functional API)
from tensorflow.keras import layers, models
#导入两个重要的回调函数:前者用于训练期间保存模型最佳版本;后者监测到模型性能不再提升时提前停止训练,避免过拟合
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
import tensorflow as tf
gpus = tf.config.list_physical_devices("GPU")

if gpus:
  gpu0 = gpus[0] #如果有多个GPU,仅使用第0个GPU
  tf.config.experimental.set_memory_growth(gpu0, True) #设置GPU显存用量按需使用
  tf.config.set_visible_devices([gpu0],"GPU")

from tensorflow  import keras
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import warnings,os,PIL,pathlib

warnings.filterwarnings("ignore")             #忽略警告信息
#plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号

二、数据预处理

1.导入数据
from google.colab import drive
drive.mount("/content/drive/")
%cd "/content/drive/My Drive/Colab Notebooks/jupyter notebook/data/"
Drive already mounted at /content/drive/; to attempt to forcibly remount, call drive.mount("/content/drive/", force_remount=True).
/content/drive/My Drive/Colab Notebooks/jupyter notebook/data
data_dir = "./T6"
data_dir = pathlib.Path(data_dir)

# 使用glob方法获取当前目录的子目录里所有以'.jpg'为结尾的文件
# '*/*.jpg' 是一個通配符模式
# 第一个星号表示当前目录
# 第二个星号表示子目录
image_count = len (list(data_dir.glob("*/*.jpg")))
print("图片总数:", image_count)
图片总数: 1800
#设置批量大小,即每次训练模型时输入图像数量
#每次训练迭代时,模型需处理32张图像
batch_size = 16
#图像的高度,加载图像数据时,将所有的图像调整为相同的高度
img_height = 336
#图像的宽度,加载图像数据时,将所有的图像调整为相同的宽度
img_width = 336
"""
关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789
"""
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    #指定数据集中分割出多少比例数据当作验证集,0.1表示10%数据会被用来当验证集
    subset="training",
    #指定是用于训练还是验证的数据子集,这里设定为training
    seed=12,
    #用于设置随机数种子,以确保数据集划分的可重复性和一致性
    image_size=(img_height, img_width),
    batch_size=batch_size)
Found 1800 files belonging to 17 classes.
Using 1440 files for training.
"""
关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789
"""
val_ds = tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="validation",
    seed=12,
    image_size=(img_height, img_width),
    batch_size=batch_size)
Found 1800 files belonging to 17 classes.
Using 360 files for validation.
class_names = train_ds.class_names
# 可以通过class_names输出数据集的标签。标签将按字母顺序对应于目录名称
class_names
['Angelina Jolie',
 'Brad Pitt',
 'Denzel Washington',
 'Hugh Jackman',
 'Jennifer Lawrence',
 'Johnny Depp',
 'Kate Winslet',
 'Leonardo DiCaprio',
 'Megan Fox',
 'Natalie Portman',
 'Nicole Kidman',
 'Robert Downey Jr',
 'Sandra Bullock',
 'Scarlett Johansson',
 'Tom Cruise',
 'Tom Hanks',
 'Will Smith']
2.检查数据
for image_batch, labels_batch in train_ds:
    print(image_batch.shape)
    print(labels_batch.shape)
    break
(16, 336, 336, 3)
(16,)
3.配置数据集
#自动调整数据管道性能
AUTOTUNE = tf.data.AUTOTUNE
# 使用 tf.data.AUTOTUNE 具体的好处包括:
#自动调整并行度:自动决定并行处理数据的最佳线程数,以最大化数据吞吐量。
#减少等待时间:通过优化数据加载和预处理,减少模型训练时等待数据的时间。
#提升性能:自动优化数据管道的各个环节,使整个训练过程更高效。
#简化代码:不需要手动调整参数,代码更简洁且易于维护。

#使用cache()方法将训练集缓存到内存中,这样加快数据加载速度
#当多次迭代训练数据时,可以重复使用已经加载到内存的数据而不必重新从磁盘加载
#使用shuffle()对训练数据集进行洗牌操作,打乱数据集中的样本顺序
#参数1000指缓冲区大小,即每次从数据集中随机选择的样本数量
#prefetch()预取数据,节约在训练过程中数据加载时间


def train_preprocessing(image,label):
  return(image/255.0,label)

train_ds = train_ds.cache().shuffle(1000).map(train_preprocessing).prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().shuffle(1000).map(train_preprocessing).prefetch(buffer_size=AUTOTUNE)
4.数据可视化
plt.figure(figsize=(10, 8))  # 图形的宽为10高为5
plt.suptitle("数据展示")

for images, labels in train_ds.take(1):
    for i in range(15):
        plt.subplot(4, 5, i + 1)
        plt.xticks([])
        plt.yticks([])
        plt.grid(False)

        # 显示图片
        plt.imshow(images[i])
        # 显示标签
        plt.xlabel(class_names[labels[i]-1])

plt.show()

在这里插入图片描述

三、构建模型

from tensorflow.keras.layers import Dropout,Dense,BatchNormalization
from tensorflow.keras.models import Model

def create_model(optimizer):
    # 加载预训练模型
    vgg16_base_model = tf.keras.applications.vgg16.VGG16(
        weights='imagenet',
        include_top=False,
        input_shape=(img_width, img_height, 3),
        pooling='avg')

    for layer in vgg16_base_model.layers:
        layer.trainable = False

    X = vgg16_base_model.output

    X = Dense(170, activation='relu')(X)
    X = BatchNormalization()(X)
    X = Dropout(0.5)(X)

    output = Dense(len(class_names), activation='softmax')(X)
    vgg16_model = Model(inputs=vgg16_base_model.input, outputs=output)

    vgg16_model.compile(optimizer=optimizer,
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
    return vgg16_model

model1 = create_model(optimizer=tf.keras.optimizers.Adam())
model2 = create_model(optimizer=tf.keras.optimizers.SGD())
model2.summary()

在这里插入图片描述
在这里插入图片描述

四、训练模型

NO_epochs = 50

history_model1=model1.fit(train_ds,epochs=NO_epochs,validation_data=val_ds)
history_model2=model2.fit(train_ds,epochs=NO_epochs,validation_data=val_ds)

部分训练过程:
在这里插入图片描述

五、模型评估

from matplotlib.ticker import MultipleLocator
plt.rcParams['savefig.dpi'] = 300 #图片像素
plt.rcParams['figure.dpi']  = 300 #分辨率

acc1     = history_model1.history['accuracy']
acc2     = history_model2.history['accuracy']
val_acc1 = history_model1.history['val_accuracy']
val_acc2 = history_model2.history['val_accuracy']

loss1     = history_model1.history['loss']
loss2     = history_model2.history['loss']
val_loss1 = history_model1.history['val_loss']
val_loss2 = history_model2.history['val_loss']

epochs_range = range(len(acc1))

plt.figure(figsize=(16, 4))
plt.subplot(1, 2, 1)

plt.plot(epochs_range, acc1, label='Training Accuracy-Adam')
plt.plot(epochs_range, acc2, label='Training Accuracy-SGD')
plt.plot(epochs_range, val_acc1, label='Validation Accuracy-Adam')
plt.plot(epochs_range, val_acc2, label='Validation Accuracy-SGD')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
# 设置刻度间隔,x轴每1一个刻度
ax = plt.gca()
ax.xaxis.set_major_locator(MultipleLocator(1))

plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss1, label='Training Loss-Adam')
plt.plot(epochs_range, loss2, label='Training Loss-SGD')
plt.plot(epochs_range, val_loss1, label='Validation Loss-Adam')
plt.plot(epochs_range, val_loss2, label='Validation Loss-SGD')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')

# 设置刻度间隔,x轴每1一个刻度
ax = plt.gca()
ax.xaxis.set_major_locator(MultipleLocator(1))

plt.show()

在这里插入图片描述

def test_accuracy_report(model):
    score = model.evaluate(val_ds, verbose=1)
    print('Loss function: %s, accuracy:' % score[0], score[1])

print("model1:")
test_accuracy_report(model1)
print("model2:")
test_accuracy_report(model2)
model1:
[1m23/23[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m3s[0m 140ms/step - accuracy: 0.5283 - loss: 2.5871
Loss function: 2.443842649459839, accuracy: 0.5249999761581421
model2:
[1m23/23[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m3s[0m 141ms/step - accuracy: 0.5863 - loss: 1.3692
Loss function: 1.4873623847961426, accuracy: 0.5555555820465088

六、总结

本周学习了调用vgg16并构建functional model来进行不同优化器的设置和训练,并在最后对训练参数过程进行可视化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2206577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT实现Opencv图像处理

案例 基于QT的人脸识别 pro文件需要加以下代码 INCLUDEPATH E:/opencv/opencv3.4-qt-intall/install/include INCLUDEPATH E:/opencv/opencv3.4-qt-intall/install/include/opencv INCLUDEPATH E:/opencv/opencv3.4-qt-intall/install/include/opencv2 LIBS E:/opencv/o…

Linux go语言配置

首先安装go语言 先从go官方下载源码 解压: tar -xzvf go1.23.1.linux-amd64.tar.gz 移动go到 /usr/local/ mv go /usr/local 设置环境变量 vi ~/.bashrc source ~/.bashrc 重新获取文件 输入 go version 查看版本

STM32 A/D转换器

目录 模拟量输入通道 A/D转换器简介 模拟量输入信号类型与量程自动转换 量程自动转换 STM32F103ZET6集成的ADC模块 STM32的ADC的主要特征 STM32的ADC模块结构 ADC中断事件主要有以下3个: 模拟量输入通道 模拟量输入通道一般由信号处理、模拟开关、放大器、采…

MES管理系统解决方案常见的应用场景

在现代制造业的浪潮中,车间管理的效率与智能化水平成为了企业竞争力的关键因素。许多车间管理者都耳闻MES管理系统解决方案能够显著优化生产执行流程,但由于缺乏亲身体验,往往对此持保留态度。那么,MES管理系统究竟能否如传闻般发…

po框架的了解和应用

https://www.cnblogs.com/xiaolehong/p/18458470 笔记 任务:1、通过po框架输入测试报告 2、编写自动化测试框架 3、总结测试讲解稿 自动化测试框架概念: 自动化测试框架是一个集成体系,这个体系中包含测试功能的函数、测试数据源、测试对以及重要的模块。 作用:用于解决或…

MIDIPLUS 50周年丨中国国际乐器展览会首日盛况

10月10日,由中国乐器协会、上海国展展览中心有限公司、法兰克福展览(上海)有限公司共同主办的中国(上海)国际乐器展览会在上海新国际博览中心(上海市浦东新区龙阳路2345号)盛大开幕。 2024上海…

ART 光学跟踪系统:通过 VR HMD 解锁完全沉浸式 VR 体验

在虚拟现实体验中,完全沉浸式虚拟现实体验应该既准确又舒适。当与现实世界的物体融合时,虚拟现实的表现必须与现实精确匹配。这意味着所使用的运动跟踪系统必须为整套项目提供可靠且可重复的高精度运动数据,以及体感无法察觉到的超低延迟。AR…

水深探测仪的作用和使用方法

在水域救援的行动里,救援人员时刻面临着复杂多变、充满未知的水域状况。当接到救援任务奔赴现场,那片需要涉足的水域就像一个神秘莫测的异世界,挑战着所有人的认知与勇气。 水深探测仪作为一种专用于测量水域深度的设备,通过声波和…

宝塔 进程守护管理器 神坑,再次跌入。thinkphp-queue队列 勤勤学长

如果,你有在使用【进程守护管理器】,记得在更新/重启,甚至卸载重新安装后,重启服务器。 事情的起因是,昨日服务器突然异常,网站无法正常访问,进入宝塔面板,发现 cpu和负载率均超过1…

甘肃小米,一口软糯,满是乡愁

🎈甘肃小米,自然的馈赠🎈🌾家人们,今天必须给大家安利来自甘肃的小米!💛✨甘肃,那片广袤而神奇的土地,孕育出的小米有着别样的魅力。颗粒饱满,色泽金黄&#…

RDD优化:缓存和checkpoint机制、数据共享(广播变量、累加器)、RDD的依赖关系、shuffle过程、并行度说明

文章目录 1. 缓存和checkpoint机制1.1 缓存使用1.2 checkpoint1.3 缓存和checkpoint的区别 2. 数据共享2.1 广播变量2.2 累加器 3. RDD依赖关系4.shuffle过程4.1 shuffle介绍4.2 spark计算要尽量避免shuffle 5. 并行度 1. 缓存和checkpoint机制 缓存和checkpoint也叫作rdd的持…

源代码加密有哪些技巧呢?除了用加密软件还有哪些方法?

导语:源代码加密是保护软件核心资产的主要方式了,可以通过多种技术措施确保源代码不被未授权访问、复制或篡改,防止泄密问题。这篇文章是一些有效的源代码加密技巧,欢迎您的阅读! 源代码加密常用技巧1、访问控制&…

俏生元将传统膳食智慧融入现代生活,自然成分绽放健康光彩

近年来,当代女性健康食品市场正经历快速发展和显著变化。随着女性健康意识的提升,市场对专门针对女性健康的产品需求快速上升。女性消费者对健康的关注不再局限于表面,而是越来越注重内在健康和生活质量的提升。此外,中式养生文化…

Python 基于 Bert 的中文情歌分析,多分类中文情感分析

前言 在自然语言处理(NLP)领域中,情感分析是一项非常常见的任务。它的目标是判断文本的情感倾向,例如在社交媒体上的评论、产品评价、电影评论等数据中,识别文本是正面的、负面的,还是中性的。与传统的二分…

中航资本:科技股有哪几种?科技股都包含哪些板块?

科技股主要有两种,一种是软科技,一种是硬科技。 1、硬科技:需要强健的数学、物理、计算机科学和工程技能才能够完毕,例如:光电芯片、‌人工智能、‌航空航天、‌生物技能、‌信息技能、计算机视觉、集成电路规划、软件…

2024双十一值得入手的好物品牌有哪些?精选五款双十一必入好物推荐

在双十一这个全民狂欢的购物节,各大品牌纷纷推出诱人的优惠活动,让人心动不已。今年,有哪些品牌的好物值得我们关注呢?下面,我将为大家精选五款双十一必入好物推荐,让你的购物车不再空虚。 双十一必入好物…

怎么把人声和背景音乐分离?实用方法:将人声从音乐中剥离

怎么把人声和背景音乐分离?在数字音频处理中,将人声与背景音乐进行分离是一个复杂但富有挑战性的任务。这种分离技术在音乐制作、影视编辑、版权管理以及个人娱乐等多个领域具有广泛的应用价值。 虽然完美地将人声和背景音乐分离开来可能仍然是一个技术难题&#…

⽂件操作详解

本章讲述的是有关文件的相关内容,本章我们会认识到什么是文件,二进制文件与文本文件,文件的打开和关闭,⽂件的顺序读写和随机读写以及⽂件读取结束的判定和⽂件缓冲区。 1.什么是⽂件 像这样在磁盘(硬盘)上…

骑行眼镜的选择攻略:评论与实用建议!

骑行眼镜评论分析 目录 骑行眼镜评论分析 1. 评论的基本统计分析(数据来源:淘宝评论信息接口) 评论长度的集中趋势: 评论长度的离散程度: 2.用户评价分析 词云高频词分析 1. 眼镜 (2***8 次出现): 2. 不错 (1***9 次出现)…

(29)数字信号处理中正弦波的表示

文章目录 前言一、奈奎斯特采样定理二、正弦波的时域表示三、数字信号处理中正弦波的表示方法 前言 本文首先介绍了奈奎斯特采样定理,然后以奈奎斯特采样定理为基础,给出MATLAB代码,说明在数字信号处理中如何表示一个正弦波。 一、奈奎斯特采…