Keras-数据增广
數(shù)據(jù)增廣
簡(jiǎn)介
在實(shí)際的深度學(xué)習(xí)項(xiàng)目中,數(shù)據(jù)集的需求是非常大的,強(qiáng)大的模型包含更多的參數(shù),訓(xùn)練這些參數(shù)需要大量的數(shù)據(jù);大量的數(shù)據(jù)訓(xùn)練使得模型的泛化能力變強(qiáng),一定程度上克制過擬合的出現(xiàn)。
數(shù)據(jù)增廣是對(duì)數(shù)據(jù)集進(jìn)行倍增的有效手段,首次成功應(yīng)用于AlexNet取得巨大的效果。對(duì)圖片增廣其主要含義為對(duì)原來的圖片進(jìn)行翻轉(zhuǎn)(水平翻轉(zhuǎn)和垂直翻轉(zhuǎn))、扭曲、變形、拉伸、填充、換色、裁減等手段產(chǎn)生新的圖片,該圖片近似于原圖分布且對(duì)模型而言是全新的圖片,從而達(dá)到獲取更多訓(xùn)練數(shù)據(jù)且有標(biāo)注(標(biāo)注與原圖一致或可以通過變換得到)的目的。
Keras作為一個(gè)成熟的方便的深度學(xué)習(xí)框架提供了很高效的圖片數(shù)據(jù)增廣的API,本項(xiàng)目將逐一演示其作用。
原則
數(shù)據(jù)增廣的手段是以任務(wù)為驅(qū)動(dòng)的,是對(duì)任務(wù)有利的而不是有害的。
不恰當(dāng)?shù)臄?shù)據(jù)增廣會(huì)干擾模型的訓(xùn)練,而不會(huì)提高模型效果。(如將手寫數(shù)據(jù)垂直翻轉(zhuǎn)沒有意義,沒有人的手寫字是倒置的且會(huì)使模型難以擬合。)
不是所有時(shí)候數(shù)據(jù)增廣都是有效果的,有時(shí)候即使正確的增廣未必會(huì)達(dá)到預(yù)期的效果,這是模型的問題。
數(shù)據(jù)增廣
-
說明
- Keras要求在創(chuàng)建生成器的時(shí)候就指定增廣方式,所以對(duì)于訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)必須創(chuàng)建不同的生成器(要求訓(xùn)練數(shù)據(jù)一般情況下是不需要增廣的)。**注意,生成器只是生成器,要想生成數(shù)據(jù)需要調(diào)用生成器的flow方法或者flow_*方法才能得到數(shù)據(jù)集,調(diào)用flow得到的生成器才是fit_generator方法需要的生成器。
- 參數(shù)說明
- from keras.preprocessing.image import ImageDataGeneratorimport keras.backend as Ktrain_gen = ImageDataGenerator(featurewise_center=False,samplewise_center=False,featurewise_std_normalization=False,samplewise_std_normalization=False,rescale=1/255.,zca_whitening=False,zca_epsilon=1e-6,rotation_range=0.,width_shift_range=0.,height_shift_range=0.,shear_range=0.,zoom_range=0.,channel_shift_range=0.,fill_mode='nearest',cval=0.,horizontal_flip=False,vertical_flip=False,preprocessing_function=None,data_format=K.image_data_format())
- 說明
- featurewise_center:布爾型,輸入數(shù)據(jù)集去中心化(均值為0)。
- samplewise_center:布爾型,輸入數(shù)據(jù)每個(gè)樣本均值為0。
- featurewise_std_normalization:布爾型,將輸入樣本除以數(shù)據(jù)集的標(biāo)準(zhǔn)差以完成標(biāo)準(zhǔn)化。
- samplewise_std_normalization:布爾型,將輸入樣本除以樣本自身的標(biāo)準(zhǔn)差以完成標(biāo)準(zhǔn)化。
- rescale:數(shù)值型,重放縮因子,默認(rèn)為None。如果為None或0則不進(jìn)行放縮,否則會(huì)將該放縮因子乘到樣本數(shù)據(jù)上(在應(yīng)用任何其他變換之前),一般設(shè)定為1/255.用于圖片歸一化。
- zca_whitening:布爾型,對(duì)輸入數(shù)據(jù)進(jìn)行ZCA白化。
- zca_epsilon: 數(shù)值型,ZCA白化使用的eposilon,默認(rèn)1e-6。
- rotation_range:整型,增廣時(shí)圖片隨機(jī)轉(zhuǎn)動(dòng)的角度,取值為0-180。
- width_shift_range:數(shù)值型,圖片寬度的某個(gè)比例值,增廣時(shí)圖片水平偏移的幅度。
- height_shift_range:數(shù)值型,圖片高度的某個(gè)比例值,增廣時(shí)圖片豎直偏移的幅度。
- shear_range:數(shù)值型,剪切強(qiáng)度(逆時(shí)針方向的剪切變換角度)。
- zoom_range:數(shù)值型或[low, high]的列表,隨機(jī)縮放的幅度,數(shù)值型表示[low, high]=[1-zoom_range, 1+zoom_range]。
- channel_shift_range:數(shù)值型,通道偏移的幅度。
- fill_mode:‘constant’,‘nearest’,'reflect’或’wrap’取值之一,當(dāng)增廣越出邊界按該值指定的方法處理。
- cval:數(shù)值型,當(dāng)fill_mode為’constant’時(shí),越界點(diǎn)的填充值。
- horizontal_flip:布爾型,是否隨機(jī)進(jìn)行水平翻轉(zhuǎn)。
- vertical_flip:布爾型,是否隨機(jī)進(jìn)行豎直翻轉(zhuǎn)。
- preprocessing_function:將被應(yīng)用于每個(gè)輸入的函數(shù)。該函數(shù)將在圖片縮放和數(shù)據(jù)增廣之后運(yùn)行。該函數(shù)接受一個(gè)參數(shù),為一張圖片(ndarray),并且輸出一個(gè)具有相同shape的ndarray。
- data_format:'channel_first’或’channel_last’之一,代表圖像的通道維的位置。numpy類型圖片通道維在最后,如(224,224, 3)。
- flow方法參數(shù)說明
- train_generator = train_gen.flow(X,y, batch_size=1, shuffle=True, seed=None, save_to_dir=None, save_prefix='', save_format='png')
- 說明
- flow方法會(huì)死循環(huán)地返回一批隨機(jī)增廣后數(shù)據(jù)及其標(biāo)簽(在y不為None時(shí))。
- X:樣本數(shù)據(jù),四維數(shù)據(jù)。黑白圖像的channel軸的值為1,彩色圖像為3。
- y:與X第一維數(shù)值相同的標(biāo)簽數(shù)據(jù)。
- batch_size:批尺寸大小,默認(rèn)為32。
- shuffle:是否隨機(jī)打亂數(shù)據(jù),默認(rèn)為True。
- save_to_dir:默認(rèn)為None,字符串類型,圖片存儲(chǔ)目錄,該參數(shù)能讓你將增廣后的圖片保存本地。
- save_prefix:字符串類型,保存增廣后圖片時(shí)使用的前綴(如train), 僅當(dāng)設(shè)置了save_to_dir時(shí)生效。
- save_format:‘png’或’jpeg’之一,指定保存圖片的數(shù)據(jù)格式,默認(rèn)’jpeg’。
- seed:隨機(jī)數(shù)種子,保證復(fù)現(xiàn)。
-
增廣
- 代碼
- train_gen = ImageDataGenerator(featurewise_center=False,samplewise_center=False,featurewise_std_normalization=False,samplewise_std_normalization=False,rescale=1/255.,zca_whitening=False,zca_epsilon=1e-6,rotation_range=15,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,channel_shift_range=0.,fill_mode='nearest',cval=0.,horizontal_flip=True,vertical_flip=True,preprocessing_function=None,data_format=K.image_data_format())train_generator = train_gen.flow(X,y, batch_size=1, shuffle=True, seed=None, save_to_dir='gene', save_prefix='train', save_format='png')index = 0for (batch_x, batch_y) in train_generator:index += 1if index > 50:break
- 結(jié)果
- 可以看到,每一批都有概率進(jìn)行了隨機(jī)增廣。
- 代碼
補(bǔ)充說明
本項(xiàng)目重點(diǎn)是數(shù)據(jù)增廣,數(shù)據(jù)的多種讀入方式?jīng)]有過多提及。具體代碼上傳至我的Github,歡迎Star或者Fork。
總結(jié)
以上是生活随笔為你收集整理的Keras-数据增广的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python高级语法-详解set机制
- 下一篇: Keras-模型