內(nèi)容目錄
什么是數(shù)據(jù)不均衡問題這里簡(jiǎn)單說明一下,重點(diǎn)是操作和應(yīng)用:1、數(shù)據(jù)不均衡問題2、常見的解決方法函數(shù)說明準(zhǔn)備工作功能說明參數(shù)說明參數(shù)完整代碼效果展示總結(jié)
什么是數(shù)據(jù)不均衡問題
詳細(xì)說明,請(qǐng)參考:https://blog.csdn.net/Yaphat/article/details/60348946
這里簡(jiǎn)單說明一下,重點(diǎn)是操作和應(yīng)用:
1、數(shù)據(jù)不均衡問題
在大部分情況下,,我們認(rèn)為不同類別的數(shù)據(jù)是均勻分布的,很多算法也是基于這個(gè)假設(shè),,但是在真實(shí)的情況下,,往往都不是如此的。例如,,機(jī)器發(fā)送故障的情況是我們想要預(yù)測(cè)的,,但實(shí)際上故障的概率是很低的,所以導(dǎo)致故障的樣本量很少,,即使你將所有的預(yù)測(cè)結(jié)果都設(shè)置為正常,,準(zhǔn)確率依然很高,但這個(gè)模型是一個(gè)沒有用的模型,,這種類似的例子是非常常見的,。
2,、常見的解決方法
解決的方案很多,主要從兩個(gè)方面考慮(面試的時(shí)候可能會(huì)問)
1)數(shù)據(jù)層面
2)算法層面
在項(xiàng)目中,,我們可能沒那么多時(shí)間去思考從算法方面去解決,,更多的時(shí)候想的是能用就行,但是網(wǎng)上很多的例子很多是基于內(nèi)置的數(shù)據(jù),,這是非常讓人難受的,,或者是基于一張圖片進(jìn)行數(shù)據(jù)增強(qiáng),,很痛苦,。更一般的情況是,對(duì)訓(xùn)練集下的某一個(gè)文件夾的所有圖片進(jìn)行數(shù)據(jù)增強(qiáng),,這就是我寫這個(gè)的理由,。
這部分的理論,可以參考:https://blog.csdn.net/mieleizhi0522/article/details/82191331
函數(shù)說明
準(zhǔn)備工作
所使用的環(huán)境
Python3.6、tensorflow-gpu 1.5.0,、keras2.2.4
功能說明
1)ImageDataGenerator 圖片生成器
2)flow_from_directory 以文件夾路徑為參數(shù),生成經(jīng)過數(shù)據(jù)提升/歸一化后的數(shù)據(jù),在一個(gè)無限循環(huán)中無限產(chǎn)生batch數(shù)據(jù)
參數(shù)說明
備注:對(duì)于單張圖片的數(shù)據(jù)增強(qiáng),,可以參看ImageDataGenerator和flow的使用說明:https://blog.csdn.net/hnu2012/article/details/54017564
1)ImageDataGenerator 圖片生成器
from keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest',
cval=0,
channel_shift_range=0,
horizontal_flip=False,
vertical_flip=False,
rescale=None)
參數(shù)
rotation_range:整數(shù),,數(shù)據(jù)提升時(shí)圖片隨機(jī)轉(zhuǎn)動(dòng)的角度
width_shift_range:浮點(diǎn)數(shù),,圖片寬度的某個(gè)比例,數(shù)據(jù)提升時(shí)圖片水平偏移的幅度
height_shift_range:浮點(diǎn)數(shù),,圖片高度的某個(gè)比例,,數(shù)據(jù)提升時(shí)圖片豎直偏移的幅度
rescale: 重放縮因子,默認(rèn)為None. 如果為None或0則不進(jìn)行放縮,否則會(huì)將該數(shù)值乘到數(shù)據(jù)上(在應(yīng)用其他變換之前)
shear_range:浮點(diǎn)數(shù),剪切強(qiáng)度(逆時(shí)針方向的剪切變換角度)
zoom_range:浮點(diǎn)數(shù)或形如[lower,upper]的列表,,隨機(jī)縮放的幅度,,若為浮點(diǎn)數(shù),則相當(dāng)于[lower,upper] = [1 - zoom_range, 1+zoom_range]
fill_mode:‘constant’‘nearest’,,‘reflect’或‘wrap’之一,,當(dāng)進(jìn)行變換時(shí)超出邊界的點(diǎn)將根據(jù)本參數(shù)給定的方法進(jìn)行處理
cval:浮點(diǎn)數(shù)或整數(shù),當(dāng)fill_mode=constant時(shí),,指定要向超出邊界的點(diǎn)填充的值
channel_shift_range: Float. Range for random channel shifts.
horizontal_flip:布爾值,,進(jìn)行隨機(jī)水平翻轉(zhuǎn)
vertical_flip:布爾值,進(jìn)行隨機(jī)豎直翻轉(zhuǎn)
rescale: 重放縮因子,默認(rèn)為None. 如果為None或0則不進(jìn)行放縮,否則會(huì)將該數(shù)值乘到數(shù)據(jù)上(在應(yīng)用其他變換之前
2)flow_from_directory
gen = datagen.flow_from_directory(
path,
target_size=(224, 224),
batch_size=15,
save_to_dir=dst_path,#生成后的圖像保存路徑
save_prefix='xx',
save_format='jpg')
for i in range(6):
gen.next()
'''
path:文件讀入的路徑,,必須是子文件夾的上一級(jí)(這里是個(gè)坑,,不過試一哈就懂了)
target_size:圖片resize成的尺寸,不設(shè)置會(huì)默認(rèn)設(shè)置為(256.256)
batch_size:每次輸入的圖片的數(shù)量,,例如batch_size=32,,一次進(jìn)行增強(qiáng)的數(shù)量為32,
個(gè)人經(jīng)驗(yàn):batch_size的大小最好是應(yīng)該和文件的數(shù)量是可以整除的關(guān)系
save_to_dir:增強(qiáng)后圖片的保存位置
save_prefix:文件名加前綴,,方便查看
save_format:保存圖片的數(shù)據(jù)格式
產(chǎn)生的圖片總數(shù):batch_size*6(即range中的數(shù)字)
'''
完整代碼
from keras.preprocessing.image import ImageDataGenerator
path = 'E:/C3D_Data/train' # 類別子文件夾的上一級(jí)
dst_path = 'E:/C3D_Data/train_result'
# 圖片生成器
datagen = ImageDataGenerator(
rotation_range=5,
width_shift_range=0.02,
height_shift_range=0.02,
shear_range=0.02,
horizontal_flip=True,
vertical_flip=True
)
gen = datagen.flow_from_directory(
path,
target_size=(224, 224),
batch_size=15,
save_to_dir=dst_path,#生成后的圖像保存路徑
save_prefix='xx',
save_format='jpg')
for i in range(6):
gen.next()
效果展示
總結(jié)
1,、能基本實(shí)現(xiàn)我們需要的數(shù)據(jù)增強(qiáng)的要求
2,、但是實(shí)際上數(shù)據(jù)增強(qiáng)的手段不止這些(有興趣可以繼續(xù)探索)
這里需要強(qiáng)調(diào)一點(diǎn),ImageDataGenerator里面應(yīng)該是每一張圖片進(jìn)去都會(huì)隨機(jī)有可能受到所有的操作(例如裁剪,,旋轉(zhuǎn)等)的作用
希望每一篇用心寫的推文都能幫助到你,,可能你已經(jīng)是大神了,這些對(duì)你沒啥用,,但是這卻是新手一開始都會(huì)遇到的難題,,不想大家因?yàn)橐稽c(diǎn)小小的挫折就放棄,所以推文一方面是記錄自己真實(shí)遇到的坑,,另一面也希望能夠提升自己的表達(dá)能力,。
代碼已經(jīng)更新到:https://github.com/SCUTPZW/AI_study/tree/master
希望能夠得到你們一顆真心的star(還沒被點(diǎn)過)
END