2017-01-23 137 views
5

我想用Keras做一個二進制分類問題,使用ImageDataGenerator.flow_from_directory方法來生成批次。然而,我的類非常不平衡,就像一個類比另一個類大約多8倍或9倍,導致模型卡住,預測每個示例的相同輸出類。有沒有辦法將flow_from_directory設置爲從我的小班過度抽樣或在每個時間段從我的大班中抽樣?現在,我剛剛在我的小班裏爲每張圖片創建了多個副本,但我希望有更多的靈活性。keras flow_from_directory過度或不足樣本

回答

6

使用當前版本的Keras - 僅使用Keras內置方法無法平衡數據集。 flow_from_directory只是建立一個所有文件及其類的列表,對其進行混洗(如果需要),然後對其進行迭代。

但是你可以做不同的技巧 - 通過書面方式自己發生器,它將使python內的平衡:

def balanced_flow_from_directory(flow_from_directory, options): 
    for x, y in flow_from_directory: 
     yield custom_balance(x, y, options) 

這裏custom_balance應該是給定的一批(x, y)的功能是平衡它,並返回平衡批次(x', y')。對於大多數應用程序,批次大小不必相同 - 但有一些奇怪的用例(例如stateful RNN) - 批量大小應該具有固定大小)。

+0

感謝這似乎是約我需要什麼 – George

+1

有人可以創建基於此完全工作腳本,來闡述?我需要一個更具體的例子custom_balance等。 – mikal94305

0

您也可以計算每個類文件的數量和規範class_weights

files_per_class = [] 
for folder in os.listdir(input_foldr): 
    if not os.path.isfile(folder): 
      files_per_class.append(len(os.listdir(input_foldr + '/' + folder))) 
total_files = sum(files_per_class) 
class_weights = {} 
for i in xrange(len(files_per_class)): 
    class_weights[i] = 1 - (float(files_per_class[i])/total_files) 
print (class_weights) 
... 
... 
... 
model.fit_generator(... ,class_weight=class_weights) 
+0

請添加示例代碼和更多解釋 –

+0

請編輯您的答案並添加此代碼 –

相關問題