1. 程式人生 > >改變keras模型引數來提高kaggle手寫體數字識別

改變keras模型引數來提高kaggle手寫體數字識別

一開始使用的是alexnet模型,最好達到了99.271的成績。在成績榜上大概應在20%左右。所以還想繼續改進一下模型,一開始想的是使用修改超引數,以及加入隨機失活,bn層,應用了資料增強。先說一下超引數的改變:更改過濾器的數量,更改batch_size,應用了學習率退火。

更改過濾器的數量

改動:應用了自己上一個筆記中講的模型,更改了第一個第二個的卷積層的過濾器數量。
結果:一個epoch的執行時間並沒有太大的變化,最初的驗證集的準確率有所升高,損失值有下降,但是最後提交的準確率也沒有太大的變化。

更改batch_size

改動:將batch_size從200降到了100。
結果:一個epoch的執行時間快了一點。驗證集的準確率最後提升了一點,但提交後的成績反而下降了,可能是減少的batch_size不能更好的模擬完整的訓練集。

使用學習率退火

一開始的學習率可能在起始時表現的很好,但在訓練一段時間過後,可能一直達不到最優值,這時候就可以減少學習率來慢慢達到最優值。
改動:

learning_rate_reduction = ReduceLROnPlateau(monitor='val_loss', 
                                            patience=3, 
                                            verbose=1, 
                                            factor
=0.5, min_lr=0.00001)

監督的值,過幾個回合,乘以0.5,最小的學習率(keras中文文件)

model.fit(train_images, train_labels, validation_data=(validation_images,      validation_labels), epochs=60, batch_size=100, verbose=2,callbacks=[learning_rate_reduction])

這裡應用了回撥函式來使用學習率退火。
結果:同上述引數改動一樣,結果並沒有什麼太大的改變,但是在最後幾次epoch中,確實都更要接近最優值,更穩定。

小結

我們通過幾次引數的改變還有資料增強都沒有使得最終的成績有所提高,有些改變還使得成績下降。所以猜測可能是模型不夠複雜,不能夠表達更復雜的式子,模型本身的效能,容量限制了它的提升。所以後來採用了更深的類VGG模型。

更改網路結構

改動:

    model.add(Convolution2D(filters = 32, kernel_size = (5,5),padding = 'Same', 
                 activation ='relu', input_shape = (28,28,1)))
    model.add(Convolution2D(filters = 32, kernel_size = (5,5),padding = 'Same', 
                 activation ='relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Dropout(0.25))


    model.add(Convolution2D(filters = 64, kernel_size = (3,3),padding = 'Same', 
                 activation ='relu'))
    model.add(Convolution2D(filters = 64, kernel_size = (3,3),padding = 'Same', 
                 activation ='relu'))
    model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))
    model.add(Dropout(0.25))


    model.add(Flatten())
    model.add(Dense(256, activation = "relu"))
    model.add(Dropout(0.5))
    model.add(Dense(10, activation = "softmax"))

結果:執行一次epoch時間增加很多,成績提升到了99.5左右。

使用BN層

改動:在每個卷積層使用BN。
結果:發現模型收斂的更快,使用更少的步驟就能達到一樣的準確率。但是可能對準確率很高的模型並沒有太大的提升。

使用dropout

改動:在每個fc層加入dropout
結果:最後的準確率有所提升。看來dropout還是能控制過擬合。

使用資料增強

在keras文件中,有對圖片預處理的函式。利用一個圖片迭代器。各引數都有介紹。
資料增強:通過改變灰度,旋轉等方法來使圖片稍有不同,保持標籤不同,這能有效的控制過擬合,提升模型的泛化能力。

datagen = ImageDataGenerator(
        featurewise_center=False,  # set input mean to 0 over the dataset
        samplewise_center=False,  # set each sample mean to 0
        featurewise_std_normalization=False,  # divide inputs by std of the dataset
        samplewise_std_normalization=False,  # divide each input by its std
        zca_whitening=False,  # apply ZCA whitening
        rotation_range=10,  # randomly rotate images in the range (degrees, 0 to 180)
        zoom_range = 0.1, # Randomly zoom image 
        width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)
        height_shift_range=0.1,  # randomly shift images vertically (fraction of total height)
        horizontal_flip=False,  # randomly flip images
        vertical_flip=False)  # randomly flip images

