1. 程式人生 > >深度學習入門專案:用keras構建CNN或LSTM對minist資料集做簡單分類任務

深度學習入門專案:用keras構建CNN或LSTM對minist資料集做簡單分類任務

深度學習入門專案:用keras構建CNN或LSTM或RNN對Minist資料集做簡單分類任務

參考keras中文文件

——keras: 是一個高階神經網路庫,用 Python 語言寫成,可以執行在 TensorFlow 或者 Theano 之上(即以此為後端)。它關注快速試驗和原型設計。理念是“以最短的時間將想法轉換為結果是做好研究的關鍵”。
(1)iteration:表示1次迭代(也叫training step),每次迭代更新1次網路結構的引數;
(2)batch-size:1次迭代所使用的樣本量;
(3)epoch:1個epoch表示過了1遍訓練集中的所有樣本。
-metrics:列表,包含評估模型在訓練和測試時的網路效能的指標,典型用法是metrics=['ac curacy']


-use_bias: 布林值,是否使用偏置項 (向量)
-validation_split 0~1之間的浮點數,用來在沒有提供驗證集的時候 指定訓練集的一定比例資料作為驗證集。驗證集將不參與訓練,並在每個epoch結束後測試的模型的指標,如損失函式、精確度等。注意,validation_split的劃分在shuffle之前,因此如果你的資料本身是有序的,需要先手工打亂再指定validation_split,否則可能會出現驗證集樣本不均勻。
-alidation_data:形式為(x,y)的tuple,是指定的驗證集。此引數將覆蓋validation_spilt。
-shuffle:布林值或字串,一般為布林值,表示是否在訓練過程中隨機打亂輸入樣本的順序。若為字串“batch”,則是用來處理HDF5資料的特殊情況,它將在batch內部將資料打亂。
-kwargs
:使用TensorFlow作為後端請忽略該引數,若使用Theano/CNTK作為後端,kwargs的值將會傳遞給 K.function。如果使用TensorFlow為後端,這裡的值會被傳給tf.Session.run
——CNN架構:
-loss優化函式
多分類:類別交叉熵(categorical_crossentro py)
二分類:二進位制交叉熵損失函式(binary cross-entropy)
其中conv2d表示執行卷積,maxpooling2d表示執行最大池化,Activation表示特定的啟用函式型別,Flatten層用來將輸入“壓平”,用於卷積層到全連線層的過渡,Dense表示全連線層
例如在手勢識別中左上角是儲存在訓練集X_train[0]的手寫體影象‘5’,y_train[0]表示對應的標籤‘5’。
-池化層:
strides 沒設定的話,就等於 pool_size, (2,2) 相當於圖片長寬各少了一半, 這和 conv2d 是不一樣的model.add(MaxPooling2D(pool_size=(2, 2)))
-to_categorical
to_categorical(y, num_classes=None)
將類別向量(從0到nb_classes的整數向量)對映為二值類別矩陣, 用於應用到以categorical_crossentropy為目標函式的模型中
-你如何知道你的模型是否欠擬合?
如果你的驗證集的準確度高於訓練集,那就是模型欠擬合。此外如果整個模型表現得不好,也會被稱為欠擬合。例如使用線性模型進行影象識別通常會出現欠擬合的結果。
也有可能是 Dropout(Dropout)的原因導致你在深層神經網路中遇到欠擬合的情況。
Dropout在模型訓練時隨機將部分啟用函式設定為零(讓網路某些隱含層節點的權重不工作),以避免過擬合。 這種情況一般不會發生在驗證/測試集的預測中,如果發生,你可以移除 Dropout來解決。如果模型現在出現大規模的過擬合,你可以開始新增小批量的 Dropout。
——RNN架構:
CNN 比較適合圖片的分類任務,但是對於語言翻譯,問答系統等場景不是很適用,假設有一個句子,最後一個單詞為空,人是怎麼填這個空的:He is american, he speak _ 。這個空的值出現是基於前面出現過的 american 來填寫的,即 american -> english。因此我們需要一個模型,不僅能挖掘語料之間的關係,還能挖掘語料之中的關係,這就是 RNN 的思路,因此這個模型要從把 american -> english 作為一個 feature 從一條語料中進行挖掘。RNN 是迴圈神經網路,它的特點是擁有記憶能力,這個能力的實現也很簡單,就是神經網路的輸入不再是一整個大向量了,而是把這個大向量拆成小的向量,每個小向量餵給神經網路後返回的值 input1 和下一個小向量 input2 作為輸入再餵給神經網路。
——LSTM架構:
RNN 的問題在於梯度爆炸和梯度消失,意義是這個模型對很長的句子學習效果不好,所以它又兩個演化版本,LSTM (long short termmemory)和GRU()。
LSTM的記憶能力也沒有很高:好像也就100來個單詞的樣子。LSTM的結構和
RNN 相同,只是計算返回值的方式有所不同,在中間的框內,有多種門,包括遺忘門,殘差門(不計算,直接留到下一個input)等等。背後的原理就是留出很多門,供資料流動,需要的資料從殘差門通過,不需要的走到遺忘門,有組合關係的還可以從其他門走。此外,LSTM 需要一個EOF標誌表示輸入結束,它還可以有多個輸出。LSTM應用非常成功的領域是機器翻譯,twitter bot 就用了這個模型來進行問答處理。
首先說明一點:LSTM輸入層其資料要求必須是3D即需要先進行資料處理
常見方法引入Numpy中的陣列,然後形成元組,之後進行reshape維度變換達到3D效果。
LSTM()層必須指定輸入的形狀。而且每個LSTM層的輸入必須是三維的。
這輸入的三個維度是:
樣本一個序列是一個樣本。批次由一個或多個樣本組成。
時間步長。一個時間步代表樣本中的一個觀察點。
特徵。一個特徵是在一個時間步長的觀察得到的。
這意味著輸入層在擬合模型時以及在做出預測時,對資料的要求必須是3D陣列,即使陣列的特定維度僅包含單個值。當定義LSTM網路的輸入層時,網路假設你有一個或多個樣本,並會給你指定時間步長和特徵數量。你可以通過修改“ input_shape ”的引數修改時間步長和特徵數量。