- 🍨 本文为🔗365天深度学习训练营 内部限免文章(版权归 K同学啊 所有)
- ** 参考文章地址:🔗深度学习100例-卷积神经网络(CNN)天气识别 | 第5天 **
- 🍖 作者:K同学啊
一、本周学习内容:
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()
以上就是我本周的学习内容