? 我的环境:
语言环境:Python3
深度学习环境:TensorFlow2
? 相关教程:
编译器教程:新手入门深度学习 | 1-2:编译器Jupyter Notebook
深度学习环境配置教程:新手入门深度学习 | 1-1:配置深度学习环境
一个深度学习小白需要的所有资料我都放这里了:新手入门深度学习 | 目录
建议你学习本文之前先看看下面这篇入门文章,以便你可以更好的理解本文:
? 新手入门深度学习 | 2-1:图像数据建模流程示例
强烈建议大家使用Jupyter Lab
编译器打开源码,你接下来的操作将会非常便捷的!
大家好,我是K同学啊!这次为大家准备了一个天气识别的实例,文章我采用了VGG16
、ResNet50
、IceptionV3
、DenseNet121
、LeNet-5
、MobileNetV2
、EfficientNetB0
等7个模型来识别天气,使用的数据集包含 5,531 张不同类型天气的图像,最后模型的识别准确率为 93.9%
。
? 重点说明:本文为大家准备了多个算法进行对比分析,每一个算法的学习率都是独立的,你可以自由调整。并且为你提供了准确率(Accuracy)
、损失(Loss)
、召回率(recall)
、精确率(precision)
以及AUC值
等众多指标的对比分析,你只需要选择需要对比的模型、指标以及数据集即可进行相应的对比分析。
? 在本代码中你还可以探究的内容如下:
同一个学习率对不同模型的影响
同一个模型在不同学习率下的性能
Dropout层的作用(解决过拟合问题)
? 效果展示:
我们的代码流程图如下所示:
? 前期准备工作
import tensorflow as tfgpus = tf.config.list_physical_devices("GPU")if gpus: tf.config.experimental.set_memory_growth(gpus[0], True) #设置GPU显存用量按需使用 tf.config.set_visible_devices([gpus[0]],"GPU")plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号# 打印显卡信息,确认GPU可用print(gpus)
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
? 导入数据
"""关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789"""train_ds = tf.keras.preprocessing.image_dataset_from_directory( "./2-DataSet/", validation_split=0.2, subset="training", label_mode = "categorical", seed=12, image_size=(img_height, img_width), batch_size=batch_size)
Found 5531 files belonging to 9 classes.Using 4425 files for training.
"""关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789"""val_ds = tf.keras.preprocessing.image_dataset_from_directory( "./2-DataSet/", validation_split=0.2, subset="validation", label_mode = "categorical", seed=12, image_size=(img_height, img_width), batch_size=batch_size)
Found 5531 files belonging to 9 classes.Using 1106 files for validation.
class_names = train_ds.class_namesprint(class_names)
['dew', 'fogsmog', 'frost', 'hail', 'lightning', 'rain', 'rainbow', 'rime', 'snow']
AUTOTUNE = tf.data.AUTOTUNE# 归一化def train_preprocessing(image,label): return (image/255.0,label)train_ds = ( train_ds.cache() .map(train_preprocessing) # 这里可以设置预处理函数 .prefetch(buffer_size=AUTOTUNE))val_ds = ( val_ds.cache() .map(train_preprocessing) # 这里可以设置预处理函数 .prefetch(buffer_size=AUTOTUNE))
plt.figure(figsize=(14, 8)) # 图形的宽为10高为5for images, labels in train_ds.take(1): for i in range(28): plt.subplot(4, 7, i + 1) plt.xticks([]) plt.yticks([]) plt.grid(False) # 显示图片 plt.imshow(images[i]) plt.title(class_names[np.argmax(labels[i])])plt.show()
? 设置评估指标metrics
评估指标用于衡量深度学习算法模型的质量,评估深度学习算法模型对于任何项目都是必不可少的。在深度学习中,也有许多不同类型的评估指标可用于衡量算法模型,例如accuracy
、precision
、recall
、auc
等都是常用的评估指标。
关于评估指标metrics的详细介绍请参考:?新手入门深度学习 | 3-5:评估指标metrics
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]0
? 定义模型
? VGG16模型
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]1
? ResNet50模型
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]2
? InceptionV3模型
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]3
? DenseNet121算法模型
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]4
? LeNet-5模型
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]5
? MobileNetV2算法模型
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]6
? EfficientNetB0算法模型
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]7
? 训练模型
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]8
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]9
"""关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789"""train_ds = tf.keras.preprocessing.image_dataset_from_directory( "./2-DataSet/", validation_split=0.2, subset="training", label_mode = "categorical", seed=12, image_size=(img_height, img_width), batch_size=batch_size)0
"""关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789"""train_ds = tf.keras.preprocessing.image_dataset_from_directory( "./2-DataSet/", validation_split=0.2, subset="training", label_mode = "categorical", seed=12, image_size=(img_height, img_width), batch_size=batch_size)1
"""关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789"""train_ds = tf.keras.preprocessing.image_dataset_from_directory( "./2-DataSet/", validation_split=0.2, subset="training", label_mode = "categorical", seed=12, image_size=(img_height, img_width), batch_size=batch_size)2
"""关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789"""train_ds = tf.keras.preprocessing.image_dataset_from_directory( "./2-DataSet/", validation_split=0.2, subset="training", label_mode = "categorical", seed=12, image_size=(img_height, img_width), batch_size=batch_size)3
"""关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789"""train_ds = tf.keras.preprocessing.image_dataset_from_directory( "./2-DataSet/", validation_split=0.2, subset="training", label_mode = "categorical", seed=12, image_size=(img_height, img_width), batch_size=batch_size)4
"""关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789"""train_ds = tf.keras.preprocessing.image_dataset_from_directory( "./2-DataSet/", validation_split=0.2, subset="training", label_mode = "categorical", seed=12, image_size=(img_height, img_width), batch_size=batch_size)5
"""关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789"""train_ds = tf.keras.preprocessing.image_dataset_from_directory( "./2-DataSet/", validation_split=0.2, subset="training", label_mode = "categorical", seed=12, image_size=(img_height, img_width), batch_size=batch_size)6
"""关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789"""train_ds = tf.keras.preprocessing.image_dataset_from_directory( "./2-DataSet/", validation_split=0.2, subset="training", label_mode = "categorical", seed=12, image_size=(img_height, img_width), batch_size=batch_size)7
"""关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789"""train_ds = tf.keras.preprocessing.image_dataset_from_directory( "./2-DataSet/", validation_split=0.2, subset="training", label_mode = "categorical", seed=12, image_size=(img_height, img_width), batch_size=batch_size)8
"""关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789"""train_ds = tf.keras.preprocessing.image_dataset_from_directory( "./2-DataSet/", validation_split=0.2, subset="training", label_mode = "categorical", seed=12, image_size=(img_height, img_width), batch_size=batch_size)9
Found 5531 files belonging to 9 classes.Using 4425 files for training.0
Found 5531 files belonging to 9 classes.Using 4425 files for training.1
? 结果分析
? 准确率对比分析
Found 5531 files belonging to 9 classes.Using 4425 files for training.2
? 损失对比分析
Found 5531 files belonging to 9 classes.Using 4425 files for training.3
? 召回率对比分析
召回率(Recall),也称查全率
,是被正确分类的正例(反例)样本,占所有正例(反例)样本的比例。
Found 5531 files belonging to 9 classes.Using 4425 files for training.4
? 混淆矩阵
Found 5531 files belonging to 9 classes.Using 4425 files for training.5
Found 5531 files belonging to 9 classes.Using 4425 files for training.6
? 评估指标生成
support
:当前行的类别在测试数据中的样本总量;
precision
:被判定为正例(反例)的样本中,真正的正例样本(反例样本)的比例,精度=正确预测的个数(TP)/被预测正确的个数(TP+FP)。
recall
:被正确分类的正例(反例)样本,占所有正例(反例)样本的比例,召回率=正确预测的个数(TP)/预测个数(TP+FN)。
f1-score
: 精确率和召回率的调和平均值,F1 = 2精度召回率/(精度+召回率)。
accuracy
:表示准确率,也即正确预测样本量与总样本量的比值。
macro avg
:表示宏平均,表示所有类别对应指标的平均值。
weighted avg
:表示带权重平均,表示类别样本占总样本的比重与对应指标的乘积的累加和。
Found 5531 files belonging to 9 classes.Using 4425 files for training.7
Found 5531 files belonging to 9 classes.Using 4425 files for training.8
? Loss/accuracy/Precision/Recall对比分析
Found 5531 files belonging to 9 classes.Using 4425 files for training.9
? AUC
即ROC曲线(TPR vs FPR)下的面积,其值在0~1之间,AUC值越高,代表分类器效果越好。更详细的介绍请看AUC 评价指标详解,准确率(ACC),敏感性(sensitivity),特异性(specificity)计算 Python3【TensorFlow2入门手册】一文。
关于ROC曲线应用的其他实例:
深度学习100例 | 第35天:脑肿瘤识别
"""关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789"""val_ds = tf.keras.preprocessing.image_dataset_from_directory( "./2-DataSet/", validation_split=0.2, subset="validation", label_mode = "categorical", seed=12, image_size=(img_height, img_width), batch_size=batch_size)0
? 指定图片进行预测
"""关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789"""val_ds = tf.keras.preprocessing.image_dataset_from_directory( "./2-DataSet/", validation_split=0.2, subset="validation", label_mode = "categorical", seed=12, image_size=(img_height, img_width), batch_size=batch_size)1
"""关于image_dataset_from_directory()的详细介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/117018789"""val_ds = tf.keras.preprocessing.image_dataset_from_directory( "./2-DataSet/", validation_split=0.2, subset="validation", label_mode = "categorical", seed=12, image_size=(img_height, img_width), batch_size=batch_size)2