基於AlexNet和Inception模型思想的TFCNet模型設計與實現
摘要
為了提高卷積神經網路解決圖片分類問題的準確率及深度模型的訓練速度,受AlexNet和Inception模組的啟發,我們基於AlexNet模型的深度結構及Inception模型的寬度結構(特徵的連結)設計實現了具有特徵連結操作的深度神經網路模型,我們稱之為Tensor Feature Concatenate base on Convolutional Neural Networks(簡稱為TFCNet)。我們在ImageNet dataset資料集自構建資料上進行了測試,實驗結果顯示,相比於VGG-16、AlexNet、ResNet、Inception模型的60.50 % 、68.50 %、 58.85 %、 67.55 %。TFCNet模型取得了 69.55 %的實驗結果。
資料集描述
ImageNet 是美國史丹佛的電腦科學家,模擬人類的識別系統建立的一個計算機視覺系統識別專案, 是目前世界上影像識別最大的影像識別應用資料庫。我們抽取其中:“考拉”,“瓢蟲”,“地衣”,“貓鼬”,“羅得西亞脊背龍”,“ 食蟻獸”,“ 維希拉獵犬”,“約克夏犬”等8個動物類別進行構建資料集,每個動物類別1500張圖片。
由於所有影像的大小都不同,因此我們採用如下程式碼對資料進行壓縮處理將圖片生成大小為n x n的正方形影像。
實現程式碼:
n=128
img = cv2.imread('imagenet/koala/218758752_650f6b9b5a.jpg')
if(img.shape[0]>img.shape[1]):
width = n
height = int(img.shape[0] * (n/img.shape[1]))
img = cv2.resize(img,(width,height))
else:
width = int(img.shape[1] * (n/img.shape[0]))
height = n
img = cv2.resize(img,(width,height))
if(img.shape[0]==n):
x = int((img.shape[1]-n)/2)
img = img[0:,x:x+n]
else:
x = int((img.shape[0]-n)/2)
img = img[x:x+n,0:]
資料集描述:
標籤 | 訓練集個數 | 測試集個數 |
考拉 | 1200 | 300 |
瓢蟲 | 1200 | 300 |
地衣 | 1200 | 300 |
貓鼬 | 1200 | 300 |
脊背龍 | 1200 | 300 |
食蟻獸 | 1200 | 300 |
維希拉獵犬 | 1200 | 300 |
約克夏犬 | 1200 | 300 |
總計 | 9600 | 2400 |
模型設計思路
思想來源一:AlexNet模型
打破卷積必池化的思維定式,使用層疊的卷積層,即卷積層+卷積層+池化層來提取影像的特徵。
思想來源二:Inception模組
新的模型設計:
模型不同之處:
1.第二層卷積之後緊跟第三層最大池化操作。
2.第五層最大池化之後,緊跟類似於Inception模組的設計。該處的設計不同於原始Inception V1、V2等操作。
3. 在第八層特徵連結之後,在第九層上直接採用dorpout防止模型的過擬合,該層之後的輸出在進行卷積操作,卷積操作之後引入Batch Normalization方法。
實現程式碼:
input_layer = Input(shape=(n, n, 3))
m = Conv2D(96,kernel_size=(11,11),strides=(4,4),kernel_initializer=kernel_init, bias_initializer=bias_init,padding="valid", activation="relu")(input_layer)
m = MaxPooling2D(pool_size=(3,3),strides=(2,2))(m)
m = Conv2D(256, kernel_size=(5,5), padding="same",strides=(1,1), activation="relu")(m)
m = MaxPooling2D(pool_size=(3,3),strides=(2,2))(m)
m = inception_module(m, 160, 112, 224, 24, 64, 64)
m = Dropout(0.3)(m)
m = Conv2D(384, kernel_size=(3,3), padding="same", strides=(1,1), activation="relu")(m)
m = BatchNormalization()(m)
m = Conv2D(256, kernel_size=(3,3), padding="same", strides=(1,1), activation="relu")(m)
m = inception_module(m, 128, 128, 256, 24, 64, 64)
m = Dropout(0.5)(m)
m = inception_module(m, 128, 128, 256, 24, 64, 64)
m = Conv2D(256, kernel_size=(3,3), padding="same", strides=(1,1), activation="relu")(m)
m = MaxPooling2D(pool_size=(3,3),strides=(2,2))(m)
m = Flatten()(m)
m = Dense(4096,activation="relu")(m)
m = Dense(4096,activation="relu")(m)
m = Dense(units=len(classes), activation="softmax", name = "OUTPUT")(m)
實驗結果分析
對比模型結構
因為為了縮短訓練時間,對相關模型進行了簡化(但是儘量保持複雜的、深度相似)。下面給出具體簡化方式:
類似VGG-16模型:inputlayer->conv->conv->maxpooling->conv->conv->maxpooling->conv->conv->conv->maxpooling->conv->conv->conv->maxpooling->flatten->Dense->Dense->softmax
類似AlexNet模型:https://haosen.blog.csdn.net/article/details/111397142(可以在此部落格查閱)
類似ResNet模型:採用四個殘差塊。如下結構:
layer = Conv2D(32, (3,3), padding='same', activation='relu', kernel_initializer='he_normal')(visible) #reduced the filtersize from 32 to 8
layer = residual_module(visible, 64) #First stack
layer = residual_module(layer, 128) #Second stack
layer = residual_module(layer, 256) #Third stack
layer = residual_module(layer, 512) #Fourth stack
layer = AveragePooling2D((5,5),strides=5)(layer) #Average Pooling layer
layer = Flatten()(layer)
layer = Dense(200, activation='relu')(layer) #FC layer with 200
layer = Dense(len(classes), activation='softmax', name='OUTPUT')(layer)
類似Inception V1模型結構:https://haosen.blog.csdn.net/article/details/111396283(可以在此部落格查閱)
TFCNet模型:如模型設計思路所描述。
實驗結果對比
模型 | 準確率 |
簡化VGG-16模型 | 60.50 % |
簡化AlexNet模型 | 68.50 % |
簡化ResNet模型 | 58.85 % |
簡化Inception VI模型 | 67.78 % |
TFCNet模型 | 69.55 % |
TFCNet模型訓練結果圖:
總結
我們可以看到,雖然TFCNet模型模型取得了較好的實驗結果,但是優勢並不明顯。其越淺的AlexNet模型在資料集上的表現就越好,這有很多原因,可能是資料集不夠多和豐富,所以不需要那麼複雜的模型結構。也可能是裁剪影像對資料的降維處理導致資料影像明顯變小,其中某些有價值的特徵資訊丟失,造成資料集不完整。儘管從裁剪的影像上仍舊可以捕獲很多的特徵,但在某些情況下,被丟棄的影像部分可能包含比預期更多的特徵資訊。因此,下一步可以提高準確率的方法為兩個:1是增大資料集,同時加強資料集的質量。2是對TFCNet進行更進一步的優化。
參考文獻
1. ImageNet: A Large-Scale Hierarchical Image Database
2. Smirnov E A , Timoshenko D M , Andrianov S N . Comparison of Regularization Methods for ImageNet Classification with Deep Convolutional Neural Networks[J]. AASRI Procedia.
3. Russakovsky O , Deng J , Su H , et al. ImageNet Large Scale Visual Recognition Challenge[J]. International Journal of Computer Vision, 2015, 115(3):211-252.
相關文章
- 基於pytorch實現模型剪枝PyTorch模型
- 基於Python的Xgboost模型實現Python模型
- 基於RBAC的許可權設計模型模型
- SAP CRM系統訂單模型的設計與實現模型
- 基於Python和TensorFlow實現BERT模型應用Python模型
- 基於機器學習的經濟預測模型演算法平臺的設計與實現 DAY7機器學習模型演算法
- 快捷簡易統計圖表模型設計與實現模型
- RocketMQ(十):資料儲存模型設計與實現MQ模型
- 關於Actor模型的實現模型
- [譯] TensorFlow 教程 – 07 Inception 模型模型
- [譯] TensorFlow 教程 - 07 Inception 模型模型
- [詳細推導]基於EKF的小車運動模型的python程式設計實現模型Python程式設計
- 資料庫模型設計——關係的實現資料庫模型
- 基於GRU和am-softmax的句子相似度模型 | 附程式碼實現模型
- 基於 OData 模型和 JSON 模型的 SAP UI5 表格控制元件行專案的新增和刪除實現模型JSONUI控制元件
- 模型的威力:基於模型,快速梳理原始碼模型原始碼
- React 概念模型——脫離React談談它的設計思想React模型
- 基於區塊鏈的智慧鎖設計與實現區塊鏈
- 基於Android平臺的RouterSDK設計與實現Android
- Java網路程式設計和NIO詳解3:IO模型與Java網路程式設計模型Java程式設計模型
- 基於android的智慧導診的設計與實現Android
- DSSM模型和tensorflow實現SSM模型
- 基於 Agent 的模型入門:Python 實現隔離模擬模型Python
- 無人機叢集自組織搜尋模擬模型設計與實現無人機模型
- 非同步程式設計:.NET 4.5 基於任務的非同步程式設計模型(TAP)非同步程式設計模型
- 探索Redis設計與實現10:Redis的事件驅動模型與命令執行過程Redis事件模型
- 基於Android的失物招領APP的設計與實現AndroidAPP
- 基於java的網路招聘系統的設計與實現Java
- 基於java的文章釋出系統的設計與實現Java
- 基於Java、Kafka、ElasticSearch的搜尋框架的設計與實現JavaKafkaElasticsearch框架
- 基於中臺思想的物流系統設計(一)
- 模型融合——stacking原理與實現模型
- 業務流程與模型設計小思模型
- 「完結」總結12大CNN主流模型架構設計思想CNN模型架構
- XML 程式設計思想:將檔案合併到 RDF 模型和基本的 RDF 查詢(轉)XML程式設計模型
- 如何基於MindSpore實現萬億級引數模型演算法?模型演算法
- 手把手教你基於華為雲,實現MindSpore模型訓練模型
- 資料庫設計---PowerDesigner(物理模型和概念模型)資料庫模型