使用了圖片生成器在fit中要使用fit_generator。.flow()接收numpy陣列和標籤為引數,生成經過資料提升或標準化後的batch資料,並在一個無限迴圈中不斷的返回batch資料.

history = model.fit_generator(datagen.flow(train_images, train_labels, batch_size=86),
                              epochs = 30, validation_data = (validation_images,validation_labels),
                              verbose = 2, steps_per_epoch=train_images.shape[0] // 86
                              , callbacks=[learning_rate_reduction])

這裡要注意的是,fit與fit_generator的區別。fit_generator裡的一個epoch裡包含的是steps_per_epoch * batch_size。steps_per_epoch應該等於你資料集的數量除以batch_size。
結果:發現成績大有提升!提升到了99.678。

小結

我們在想要改變引數時,首先要考慮的是整個網路結構。整個網路是不是效能足夠,容量足夠來通過改變引數得到更好的結果。所以現在的網路都是想要做的更深,因為更深的網路能過表達更復雜的式子,模型的容量更大。
BN層能夠加速模型的訓練,收斂速度。並且不需要很仔細引數的初始化,還能使用更高的學習率。
dropout能夠很好地控制過擬合。
資料增強很強大,增大訓練集數量,提升模型的泛化能力。
batch_size應該有一個比較合理的範圍,不能盲目地增大,縮小。
學習率退火有利於找到一個最優值。

相關推薦

改變keras模型引數提高kaggle手寫體數字識別

一開始使用的是alexnet模型,最好達到了99.271的成績。在成績榜上大概應在20%左右。所以還想繼續改進一下模型,一開始想的是使用修改超引數,以及加入隨機失活,bn層,應用了資料增強。先說一下超引數的改變:更改過濾器的數量,更改batch_size,應用了

keras解決kaggle-手寫體數字識別

上一篇是用tensorflow完成的,發現tensorflow的程式碼量比較多。因為tensorflow是比較低層次的庫,而keras可以使用tensorflow為後端,實現模型起來程式碼會較少一點,而且也便於我們增加模型的深度。總的來說,keras更適合於上手

優化Linux的核心引數提高伺服器併發處理能力

PS:在伺服器硬體資源額定有限的情況下,最大的壓榨伺服器的效能,提高伺服器的併發處理能力,是很多運維技術人員思考的問題。要提高Linux系統下的負載能力,可以使用nginx等原生併發處理能力就很強的web伺服器,如果使用Apache的可以啟用其Worker模式,來提高其併發處理能力。除此之外,在考慮節省成

keras實現手寫體數字識別功能的CNN

資料為框架自帶的數字手寫體 中間的數值為灰度值,注意灰度值和RGB值不是一個概念,灰度值是介於白和黑之間的值,表示範圍0-255.可以理解成黑的程度。所以圖片只需要一層就OK。 資料集包含60000張圖片,大小均為28x28. 程式碼如下: #

使用L2正則化和平均滑動模型的LeNet-5MNIST手寫數字識別模型

put 輸出矩陣 conv2 cross -m collect variable global 空間 使用L2正則化和平均滑動模型的LeNet-5MNIST手寫數字識別模型 覺得有用的話,歡迎一起討論相互學習~Follow Me 參考文獻Tensorflow實戰Googl

支援向量機(SVM)實現MNIST手寫體數字識別

一、SVM演算法簡述 支援向量機即Support Vector Machine,簡稱SVM。一聽這個名字,就有眩暈的感覺。支援(Support)、向量(Vector)、機器(Machine),這三個毫無關聯的詞,硬生生地湊在了一起。從修辭的角度,這個合成詞最終落腳到”Machine”上,還以

GradientBoosting和AdaBoost實現MNIST手寫體數字識別

一、兩種演算法簡介: Boosting 演算法簡介 Boosting演算法,我理解的就是兩個思想: 1)“三個臭皮匠頂個諸葛亮”,一堆弱分類器的組合就可以成為一個強分類器; 2)“知錯能改,善莫大焉”,不斷地在錯誤中學習,迭代來降低犯錯概率 當然,要理解好Boosting的思

python資料建模與KNN演算法實現手寫體數字識別

      資料建模指的是對現實世界各類資料的抽象組織,建立一一個適合的模型對資料進行處理。在資料分析與挖掘中,我們通常需要根據一-些資料建 立起特定的模型,然後處理。模型的建立需要依賴於演算法, - -般,常見的演算法有分類、聚類、關聯、

DeepLearning4j實戰(7):手寫體數字識別GPU實現與效能比較

