基於Matconvnet深度學習框架的方言分類(2)
續寫
在前篇文章中,我簡單的介紹了應當如何使用 CNN 來識別和分類語音,並簡單的介紹了 matconvnet 的使用以及example的執行。在下面我會說明如何使用該框架訓練和測試自己的資料。
預處理資料
在上文中,我已經介紹過先將語音樣本生成二維聲譜圖,這樣可以完美的使用 CNN 進行訓練和測試資料。我們已經處理好需要使用的方言聲譜圖樣本,即一共採集了70個縣級市的方言,先使用單字進行分類,每個單字的時長均為1s,每個地方的方言樣本為300個。在(1)中我們已經準備好各個尺寸的圖片,如:32*32、224*224、227*227、256*256等。我們首先將方言樣本送入幾個經典的網路模型進行訓練,最先試驗的網路模型是可以訓練和測試cifar資料的網路模型,在送入網路之前,我們必須要先將圖片存成mat檔案,即一個可以訓練和測試的結構體,在下載的 matconvnet
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個類別中的錯誤率,這個指標我們一般不做參考。