深度学习之基于CNN实现天气识别
其實和貓狗大戰還有上一篇博客的代碼差不太多,但是中間出現了新的問題。
1.導入庫
import numpy as np import tensorflow as tf import os,PIL import random import pathlib import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from keras.utils import np_utils2.加載數據
本環節就是將訓練集和測試集的數目,還有路徑統計出來。方便后面利用網絡進行訓練。
dataset_url = "E:/tmp/.keras/datasets/weather_photos" dataset_dir = pathlib.Path(dataset_url) train_rain = os.path.join(dataset_dir,"train","rain") train_shine = os.path.join(dataset_dir,"train","shine") train_cloudy = os.path.join(dataset_dir,"train","cloudy") train_sunshine = os.path.join(dataset_dir,"train","sunrise")test_rain = os.path.join(dataset_dir,"test","rain") test_shine = os.path.join(dataset_dir,"test","shine") test_cloudy = os.path.join(dataset_dir,"test","cloudy") test_sunshine = os.path.join(dataset_dir,"test","sunrise") train_dir = os.path.join(dataset_dir,"train") test_dir = os.path.join(dataset_dir,"test") #統計訓練集和測試集的數據數目 train_rain_num = len(os.listdir(train_rain)) train_shine_num = len(os.listdir(train_shine)) train_cloudy_num = len(os.listdir(train_cloudy)) train_sunrise_num = len(os.listdir(train_sunshine)) train_all = train_cloudy_num+train_sunrise_num+train_shine_num+train_rain_numtest_rain_num = len(os.listdir(test_rain)) test_shine_num = len(os.listdir(test_shine)) test_cloudy_num = len(os.listdir(test_cloudy)) test_sunrise_num = len(os.listdir(test_sunshine)) test_all = test_cloudy_num+test_sunrise_num+test_shine_num+test_rain_num3.超參數的設置
epochs的次數是不固定的,可以自己設置。
batch_size = 32 epochs = 20 height = 180 width = 1804.數據集預處理
其中包括:歸一化,調整圖片大小,打亂順序等
train_generator = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1.0/255) test_generator = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1.0/255) train_data_gen = train_generator.flow_from_directory(batch_size=batch_size,directory=train_dir,shuffle=True,target_size=(height,width),class_mode="categorical" )test_data_gen = test_generator.flow_from_directory(batch_size=batch_size,directory=test_dir,shuffle=True,target_size=(height,width),class_mode="categorical" )5.搭建網絡&&訓練模型
model = tf.keras.Sequential([tf.keras.layers.Conv2D(16,3,padding="same",activation="relu",input_shape=(height,width,3)),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(32,3,padding="same",activation="relu"),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(64,3,padding="same",activation="relu"),tf.keras.layers.AveragePooling2D((2,2)),tf.keras.layers.Dropout(0.5),tf.keras.layers.Flatten(),tf.keras.layers.Dense(128,activation="relu"),tf.keras.layers.Dense(4,activation='softmax') ]) model.compile(optimizer="adam",loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),metrics=["acc"]) history = model.fit_generator(train_data_gen,steps_per_epoch=train_all//batch_size,epochs=epochs,validation_data=test_data_gen,validation_steps=test_all//batch_size)所出現的問題就在這里,之前的池化方法都是選擇的Max-Pooling,但是單純的用Max-Pooling,實驗效果如下所示:
epochs為20時:
整體趨勢是呈現上升的,但是在epochs為13的時候,出現了驟降的現象。
epochs為50時:
也存在同樣的現象。
嘗試將所有的池化方法改成Average-Pooling。
epochs為20時的實驗效果:
不會出現那樣的驟降現象,但是整體呈現波動的趨勢。
嘗試前兩次的池化方法采用Max-Pooling方法,第三次的池化方法采用Average-Pooling方法。
epochs為20時的實驗效果:
也存在波動的現象,但是相比于之前的兩種方法,得到了改善。
使用Max-Pooling和Average-Pooling的情況分別是什么呢?
①Max-Pooling
在目標對象是偏向于紋理、輪廓時,選用Max-Pooling較好。
②Average-Pooling
在目標對象時偏向于背景或其他信息時,選用Average-Pooling較好。
Max&&Average
③可以在較淺層使用Max-Pooling,用來過濾無用的信息;在較深層使用Average-Pooling,防止丟掉太多高維信息。
天氣識別,背景信息比較重要,所以使用Average-Pooling方法比較合適。
努力加油a啊
總結
以上是生活随笔為你收集整理的深度学习之基于CNN实现天气识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习之基于卷积神经网络实现花朵识别
- 下一篇: aul 学习测试(测量)