深度学习21天——卷积神经网络(CNN):天气识别(第5天)
目录
一、前期准备
1.1 设置GPU
1.2 导入数据
1.2.1 np.random.seed( i )
1.2.2 tf.random.set_seed()
1.3 查看数据
二、数据预处理
2.1 加载数据
2.1.1 image_dataset_from_directory()
2.1.2 batch_size
2.2 可视化数据
2.3 再次检查数据
2.4 配置数据集
三、构建CNN、编译、训练、评估
3.1 构建CNN
3.2 编译
3.3 训练模型
3.4 模型评估
活动地址:CSDN21天学习挑战赛
学习:深度学习100例-卷积神经网络(CNN)天气识别 | 第5天_K同学啊的博客-CSDN博客
一、前期准备
1.1 设置GPU
import tensorflow as tfgpus = tf.config.list_physical_devices("GPU")if gpus:gpu0 = gpus[0] #如果有多个GPU,仅使用第0个GPUtf.config.experimental.set_memory_growth(gpu0, True) #设置GPU显存用量按需使用tf.config.set_visible_devices([gpu0],"GPU")
1.2 导入数据
import matplotlib.pyplot as plt
import os,PIL# 设置随机种子尽可能使结果可以重现
import numpy as np
np.random.seed(1)# 设置随机种子尽可能使结果可以重现
import tensorflow as tf
tf.random.set_seed(1)from tensorflow import keras
from tensorflow.keras import layers,modelsimport pathlib
# 写入数据文件夹所在的路径
data_dir = "D:/jupyter notebook/DL-100-days/datasets/weather_photos/"data_dir = pathlib.Path(data_dir) # 创建了path路径的对象
相关资料:Python 的 os.path() 和 pathlib.Path()_Looooking的博客-CSDN博客
1.2.1 np.random.seed( i )
参考:np.random.seed()随机数种子学习笔记_偶尔躺平的咸鱼的博客-CSDN博客
①随机数种子相当于给我们一个初值,之后按照固定顺序生成随机数(该随机数种子对应的list);如果使用相同的seed( )值,则每次生成的随机数列表都相同;
②如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
③设置seed()的时,可以调用多次random()向该随机数的列表中添加信息;而再次使用设置的seed()值时,仅一次有效,也就是说调用第二次random()时则脱离该随机数的列表。
④seed方法设立的目的是为了能够实现实验的可重复进行,得到相同的随机值结果。
该设置的初值并没有实际意义
np.random.seed(0) # 先定义一个随机数种子
print(np.random.rand(2, 3)) # 随机生成1个 2×3 的矩阵
所以,np.random.seed(0) 每次只对下一次生成的随机数起作用,不同的初值生成的随机数不同,调用相同的初值,生成的随机数是相同的
如
np.random.seed(0) # 先定义一个随机数种子
print(np.random.rand(2, 3)) # 随机生成1个 2×3 的矩阵np.random.seed(0) # 先定义一个随机数种子
print(np.random.rand(2, 3)) # 随机生成1个 2×3 的矩阵
输出的两个结果相同
1.2.2 tf.random.set_seed()
上面写法是tensorflow2.0的写法,如果是tensorflow1.0则为:set_random_seed()
#tensorflow2.0
tf.random.set_seed(seed
)#tensorflow1.0
tf.set_random_seed(seed
)
下面以 tf.set_random_seed(i)为例,用法一致
参考:
tf.random.set_seed用法_仁义礼智信达的博客-CSDN博客_tf.set_random_seed 和Tensorflow中关于随机数生成种子tf.set_random_seed()_qq_31878983的博客-CSDN博客_tensorflow 随机种子
用法与 np.random.seed(0) 相近,但分 全局种子 和 操作种子 两种
1.3 查看数据
# 返回 data.dir 文件夹及所有子文件夹中所有后缀为 .jpg的形成列表后的长度
image_count = len(list(data_dir.glob('*/*.jpg')))print("图片总数为:",image_count)
图片总数为: 1125
# 返回该文件夹下所有 sunrise +后面任意 且后缀为.jpg的列表
roses = list(data_dir.glob('sunrise/*.jpg'))
PIL.Image.open(str(roses[0])) # 打开第一个图片
返回的都是路径,因为PIL.Image.open()专接图片路径,用来直接读取该路径指向的图片。要求路径必须指明到哪张图,不能只是所有图所在的文件夹;
二、数据预处理
2.1 加载数据
使用 image_dataset_from_directory() 方法将磁盘中的数据加载到 tf.data.Dataset 中
batch_size = 32
img_height = 180
img_width = 180
"""
关于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,subset="training",seed=123,image_size=(img_height, img_width),batch_size=batch_size)
Found 1125 files belonging to 4 classes.
Using 900 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=123,image_size=(img_height, img_width),batch_size=batch_size)
Found 1125 files belonging to 4 classes.
Using 225 files for validation.
2.1.1 image_dataset_from_directory()
tf.keras.preprocessing.image_dataset_from_directory(directory,labels="inferred",label_mode="int",class_names=None,color_mode="rgb",batch_size=32,image_size=(256, 256),shuffle=True,seed=None,validation_split=None,subset=None,interpolation="bilinear",follow_links=False,
)
具体见大佬文章:tf.keras.preprocessing.image_dataset_from_directory() 简介_K同学啊的博客-CSDN博客_tf.keras.preprocessing.image
这里只展示出用到的参数:
- directory: 数据所在目录。如果标签是
inferred
(默认),则它应该包含子目录,每个目录包含一个类的图像。否则,将忽略目录结构。
- validation_split: 0和1之间的可选浮点数,可保留一部分数据用于验证。即选择测试集占数据集总数的比例
- subset:
training
或validation
之一。仅在设置validation_split
时使用。
- seed: 用于shuffle和转换的可选随机种子。
- image_size: 从磁盘读取数据后将其重新调整大小。默认:
(256,256)
。由于管道处理的图像批次必须具有相同的大小,因此该参数必须提供。
- batch_size: 数据批次的大小。默认值:
32
2.1.2 batch_size
表示单次传递给程序用以训练的参数个数。比如我们的训练集有1000个数据。这是如果我们设置batch_size=100,那么程序首先会用数据集中的前100个参数,即第1-100个数据来训练模型。当训练完成后更新权重,再使用第101-200的个数据训练,直至第十次使用完训练集中的1000个数据后停止。
其他参考:机器学习中的batch_size是什么?_勤奋的大熊猫的博客-CSDN博客_batch size是什么意思
2.2 可视化数据
plt.figure(figsize=(20, 10))for images, labels in train_ds.take(1):for i in range(20):ax = plt.subplot(5, 10, i + 1)plt.imshow(images[i].numpy().astype("uint8"))plt.title(class_names[labels[i]])plt.axis("off")
2.3 再次检查数据
for image_batch, labels_batch in train_ds:print(image_batch.shape)print(labels_batch.shape)break
Image_batch是形状的张量(32,180,180,3)。这是一批形状180x180x3的32张图片(最后一维指的是彩色通道RGB)。
Label_batch 是形状(32,)的张量,这些标签对应32张图片
2.4 配置数据集
shuffle():打乱数据,关于此函数的详细介绍可以参考:数据集shuffle方法中buffer_size的理解 - 知乎
prefetch():预取数据,加速运行
cache():将数据集缓存到内存当中,加速运行
AUTOTUNE = tf.data.AUTOTUNE
# 当buffer_size设定为tf.data.AUTOTUNE时,将会自动调整缓冲区的大小(buffer size)。train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
三、构建CNN、编译、训练、评估
因为与之前的区别不大,所以直接放代码了
3.1 构建CNN
num_classes = 4"""
关于卷积核的计算不懂的可以参考文章:https://blog.csdn.net/qq_38251616/article/details/114278995layers.Dropout(0.4) 作用是防止过拟合,提高模型的泛化能力。
在上一篇文章花朵识别中,训练准确率与验证准确率相差巨大就是由于模型过拟合导致的关于Dropout层的更多介绍可以参考文章:https://mtyjkh.blog.csdn.net/article/details/115826689
"""model = models.Sequential([layers.experimental.preprocessing.Rescaling(1./255, input_shape=(img_height, img_width, 3)),layers.Conv2D(16, (3, 3), activation='relu', input_shape=(img_height, img_width, 3)), # 卷积层1,卷积核3*3 layers.AveragePooling2D((2, 2)), # 池化层1,2*2采样layers.Conv2D(32, (3, 3), activation='relu'), # 卷积层2,卷积核3*3layers.AveragePooling2D((2, 2)), # 池化层2,2*2采样layers.Conv2D(64, (3, 3), activation='relu'), # 卷积层3,卷积核3*3layers.Dropout(0.3), layers.Flatten(), # Flatten层,连接卷积层与全连接层layers.Dense(128, activation='relu'), # 全连接层,特征进一步提取layers.Dense(num_classes) # 输出层,输出预期结果
])model.summary() # 打印网络结构
卷积的计算_K同学啊的博客-CSDN博客
Dropout层 tf.keras.layers.Dropout() 介绍_K同学啊的博客-CSDN博客_keras.layers.dropout
关于 layers.experimental.preprocessing.Rescaling 查看官方文档tf.keras.layers.Rescaling | TensorFlow Core v2.9.1,即将输入值重新调整到新范围的预处理图层
池化层由之前的最大池化层调整成了平均池化层
3.2 编译
# 设置优化器
opt = tf.keras.optimizers.Adam(learning_rate=0.001)model.compile(optimizer=opt,loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])
还是 adam 优化器,不过设置了学习率
3.3 训练模型
epochs = 10history = model.fit(train_ds,validation_data=val_ds,epochs=epochs
)
3.4 模型评估
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']loss = history.history['loss']
val_loss = history.history['val_loss']epochs_range = range(epochs)plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()
深度学习21天——卷积神经网络(CNN):天气识别(第5天)相关推荐
- 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-04-基于Python的LeNet之MLP
原文地址可以查看更多信息 本文主要参考于:Multilayer Perceptron python源代码(github下载 CSDN免费下载) 本文主要介绍含有单隐层的MLP的建模及实现.建议在阅读 ...
- 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-03-基于Python的LeNet之LR
原地址可以查看更多信息 本文主要参考于:Classifying MNIST digits using Logistic Regression python源代码(GitHub下载 CSDN免费下载) ...
- 【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理(1)
上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...
- [人工智能-深度学习-33]:卷积神经网络CNN - 常见分类网络- LeNet网络结构分析与详解
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- [人工智能-深度学习-24]:卷积神经网络CNN - CS231n解读 - 卷积神经网络基本层级
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:[人工智能-深度学习-23]:卷积神经网络CNN - CS231n解读 - 卷积神经网络基本层级_ ...
- 深度学习21天——卷积神经网络(CNN):实现mnist手写数字识别(第1天)
目录 一.前期准备 1.1 环境配置 1.2 CPU和GPU 1.2.1 CPU 1.2.2 GPU 1.2.3 CPU和GPU的区别 第一步:设置GPU 1.3 MNIST 手写数字数据集 第二步: ...
- python卷积神经网络cnn的训练算法_【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理...
上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...
- 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-01-CNN基础知识点
转载自:http://blog.csdn.net/niuwei22007/article/details/47399913 <CNN基础知识点>From:Convolutional Neu ...
- 深度学习 之七 【卷积神经网络 CNN】
1.CNN的应用 了解 WaveNet 模型. 如果你能训练人工智能机器人唱歌,干嘛还训练它聊天?在 2017 年 4 月,研究人员使用 WaveNet 模型的变体生成了歌曲.原始论文和演示可以在 此 ...
最新文章
- 毕业就拿阿里offer,你和他比差在哪?
- JavaScript实现在线MD5、SHA、AES、Rabit 、RC4、TripleDES Ripemd160 加密解密工具-toolfk程序员在线工具网...
- C# 用IrisSkin4.dll美化你的WinForm
- B - 小希的迷宫 (并查集判断是否存在环)
- mysql binlog限流问题总结
- jdom 读取xml_JDOM分析器–将XML文件读取为Java对象
- 如何发挥思维导图真正的杀伤力?
- 平安性格测试题及答案_平安人寿做性格测试怎么?
- 环境变量和模式(Vite)
- NLP机器翻译任务中,如何用Bleu score评价翻译质量(学习心得)
- java课堂作业部分
- 精度、召回率、准确率、F1、ROC、AUC的理解
- Echarts的配置与使用
- 中国好SaaS走进海尔:企业关注重心从纯模式创新回归资源竞争
- 移动平均线SMA/EMA/SMMA/LWMA
- 新基建下的城轨,城市群功能还能如何被提升?
- PHP生成助记词和BTC、ETH、LTC地址
- 11111111庄子
- oracle小鸡与合计,oracle 小鸡初始化配置(密码登录/防火墙/bbr)
- GPG 错误:http://ppa.launchpad.net/git-core/ppa/ubuntu xenial InRelease: 由于没有公钥,无法验证下列签名: NO_PUBKEY
热门文章
- 亚信科技java笔试题答案_亚信科技笔试题
- Greenshot 学习笔记(2) Greenshot.Drawing.Gripper类
- Word内安装Mathtype
- 【多式联运】基于遗传算法求解多式联运低碳路径规划问题matlab源码
- Effie指南|给实习记者,高效记者们常用的文字编辑类软件
- petalinux中加入驱动模块
- 李永乐复习全书高等数学 第三章 一元函数积分学
- 停车场系统无法连接服务器,手动挡停车场 联机版无法连接服务器是什么原因...
- 决策树算法预测NBA赛事结果
- Win32学习(七) 鼠标消息