深度学习第三周 tensorflow实现天气识别

该文详细介绍了如何利用TensorFlow的`image_dataset_from_directory`函数读取自定义图片数据集,进行天气类别的图像识别。通过数据预处理、搭建CNN网络并训练,最终达到了较好的识别效果。
摘要由CSDN通过智能技术生成

一、本周学习内容:

1、使用tensorflow中的模块读取自己的图片数据集

tensorflow.keras.preprocessing.image_dataset_from_directory(
														   directory=datadir, # 数据集所在目录
                                                           validation_split=0.2,# 保留一部分数据用于验证的比例
                                                           subset='training', # training或validation之一。仅在设置validation_split时使用。标识为训练集还是验证集
                                                           seed=123,  #随机数种子
                                                           image_size=(180,180),  #读取图片后宽高值转化
                                                           batch_size=32) # 多少张图片为一个batch

函数详细介绍看K同学啊的这篇文章:
tf.keras.preprocessing.image_dataset_from_directory() 简介
directory的值如下图
在这里插入图片描述
每一个类别为一个文件夹
在这里插入图片描述
directory=‘H:\xx\第三周 天气识别\weather_photos’

二、前言

我们的天气图片共有1125张,四个类别,类别即为文件夹名。
类别包括:[’cloudy‘,‘rain’,‘shine’,‘sunrise’]
在我们使用tensorflow.keras.preprocessing.image_dataset_from_directory()函数读取后会弹出下列提示
Found 1125 files belonging to 4 classes.
发现1125个文件,4个类别
Using 900 files for training.
使用900个文件进行训练

三、电脑环境

电脑系统:Windows 10
语言环境:Python 3.8.8
编译器:Pycharm 2021.1.3
深度学习环境:TensorFlow 2.8.0,keras 2.8.0
显卡及显存:RTX 3070 8G

四、前期准备

1、导入相关依赖项

from keras.models import Sequential
from keras.layers import *
from tensorflow import keras
import tensorflow as tf
import matplotlib.pyplot as plt

2、设置GPU(我下载的tensorflow-gpu 默认使用GPU)

只使用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")

使用cpu和gpu
os.environ[“CUDA_VISIBLE_DEVICES”] = “-1”

3、加载数据集和展示

(1)、数据集加载

# 数据加载
datadir = "./weather_photos"
# 使用相同的随机数种子是确保  训练集和验证集不重复
train = keras.preprocessing.image_dataset_from_directory(directory=datadir,
                                                           validation_split=0.2,
                                                           subset='training',
                                                           seed=123,
                                                           image_size=(180,180),
                                                           batch_size=32)
val = keras.preprocessing.image_dataset_from_directory(directory=datadir,
                                                           validation_split=0.2,
                                                           subset='validation',
                                                           seed=123,
                                                           image_size=(180,180),
                                                           batch_size=32)
class_names = train.class_names  #获取数据集中包含的类别

(2)、数据展示

图片展示

# 图片展示
plt.figure(figsize=(20, 5))  # 创建一个画布,画布大小为宽20、高5(单位为英寸inch)
for images,labels in train.take(1):
    for i in range(20):
     # 将整个画布分成2行10列,绘制第i+1个子图。
       plt.subplot(2, 10, i+1)
       plt.imshow(images[i].numpy().astype("uint8"), cmap=plt.cm.binary)
       plt.title(class_names[labels[i]])
       plt.axis('off')

plt.show()  #使用pycharm的需要加入这行代码才能将图像显示出来
# train.take(i) 取出第i组图片数据和标签,即将所有图片打包后一个batch为32,
# 所以i最大值为900/32=28组

在这里插入图片描述

五、数据预处理

由于我们使用的是tensorflow.keras.preprocessing.image_dataset_from_directory()函数加载的数据集和之前的不一样,我们需要更改第一层网络层对数据进行预处理,但是注意,这个函数读取后标签并不是热编码格式
标签格式为:
tf.Tensor([1 1 1 0 2 1 1 0 0 3 3 1 0 2 0 2 0 2 0 3 0 3 0 1 1 0 2 0 0 0 0 3], shape=(32,), dtype=int32)
使用数字 0,1,2,3表示各个类别

# 数据预处理
tf.keras.layers.experimental.preprocessing.Rescaling(1./255,input_shape=(180,180,3))

六、搭建CNN网络

除网络层第一层和最后一层有所更改,其余和前两周大致相同