在之前的部落格中已經用單機、Spark分散式兩種訓練的方式對深度神經網路進行訓練,但其實DeepLearning4j也是支援多GPU訓練的。這篇文章我就總結下用GPU來對DNN/CNN進行訓練和評估過程。並且我會給出CPU、GPU和多卡GPU之前的效能比較圖表。不過,由於重點在於說明Mnist資料集

Deeplearning4j 實戰(2):Deeplearning4j 手寫體數字識別Spark實現

在前兩天的部落格中,我們用Deeplearning4j做了Mnist資料集的分類。算是第一個深度學習的應用。像Mnist資料集這樣圖片尺寸不大,而且是黑白的開源圖片集在本地完成訓練是可以的,畢竟我們用了Lenet這樣相對簡單的網路結構,而且本地的機器配置也有8G左右的記憶體。但實際生產中,圖片的數量

載入卷積神經網路實現手寫體數字識別

上一篇部落格中,我們已經訓練好了模型 接下來我們要載入模型並識別真實場景下的一個手寫體數字 在此之前,我們先要準備好一張28*28畫素的影象(可用ps製作),然後通過處理將畫素的強度值變為0-1之間,之後即可輸入模型進行識別。 儲存已訓練的模型檔案如下: 程式

執行手寫體數字識別例程

1.MNIST資料集 (Mixed National Institute of Standards and Technology)是一個大型的手寫體數字資料庫,廣泛用於機器學習領域的訓練和測試。包括60000個訓練集和10000個測試集,每張圖進行尺寸歸一化,數字居中處理,固定尺寸為28

matlab+BP神經網路實現手寫體數字識別

個人部落格文章連結:http://www.huqj.top/article?id=168 接著上一篇所說的 BP神經網路,現在用它來實現一個手寫體數字的識別程式,訓練素材來自吳恩達機器學習課程,我把打包好上傳到了網盤上: 1 2 連結:htt

深度學習筆記——TensorFlow學習筆記(三)使用TensorFlow實現的神經網路進行MNIST手寫體數字識別

本文是TensorFlow學習的第三部分,參考的是《TensorFlow實戰Google深度學習框架》一書,這部分講述的是使用TensorFlow實現的神經網路進行MNIST手寫體數字識別一個例項。 這個例項將第二部分講述的啟用函式、損失函式、優化演算法、正則化等都運用上了

C++使用matlab卷積神經網路庫MatConvNet進行手寫數字識別

環境:WIN10(64 bit)+VS2010(64 bit)+Matlab2015b(64 bit) 我們的目的是將MatConvNet自帶的手寫數字識別DEMO移植到一個簡單的WIN32 DEMO中使用,主要過程有以下幾個步驟: (1)配置MatConvNet

Tensorflow解決MNIST手寫體數字識別

這裡給出的程式碼是來自《Tensorflow實戰Google深度學習框架》,以供參考和學習。 首先這個示例應用了幾個基本的方法: 使用隨機梯度下降(batch) 使用Relu啟用函式去線性化 使用正則化避免過擬合 使用帶指數衰減的學習率 使用滑動平均模型

Deeplearning4j 實戰(2):Deeplearning4j 手寫體數字識別Spark實現【轉】

from:http://blog.csdn.net/wangongxi/article/details/54616842 在前兩天的部落格中,我們用Deeplearning4j做了Mnist資料集的分類。算是第一個深度學習的應用。像Mnist資料集這樣圖片尺寸不大,

TensorFlow的layer層搭建卷積神經網路(CNN),實現手寫體數字識別

   目前正在學習使用TensorFlow,看到TensorFlow官方API上有一個呼叫layer層來搭建卷積神經網路(CNN)的例子,和我們之前呼叫的nn層的搭建卷積神經網路稍微有點不同。感覺layer層封裝性更強,直接輸入引數就可以是實現。程式碼如下:#-*- codi

keras實現mnist資料集手寫數字識別

經過幾天的爬坑,“東搞西搞”終於把深度學習的“HELLO,WORLD”做出來了,以下是自己的實戰過程: 關於keras識別手寫數字的入門準備: 2.Mnist資料集的準備 3.匯入資料集測試 4.實現baseline模型: 5.實現簡單的卷積神經網路 一.

Keras中將LSTM用於mnist手寫數字識別

import keras from keras.layers import LSTM from keras.layers import Dense, Activation from keras.datasets import mnist from keras.models