深度学习之基于InceptionV3实现水果识别
看了一下之前做過的有關深度學習的實驗,發現InceptionV3這個模型還沒有用到,雖然并沒有自己實現該網絡模型,但是先學習一下它的原理,再利用遷移學習測試一下它的模型準確率,也不失為一種不錯的學習方法。
本次實驗利用InceptionV3網絡模型,實現水果識別。
1.導入庫
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt import os,pathlib,PILgpus = tf.config.experimental.list_physical_devices('GPU') tf.config.experimental.set_memory_growth(gpus[0], True)# 支持中文 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負號2.數據加載
原數據集中給出了訓練集、驗證集、測試集三個子文件夾,就不需要人為的劃分了。每個子文件夾中包含21類水果。
data_dir_train = "E:/tmp/.keras/datasets/fruit_rec/fruits-360-original-size/fruits-360-original-size/Training" data_dir_test = "E:/tmp/.keras/datasets/fruit_rec/fruits-360-original-size/fruits-360-original-size/Test" data_dir_validation = "E:/tmp/.keras/datasets/fruit_rec/fruits-360-original-size/fruits-360-original-size/Validation"data_dir_train = pathlib.Path(data_dir_train) data_dir_test = pathlib.Path(data_dir_test) data_dir_validation = pathlib.Path(data_dir_validation)all_images_paths = list(data_dir_train.glob('*')) all_images_paths = [str(path) for path in all_images_paths] all_label_names = [path.split("\\")[8].split(".")[0] for path in all_images_paths]超參數的設置
height = 256 width = 256 epochs =10 batch_size = 32分別構建訓練集、驗證集和測試集的ImageDataGenerator,并進行數據預處理
train_data_gen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,rotation_range=45,shear_range=0.2,zoom_range=0.2,horizontal_flip=True ) test_data_gen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255 ) validation_data_gen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,validation_split=0.2 )train_ds = train_data_gen.flow_from_directory(directory=data_dir_train,target_size=(height,width),shuffle=True,batch_size=batch_size,class_mode='categorical' ) test_ds = test_data_gen.flow_from_directory(directory=data_dir_test,target_size=(height,width),shuffle=True,batch_size=batch_size,class_mode='categorical' ) validation_ds = validation_data_gen.flow_from_directory(directory=data_dir_validation,target_size=(height,width),shuffle=True,batch_size=batch_size,class_mode='categorical' )整理后的數據如下所示:
3.InceptionV3網絡
InceptionV3模型是谷歌Inception系列里面的第三代模型,相比于其它神經網絡模型,Inception網絡最大的特點在于將神經網絡層與層之間的卷積運算進行了拓展。
就像VGG,AlexNet網絡,它就是一直垂直卷積下來的,一層接著一層。
ResNet則是創新性的引入了殘差網絡的概念,使得靠前若干層的某一層數據輸出直接跳過多層引入到后面數據層的輸入部分,后面的特征層的內容會有一部分由其前面的某一層線性貢獻。
Google Inception Net在2014年的 ImageNet Large Scale Visual Recognition Competition (ILSVRC)中取得第一名,該網絡以結構上的創新取勝,通過采用全局平均池化層取代全連接層,極大的降低了參數量,是非常實用的模型,一般稱該網絡模型為Inception V1。隨后的Inception V2中,引入了Batch Normalization方法,加快了訓練的收斂速度。在Inception V3模型中,通過將二維卷積層拆分成兩個一維卷積層,不僅降低了參數數量,同時減輕了過擬合現象。參考鏈接
Inception網絡采用不同大小的卷積核,使得存在不同大小的感受野,最后實現拼接達到不同尺度特征的融合。
整體結構圖如下所示:
模型搭建:
在VGG系列的模型搭建時,利用遷移學習得到網絡模型后,會將trainable設置為False,也就意味著前面的參數是不能夠訓練的。但是InceptionV3網絡以及ResNet網絡,由于引入了BN層,因此不能直接將trainable設置為False,博主在參考別人的博客時,有的博主提出在整個網絡模型搭建完成后,再將trainable設置為False,但是博主的實驗效果并不好,在訓練集上面的準確率非常高,但是測試集上準確率特別低。因此直接去掉了將trainable設置為False這一步驟,模型的準確率得到提高。
實驗效果如下所示,經過10個epoch之后,模型準確率在90%左右。
利用驗證集繪制混淆矩陣,關于混淆矩陣的代碼,參考我之前的博客即可。
努力加油a啊
總結
以上是生活随笔為你收集整理的深度学习之基于InceptionV3实现水果识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lspci命令详解无网卡信息_linux
- 下一篇: 梳理百年深度学习发展史-七月在线机器学习