# 网络模型
model = Sequential([
    tf.keras.layers.experimental.preprocessing.Rescaling(1./255,input_shape=(180,180,3)),  #图片预处理将像素值转化到0-1之间
    Conv2D(filters=32,kernel_size=3,activation='relu',input_shape=(180,180,3)),
    MaxPool2D((2,2)),
    Conv2D(filters=64,kernel_size=3,activation='relu'),
    MaxPool2D((2,2)),
    Flatten(),
    Dense(64,activation='relu'),
    Dense(len(class_names))  #因为不是热编码了 去除softmax层
])
# 设置优化器相关
model.compile(optimizer=keras.optimizers.Adam(learning_rate=0.001),loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['acc'])
history = model.fit(train,validation_data=val,epochs=20,verbose=1)
evaluate = model.evaluate(val)
print(evaluate)
Epoch 1/20
29/29 [==============================] - 5s 48ms/step - loss: 1.9895 - acc: 0.6067 - val_loss: 0.9925 - val_acc: 0.6311
Epoch 2/20
29/29 [==============================] - 1s 41ms/step - loss: 0.5318 - acc: 0.8111 - val_loss: 0.5583 - val_acc: 0.7778
Epoch 3/20
29/29 [==============================] - 1s 43ms/step - loss: 0.4252 - acc: 0.8456 - val_loss: 0.5643 - val_acc: 0.8089
Epoch 4/20
29/29 [==============================] - 1s 42ms/step - loss: 0.3341 - acc: 0.8856 - val_loss: 0.5658 - val_acc: 0.7867
Epoch 5/20
29/29 [==============================] - 1s 41ms/step - loss: 0.2832 - acc: 0.8933 - val_loss: 0.5312 - val_acc: 0.8622
Epoch 6/20
29/29 [==============================] - 1s 40ms/step - loss: 0.2009 - acc: 0.9267 - val_loss: 0.5016 - val_acc: 0.8578
Epoch 7/20
29/29 [==============================] - 1s 40ms/step - loss: 0.1309 - acc: 0.9533 - val_loss: 0.4098 - val_acc: 0.8800
Epoch 8/20
29/29 [==============================] - 1s 41ms/step - loss: 0.1303 - acc: 0.9589 - val_loss: 1.1644 - val_acc: 0.7289
Epoch 9/20
29/29 [==============================] - 1s 41ms/step - loss: 0.2489 - acc: 0.9222 - val_loss: 0.5085 - val_acc: 0.8844
Epoch 10/20
29/29 [==============================] - 1s 40ms/step - loss: 0.1139 - acc: 0.9578 - val_loss: 0.5743 - val_acc: 0.8889
Epoch 11/20
29/29 [==============================] - 1s 41ms/step - loss: 0.0954 - acc: 0.9711 - val_loss: 0.5778 - val_acc: 0.8311
Epoch 12/20
29/29 [==============================] - 1s 41ms/step - loss: 0.0818 - acc: 0.9822 - val_loss: 0.5138 - val_acc: 0.8800
Epoch 13/20
29/29 [==============================] - 1s 41ms/step - loss: 0.0738 - acc: 0.9756 - val_loss: 0.5448 - val_acc: 0.9156
Epoch 14/20
29/29 [==============================] - 1s 40ms/step - loss: 0.0205 - acc: 0.9956 - val_loss: 0.6249 - val_acc: 0.8889
Epoch 15/20
29/29 [==============================] - 1s 41ms/step - loss: 0.0300 - acc: 0.9889 - val_loss: 0.9600 - val_acc: 0.8178
Epoch 16/20
29/29 [==============================] - 1s 42ms/step - loss: 0.0977 - acc: 0.9656 - val_loss: 0.5602 - val_acc: 0.8889
Epoch 17/20
29/29 [==============================] - 1s 41ms/step - loss: 0.0197 - acc: 0.9933 - val_loss: 0.7032 - val_acc: 0.8844
Epoch 18/20
29/29 [==============================] - 1s 41ms/step - loss: 0.0127 - acc: 0.9989 - val_loss: 0.5922 - val_acc: 0.9156
Epoch 19/20
29/29 [==============================] - 1s 41ms/step - loss: 0.0053 - acc: 1.0000 - val_loss: 0.5569 - val_acc: 0.8978
Epoch 20/20
29/29 [==============================] - 1s 41ms/step - loss: 0.0088 - acc: 0.9978 - val_loss: 0.6096 - val_acc: 0.8933
8/8 [==============================] - 0s 9ms/step - loss: 0.6096 - acc: 0.8933
[0.6095936894416809, 0.8933333158493042]

七、绘制损失函数图像和准确度图像

绘制代码与前几周相同

# 画准确度图
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs_range = range(20)
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()

在这里插入图片描述

以上就是我本周的学习内容
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

降花绘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值