1. 程式人生 > >基於Matconvnet深度學習框架的方言分類(2)

基於Matconvnet深度學習框架的方言分類(2)

續寫

在前篇文章中,我簡單的介紹了應當如何使用 CNN 來識別和分類語音,並簡單的介紹了 matconvnet 的使用以及example的執行。在下面我會說明如何使用該框架訓練和測試自己的資料。

預處理資料

在上文中,我已經介紹過先將語音樣本生成二維聲譜圖,這樣可以完美的使用 CNN 進行訓練和測試資料。我們已經處理好需要使用的方言聲譜圖樣本,即一共採集了70個縣級市的方言,先使用單字進行分類,每個單字的時長均為1s,每個地方的方言樣本為300個。在(1)中我們已經準備好各個尺寸的圖片,如:32*32、224*224、227*227、256*256等。我們首先將方言樣本送入幾個經典的網路模型進行訓練,最先試驗的網路模型是可以訓練和測試cifar資料的網路模型,在送入網路之前,我們必須要先將圖片存成mat檔案,即一個可以訓練和測試的結構體,在下載的 matconvnet

原始碼中,也為我們提供了該函式,但是由於該函式相對來說稍微複雜一些,因此在 github 上找到一個簡單一些的存mat檔案的函式,程式碼段如下:

function imdb =cnn_plate_setup_data(datadir,size)
inputSize =[size,size,3];
subdir=dir(datadir);
imdb.images.data=[];
imdb.images.labels=[];
imdb.meta.classes = [];
imdb.images.set = [] ;
imdb.meta.sets = {'train', 'val', 'test'} ;
image_counter=0;
trainratio=0.8;
for i=3:length(subdir)
        imgfiles=dir(fullfile(datadir,subdir(i).name));
        imgpercategory_count=length(imgfiles)-2;
        disp([i-2 imgpercategory_count]);
        image_counter=image_counter+imgpercategory_count;
        for j=3:length(imgfiles)
            img=imread(fullfile(datadir,subdir(i).name,imgfiles(j).name));
            img=imresize(img, inputSize(1:2));
            img=single(img);

        imdb.images.data(:,:,:,end+1)=single(img);
        imdb.images.labels(end+1)= i-2;
        if j-2<imgpercategory_count*trainratio
            imdb.images.set(end+1)=1;
        else
            imdb.images.set(end+1)=3;
        end
    end
end
dataMean=mean(imdb.images.data,4);
imdb.images.data = single(bsxfun(@minus,imdb.images.data, dataMean)) ;
imdb.images.data_mean = dataMean;
end

一般simplenn結構的網路,均可以使用該函式生成可以送入網路的mat檔案。將包含所有樣本的尺寸為 32*32 的資料夾路徑和圖片大小作為引數輸入,由於每張圖片的大小均不大,因此程式的執行的時間並不長。執行該程式時會返回一個結構體,將此結構體儲存成mat檔案。

訓練和測試資料

一般下載的原始碼中包含兩種可以cifar資料集的網路結構,一個網路結構較為簡單一些,一個複雜一些,在未做實驗之前,我們並不知道哪個的結果更好,因此我們可以在兩個網路上都執行。在執行之前我們可能需要修改網路結構中的一些引數,如最後全連線層的輸出神經元的個數,改為70,如下圖所示:
這裡寫圖片描述
,其他引數,如學習率和權值初始化使用的方法等,暫時可以不需要改,因為我們並不知道什麼樣的引數是適合我們的資料的,因此我們選擇使用預設的。其次,如果你的機器上安裝了GPU,你還可以修改成在GPU模式下跑,這樣可以極大的縮短你程式的執行時間。

實驗結果

實驗結束後,會輸出一張圖,如下圖所示:

這裡寫圖片描述

其中,top1err表示的就是分到其原屬於的類的錯誤率,從圖中可以看出,在該網路下,大概可以達到85%左右, top5err表示的是分到與其最接近的5個類別中的錯誤率,這個指標我們一般不做參考。