如何通過人工神經網路實現圖像識別?
假設有若干類似下圖這樣的200x200像素的圖形,如何通過人工神經網路識別到其中的某一種?(實際識別的圖像中有可能有些噪點)
我目前的想法就是,首先把圖像縮小為20x20,然後將其轉換為一個長度為400的數組,其中白色像素點值為1,黑色像素點值為0,把這個數組作為輸入傳遞給BP人工神經網路進行學習和識別。我設置的隱藏層有兩個,分別擁有400和200個神經元,輸出就是一個神經元,只輸出1或0,學習率為0.01,衝量因子為0。但是這樣運行下來,即使訓練到幾百萬次,其識別率還是沒有變化,輸出始終為1,我嘗試改變了幾次隱藏層和學習率、衝量因子的值,也無濟於事,把圖像縮小為8x8也不管用,這是為什麼??而我用同樣的方法做了一個比較簡單的測試,就能很快達到極高的識別率,請大家移步這裡看一下這個測試和其代碼:http://skyd.sinaapp.com/archives/1015為什麼簡單的問題可以解決,複雜一些的就無法解決呢?是我的設置有誤?還是訓練次數仍然不足?或者是我的思路本身就不對?求大家幫我分析一下,謝謝。
作者:九五要當學霸鏈接:知乎專欄來源:知乎著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
原文:Adam Geitgey
原文鏈接:https://medium.com/@ageitgey/machine-learning-is-fun-part-3-deep-learning-and-convolutional-neural-networks-f40359318721#.rp9872f79
翻譯:巡洋艦科技——趙95
有趣的機器學習 前六章已更新!點此查看第一章:最簡明入門指南、第二章:用機器學習【製造超級馬里奧】的關卡、第三章:圖像識別【鳥or飛機】第四章:用深度進行【人臉識別】第五章:使用深度學習進行【語言翻譯】和 序列的魔力第六章:如何用深度學習進行【語音識別】
你是不是看煩了各種各樣對於深度學習的報導,卻不知其所云?我們要來改變這個問題。
這一次我們將一起寫一個,可以判別鳥類還是飛機的程序!我們將學習到如何寫一個,通過深度學習來識別圖像中物體的程序。換個角度來說,我們會解釋Google Photos搜索圖片和識圖所用到的「黑科技」。
Google現在可以讓你在你自己的圖片庫裡面,根據你的描述搜索圖片,即使這些圖片根本沒有被標註任何標籤。這是怎麼做到的呢?
和第1 2章一樣,這個指南是針對所有對機器學習感興趣但不知從哪裡學起的讀者的。本文目標在於平易近人,這意味著文中有大量的概括。但是誰在乎這些呢?只要能讓讀者對於機器學習更感興趣,任務也就完成了。
通過深度學習識別物體
你可能曾經看過這個xkcd漫畫。
Xkcd漫畫編號1425
一個3歲的小孩可以識別出鳥類的照片,然而最頂尖的計算機科學家們已經花了50年時間,來研究如何讓電腦識別出不同的問題。漫畫里的靈感就是這麼來的。
在最近的幾年裡,我們終於找到了一種通過卷積神經網路(Convolutional Neural Networks)來進行物體識別的好方法。這些個詞聽起來就像是從威廉·吉布森的科幻小說編造出來的,但是如果你把這個想法逐步分解,你絕對可以理解它。
讓我們開始吧,我們一起來寫一個識別鳥類的程序。
由淺入深
在我們在識別鳥類之前,讓我們先做個更簡單的——識別手寫的數字「8」
在第二章中我們了解到,神經網路是如何通過連接無數神經元來解決複雜問題的。我們創造了一個小型神經網路,然後根據各種因素(房屋面積,格局,地段等)來估計房屋的價格:
在第一章中我們提到了,機器學習,就是關於重複使用同樣的泛型演算法,來處理不同的數據,解決不同的問題的一種概念。所以這次,我們稍微修改一下同樣的神經網路來識別手寫文字。但是為了更加簡便,我們只會嘗試去識別數字「8」。
機器學習只有在你擁有數據的情況下,最好是大量的數據,才能有效。所以,我們需要有大量的手寫「8」來開始我們的嘗試。幸運的是,恰好有研究人員創造出了「MNIST手寫數字資料庫」能助我們一臂之力。MNIST提供了60,000張手寫數字的圖片,每一張都是一個18×18的圖片。下列是資料庫中的一些例子:
MNIST資料庫中的數字「8」
萬物皆「數」
在第二章中我們創造的那個神經網路,它只能接受三個數字輸入(卧室數,面積,地段),但是現在,我們需要用神經網路來處理圖像。所以到底怎樣才能把圖片,而不是數字,輸入到神經網路里呢?
結論其實極其簡單。神經網路會把數字當成輸入,而對於電腦來說,圖片其實恰好就是一連串代表著每個像素顏色的數字:
我們把一副18×18像素的圖片當成一串324個數字的數列,就可以把它輸入到我們的神經網路裡面了:
為了更好地操控我們的輸入數據,我們把神經網路擴大到擁有324個輸入節點:
請注意,現在有兩個輸出了(而不僅僅是一個房子的價格)。第一個輸出會預測圖片是「8」的概率
而第二個則輸出不是「8」的概率。概括地說,我們就可以依靠多種不同的輸出,利用神經網路把要識別的物品進行分組。
雖然我們的神經網路要比上次大得多(這次是324,上一次是3!=6),但是現在的計算機一眨眼的功夫就能夠對這幾百個節點進行運算。當然,你的手機也可以做到。
現在唯一要做的就是訓練我們的神經網路了。用各種「8」和非「8」的圖片來訓練,這樣它就能學習怎麼去區分了。當我們輸入一個「8」的時候,我們會告訴他「是8的概率」是100%而「不是8的概率」是0%,反之亦然。
下面是一些訓練數據:
嗯…就是這些訓練數據…
我們能在我們筆記本電腦上面用幾分鐘的時間來訓練這種神經網路。完成之後,我們就可以得到一個有著很高的「8」圖片識別率的神經網路。歡迎來到(1980年代末的)圖像識別的世界!
短淺的目光
僅僅把像素輸入到神經網路里,就可以做出圖像的識別,這很棒!機器學習就像魔法一樣!對不對!!
呵呵,當然,不會,這麼,簡單,呵呵呵。(Well, of course it』s not that simple.感受作者的神之鄙視吧哈哈哈)
首先,好消息是,當我們的數字就在圖片的正中間的時候,我們的識別器幹得還不錯。
壞消息是:
當數字並不是正好在圖片中央的時候,我們的識別器就完全不工作了。一點點的位移我們的識別器就掀桌子不幹了(╯‵□′)╯︵┻━┻。
這是因為我們的網路只學習到了正中央的「8」。它並不知道那些偏離中心的「8」長什麼樣子。它僅僅知道中間是「8」的規律。
在真實世界中,這好像並沒什麼卵用。真實世界的問題永遠不會如此輕鬆簡單。所以,我們需要知道,怎麼才能讓我們的神經網路在非中心「8」的情況下識別。
暴力演算法(Brute
Force) 方法1:滑框搜索
我們已經創造出了一個能夠很好地識別圖片中間「8」的程序。如果我們乾脆把整個圖片分成一個個小部分,並挨個都識別一遍,直到我們找到「8」,這樣能不能行呢?
這個叫做
滑框(Sliding Window)法,是暴力演算法之一。在有限的情況下,它能夠識別的很好。但實際上它並不怎麼有效率,你必須在同一張圖片裡面一遍一遍的識別不同大小的物體。實際上,我們可以做得更好。
暴力演算法 方法2:更多的數據與一個深度神經網
剛剛我們提到,經過訓練之後,我們只能找出在中間的「8」。如果我們用更多的數據來訓練,數據中包括各種不同位置和大小的「8」,會怎樣呢?
我們並不需要收集更多的訓練數據。實際上,我們可以寫一個小腳本來生成各種各樣不同位置「8」的新圖片:
通過組合不同版本的訓練圖片,我們創造出了「合成訓練數據(Synthetic Training Data)」。這是一種非常實用的技巧!
使用這種方法,我們能夠輕易地創造出無限量的訓練數據。
更多的數據讓我們的神經網路更難解決這個問題。但是把神經網路擴大,它就能尋找到更複雜的規律了,以此來彌補解決困難問題的不足。
要擴大我們的網路,我們首先要把把節點一層一層的堆積起來:
因為它比傳統的神經網路層數更多,所以我們把它稱作「深度神經網路(Deep Neural Network)」。
這個想法在1960年代末就出現了,但直至今日,訓練這樣一個大型神經網路也是一件不切實際的緩慢的事情。然而,一旦我們知道了如何使用3D顯卡(最開始是用來進行快速矩陣乘法運算)來替代普通的電腦處理器,使用大型神經網路的想法就立刻變得可行了。實際上,你用來玩守望先鋒的NVIDIA GeForce GTX1080這款顯卡,就可以極快速的訓練我們的神經網路。
但是儘管我們能把我們的神經網路擴張的特別大並使用3D顯卡快速訓練它,這依然不能讓我們一次性得到結論。我們需要更智能的將圖片處理後,放入到神經網路里。
仔細想想,如果把圖片最上方和最下方的「8」當成兩個不同的對象來處理,並寫兩個不同的網路來識別它們,這件事實在是說不通。
應該有某種方法,使得我們的神經網路,在沒有額外的訓練數據的基礎上,能夠非常智能的識別出圖片上任何位置的「8」,都是一樣是「8」。幸運的是…這就是!
卷積性的解決辦法
作為人類,你能夠直觀的感知到圖片中存在某種層級(Hierarchy)或者是概念結構(Conceptual structure).參考下面的這個圖片:
作為人類,你立刻就能識別出這個圖片的層級:
- 地面是由草和水泥組成的
- 有一個小孩在圖片中
- 小孩在騎彈簧木馬
- 彈簧木馬在草地上
最重要的是,我們識別出了「小孩兒」,無論這個小孩所處的環境是怎樣的。當每一次出現不同的環境時,我們人類不需要重新學習「小孩兒」這個概念。
但是現在,我們的神經網路做不到這些。他認為「8」出現在圖片的不同位置,就是不一樣的東西。它不能理解「物體出現在圖片的不同位置還是同一個物體」這個概念。這意味著在每種可能出現的位置上,它必須重新學習識別各種物體。這弱爆了。
我們需要讓我們的神經網路理解「平移不變性(Translation invariance)」這個概念——也就是說,「8」無論出現在圖片的哪裡,它都是「8」。
我們會通過一個叫做卷積(Convolution)的方法來達成這個目標。卷積的靈感是由計算機科學和生物學共同激發的。(有一些瘋狂的生物學家,它們用奇怪的針頭去戳貓的大腦,來觀察貓是怎樣處理圖像的。 &>_&<)
卷積是如何工作的
之前我們提到過,可以把一整張圖片當做一串數字輸入到神經網路裡面。不同的是,這次我們會利用「位移物相同」(譯者註:也就是平移不變性)的概念來把這件事做得更智能。
下面就是,它怎樣工作的,分步解釋——
第一步:把圖片分解成部分重合的小圖塊
和上述的滑框搜索類似的,我們把滑框在整個圖片上滑過,並存儲下每一個框裡面的小圖塊:
這麼做之後,我們把圖片分解成了77塊同樣大小的小圖塊。
第二步:把每個小圖塊輸入到小型神經網路中
之前,我們把一張圖片輸入到神經網路中來看這張圖片是不是一個「8」。這一次我們還做同樣的事情,只不過我們輸入的是一個個小圖塊:
然而,有一個非常重要的不同:對於每個小圖塊,我們會使用同樣的神經網路權重。換一句話來說,我們同樣對待每一個小圖塊。如果哪個小圖塊有任何異常出現,我們就認為這個圖塊是「異常(Interesting)」的
第三步:把每一個小圖塊的結果都保存到一個新的數列當中
我們不想並不想打亂小圖塊的順序。所以,我們把每個小圖片按照圖片上的順序輸入並保存結果,就像這樣:
換一句話來說,我們從一整張圖片開始,最後得到一個稍小一點的數列,裡面存儲著我們圖片中的哪一部分有異常。
第四步:縮減像素採樣
第三步的結論是一個數列,這個數列對應著原始圖片中哪一部分最異常。但是這個數列依然很大:
為了減小這個數列的大小,我們利用一種叫做最大池化(Max Pooling)的方法來降低採樣(Downsample)。它聽起來很棒,但這仍舊不夠!
讓我們先來看每個2×2的方陣數列,並且留住最大的數:
這裡,一旦我們找到組成2×2方陣的4個輸入中任何異常的部分,我們就只保留這一個數。這樣一來就縮減了我們的數列大小,並且保留住了最重要的部分。
最後一步:作出預測
到現在為止,我們已經把一個很大的圖片,縮減到了一個相對較小的數列。
你猜怎麼著?數列就是一序列數而已,所以我們我們可以把這個數列輸入到另外一個神經網路裡面去。最後的這個神經網路會決定這個圖片是否匹配。為了區分它和卷積的不同,我們把它稱作「完全連接」網路(」Fully Connected」 Network)
所以從開始到結束,我們的五步就像管道一樣連接起來:
添加更多步驟
我們的圖片處理管道是一系列的步驟:卷積,最大池化,還有最後的「完全連接」網路。
你可以把這些步驟組合、堆疊任意多次,來解決真實世界的問題。你可以有2層,3層或者10層卷積層。當你想要縮小你的數據大小的時候,你也隨時可以調用最大池化函數。
我們解決問題的基本方法,就是從一整個圖片開始,一步一步逐漸的分解它,直到你找到了一個單一的結論。你的卷積層越多,你的網路就越能識別出複雜的特徵。
比如說,第一個卷積的步驟可能就是嘗試去識別尖銳的東西,而第二個卷積步驟則是通過找到的尖銳物體來找鳥類的喙,最後一步是通過鳥喙來識別整隻鳥,以此類推。
下面是一個更實際的深層卷積網路的樣子(就是你們能在研究報告裡面找到的那種例子一樣):
這裡,他們從一個224×224像素的圖片開始,使用了卷積和最大池化兩次,再使用3次卷積,最大池化一次,最後在使用兩個完全連接層。最終的結果是這個圖片能被分類到1000種不同類別當中的某一種!
建造正確的網路
所以,你是怎麼知道我們需要結合哪些步驟來讓我們的圖片分類器工作呢?
說句良心話,你必須做許多的實驗和檢測才能回答這個問題。在為你要解決的問題找到完美的結構和參數之前,你可能需要訓練100個網路。機器學習包含了許多的嘗試和錯誤!
建立我們的鳥類分類器
現在我們已經做夠了準備,我們已經可以寫一個小程序來判定一個圖片是不是一隻鳥了。
誠然,我們需要數據來開始。CIFAR10資料庫免費提供了6000張鳥類的圖片和52000張非鳥類的圖片。但是為了獲取更多的數據,我們仍需添加Caltech-UCSD Birds-200-2011資料庫,這裡面包括了另外的12000張鳥類的圖片。
這是我們整合後的資料庫裡面的一些鳥類的圖片:
這是資料庫里一些非鳥類圖片:
這些數據對於我們這篇文章解釋說明的目的來說已經夠了,但是對於真實世界的問題來說,72000張低解析度的圖片還是太少了。如果你想要達到Google這種等級的表現的話,你需要上百萬張高清無碼大圖。在機器學習這個領域中,有更多的數據總比一個更好的演算法更重要!現在你知道為什麼谷歌總是樂於給你提供無限量免費圖片存儲了吧?
他們,需要,你的,數據!!
為了簡歷我們的分類器,我們將會使用TFLearn。TFLearn是Google TensorFlow的一個封裝,Google TensorFlow包含了一個擁有簡單API的深度學習庫。使用它來定義我們網路的層級,建立卷積網路的過程和寫幾行代碼一樣簡單。
下面是定義並訓練我們網路的代碼:
# -*- coding: utf-8 -*-
"""
Based on the tflearn example located here:
https://github.com/tflearn/tflearn/blob/master/examples/images/convnet_cifar10.py
"""
from __future__ import division, print_function, absolute_import
# Import tflearn and some helpers
import tflearn
from tflearn.data_utils import shuffle
from tflearn.layers.core import input_data, dropout, fully_connected
from tflearn.layers.conv import conv_2d, max_pool_2d
from tflearn.layers.estimator import regression
from tflearn.data_preprocessing import ImagePreprocessing
from tflearn.data_augmentation import ImageAugmentation
import pickle
# Load the data set
X, Y, X_test, Y_test = pickle.load(open("full_dataset.pkl", "rb"))
# Shuffle the data
X, Y = shuffle(X, Y)
# Make sure the data is normalized
img_prep = ImagePreprocessing()
img_prep.add_featurewise_zero_center()
img_prep.add_featurewise_stdnorm()
# Create extra synthetic training data by flipping, rotating and blurring the
# images on our data set.
img_aug = ImageAugmentation()
img_aug.add_random_flip_leftright()
img_aug.add_random_rotation(max_angle=25.)
img_aug.add_random_blur(sigma_max=3.)
# Define our network architecture:
# Input is a 32x32 image with 3 color channels (red, green and blue)
network = input_data(shape=[None, 32, 32, 3],
data_preprocessing=img_prep,
data_augmentation=img_aug)
# Step 1: Convolution
network = conv_2d(network, 32, 3, activation="relu")
# Step 2: Max pooling
network = max_pool_2d(network, 2)
# Step 3: Convolution again
network = conv_2d(network, 64, 3, activation="relu")
# Step 4: Convolution yet again
network = conv_2d(network, 64, 3, activation="relu")
# Step 5: Max pooling again
network = max_pool_2d(network, 2)
# Step 6: Fully-connected 512 node neural network
network = fully_connected(network, 512, activation="relu")
# Step 7: Dropout - throw away some data randomly during training to prevent over-fitting
network = dropout(network, 0.5)
# Step 8: Fully-connected neural network with two outputs (0=isn"t a bird, 1=is a bird) to make the final prediction
network = fully_connected(network, 2, activation="softmax")
# Tell tflearn how we want to train the network
network = regression(network, optimizer="adam",
loss="categorical_crossentropy",
learning_rate=0.001)
# Wrap the network in a model object
model = tflearn.DNN(network, tensorboard_verbose=0, checkpoint_path="bird-classifier.tfl.ckpt")
# Train it! We"ll do 100 training passes and monitor it as it goes.
model.fit(X, Y, n_epoch=100, shuffle=True, validation_set=(X_test, Y_test),
show_metric=True, batch_size=96,
snapshot_epoch=True,
run_id="bird-classifier")
# Save model when training is complete to a file
model.save("bird-classifier.tfl")
print("Network trained and saved as bird-classifier.tfl!")
如果你使用一款非常好的有著足夠RAM的遊戲顯卡(比如說Nvidia GeForce GTX980 Ti)來訓練的話,訓練一個小時以內就能結束,但是如果你用一般的cpu來訓練的話,他可能需要更長的時間。
隨著訓練的進行,準確度也會增加。在第一遍訓練之後,它的準確度是75.4%。10次訓練之後,就上升到了91.7%。當訓練了至少50次的時候,它的準確率達到了95.5%。繼續訓練並沒有增加他的準確度,所以我停止了。
恭喜!!我們的程序現在能識別鳥類的圖片了!
測試我們的網路
現在我們擁有了一個訓練過的神經網路,我們可以開始使用它了!這兒有一個簡單的腳本,通過接收一個圖片來預測他是否是鳥類。
但是為了真正檢測我們的神經網路有多有效果,我們需要進行大量的圖片測試。我創造的那個資料庫裡面有15000張用來驗證的圖片。當我把這15000張圖片放到程序里運行的時候,它的預測準確率達到了95%。
看起來還不錯,對吧?額…這事兒吧還得辯證的看…
95%準確是有多準確?
我們的網路聲稱有95%準確。但是細節決定成敗(devil is in the detail),這意味著各種各樣問題可能產生。
比如說,如果我們的訓練數據有5%是鳥類而剩下95%不是呢?一個程序即使每次都猜「不是鳥」也能達到95%的準確率。這也就意味著這個程序並沒有什麼作用。
相比於準確度,我們必須更多的關注在數字本身。為了判別一個分類系統有多好,我們需要知道它是怎樣出錯誤的,而不是僅僅關注它錯了多少次。
與其只考慮我們預測的對與錯,不如把我們的程序分解成四個不同的類別——
首先,對於那些被我們的網路正確辨認為鳥類而且確實是鳥類的,我們叫他們「真正類(True Positives)」
第二,被辨認為非鳥類,而且確實是非鳥類的,我們叫「真負類(True Negatives)」
第三,被辨認為鳥類,但卻是非鳥類的,我們叫「假正類(False Positives)」
第四,被辨認為非鳥類,但卻是鳥類的,我們叫「假負類(False Negatives)」
下面的數據是使用那15000張驗證圖片,在每種類別中我們猜測的數量:
為什麼我們要把結果做上述分類呢?因為並不是每一個錯誤產生的幾率都是一樣的。
設想如果我們寫一個通過MRI圖像來探測癌症的程序。如果我們探測到了癌症,我們更希望它是「假正類」而不是「假負類」。因為假負類是最可怕的情況——那就是你的程序告訴你,你絕對沒有病,但實際上你已經病入膏肓了。
我們需要計算準確和召回指標(Precision and Recall metrics)而並不僅僅關注總體的準確度。準確和召回指標給了我們程序表現的一個清晰的反饋:
這告訴我們,當我們猜「鳥類」的時候,97%的時候是正確的。但是這同時也告訴我們說,我們只找到了真實鳥類裡面的90%。換句話說,我們可能不會找到每一隻鳥,但是當我們找到一隻鳥的時候,我們很確定它就是一隻鳥!
路還在遠方…
現在你知道了一些關於深度卷積網路的基本概念了,你可以用TFLearn嘗試一下各種結構的神經網路的例子。它甚至包括了自帶的數據,你根本不用自己去收集圖片。
你同時也知道了如何開始創造分支或是學習機器學習的其他領域。接下來為什麼不嘗試著去學習如何用演算法來訓練我們的電腦玩Atari 遊戲呢?
謝 @Alice TAN 邀請。
如果只是為了分類,且相同形狀算一類,而且全是這種黑白形狀規則圖像(帶一點雜訊),其實不必用神經網路,因為這類有明顯集合形狀的圖形其實很簡單,區別非常明顯。如果有雜訊,則先用去噪方法去噪,然後使用這個特徵---白色部分面積/白色部分輪廓長度(表示一個圖像的圓的程度)建立分類器,很容易判別。仔細看了一下,有兩個非常明顯的問題:
1. 神經元個數的設計:第二層就比第一層少一半的神經元,基本沒有起到壓縮維度的作用。這個問題中的圖像比較簡單,覺得壓縮到20-50維左右比較合適;2. 既然是一個分類問題,頂層的至少還得有一個分類器吧。。。通常用softmax就行了,比較簡單,求解也容易。當然別的分類器,SVM,Random Forest都可以。另外,建議圖像問題最好神經網的層數多一些,這個問題至少有兩個隱層效果會比較的好。具體的題主可以參考斯坦福大學一篇用深度神經網路實現手寫數字識別的教程,鏈接如下:
http://deeplearning.stanford.edu/tutorial/這個問題應該比題主的問題難度更大,文中的方法肯定適用。
另外期末大作業遇到問題的時候,爭取自己解決,才能真正有提高。找到兩個相關的資料,正在研究,大家也幫忙指點一下:http://www.codeproject.com/Articles/143059/Neural-Network-for-Recognition-of-Handwritten-Dihttp://www.codeproject.com/Articles/140631/Convolutional-Neural-Network-MNIST-Workbench
吳老師今天發在facebook上,百度的deep learning system 在imageNet上達到5.98%錯誤率。鏈接:https://www.facebook.com/andrew.ng.96?fref=nf
用卷積神經網路吧。分析實在無力,還要搬磚
直接學習數據本身,通常不見得好使。你試試方波變換之後再弄?
可以看看coursera上Andrew NG的視頻,第五章還是第六章的作業是利用神經網路實現郵政編碼識別!
這個問題我也遇到過,後來我調整了Sigmoid函數的陡峭性解決了。我理解問題在於Aforge給權重隨機賦的初始值不夠小,導致在輸入神經元多的時候加權和過大,而普通的Sigmoid在輸入比較大的時候非常接近1,所以第一層所有神經元的輸出其實就變成了1。這樣的話後面怎麼反饋都沒辦法了。
所以可以考慮改成sigmoid(x) = 1/(1+e-ax),a調成一個比較小的值比如0.1或者0.01。試一下。找了一個比較靠近的答案:【深度】 基於圖的機器學習技術:谷歌眾多產品和服務背後的智能
cv2.countNonZero,是不是就可以解決。
變成數組肯定不行,萬一目標不在圖正中心,稍微偏了一點,都會識別不出來的。一開始還是要用卷積層,還有池化層,可以做稍微深點,四五層卷積層都是可以的,最後再把這些抽象的特徵拍成一維數組,也就是加上全連接層,最後一層全連接層的output就是你要分成幾類,當然每張圖的label也要相應標好。Lenet 網路確實也蠻符合你的數據集的,可以試試。那些超參感覺沒有什麼大問題,主要還是網路沒搭好!希望對你能有幫助
正在研究視頻流識別
推薦閱讀:
※單目SLAM在移動端應用的實現難點有哪些?
※到日本東大讀修士,然後再申請到美國top10的PHD可行么?
※orb-slam在眾多SLAM方法中處於怎樣的地位?
※機器人能通過觀察環境明白自己在哪嗎?機器人定位的方式對解決「人類路痴」問題有幫助嗎?
※基於深度學習的單目深度估計有什麼發展前景呢?