使用數據增強技術提升模型泛化能力

在《提高模型性能,你可以嘗試這幾招...》一文中,我們給出了幾種提高模型性能的方法,但這篇文章是在訓練數據集不變的前提下提出的優化方案。其實對于深度學習而言,數據量的多寡通常對模型性能的影響更大,所以擴充數據規模一般情況是一個非常有效的方法。

對于Google、Facebook來說,收集幾百萬張圖片,訓練超大規模的深度學習模型,自然不在話下。但是對于個人或者小型企業而言,收集現實世界的數據,特別是帶標簽的數據,將是一件非常費時費力的事。本文探討一種技術,在現有數據集的基礎上,進行數據增強(data augmentation),增加參與模型訓練的數據量,從而提升模型的性能。

什么是數據增強

所謂數據增強,就是采用在原有數據上隨機增加抖動和擾動,從而生成新的訓練樣本,新樣本的標簽和原始數據相同。這個也很好理解,對于一張標簽為“狗”的圖片,做一定的模糊、裁剪、變形等處理,并不會改變這張圖片的類別。數據增強也不僅局限于圖片分類應用,比如有如下圖所示的數據,數據滿足正態分布:

我們在數據集的基礎上,增加一些擾動處理,數據分布如下:

數據就在原來的基礎上增加了幾倍,但整體上仍然滿足正態分布。有人可能會說,這樣的出來的模型不是沒有原來精確了嗎?考慮到現實世界的復雜性,我們采集到的數據很難完全滿足正態分布,所以這樣增加數據擾動,不僅不會降低模型的精確度,然而增強了泛化能力。

對于圖片數據而言,能夠做的數據增強的方法有很多,通常的方法是:

  • 平移
  • 旋轉
  • 縮放
  • 裁剪
  • 切變(shearing)
  • 水平/垂直翻轉
  • ...

上面幾種方法,可能切變(shearing)比較難以理解,看一張圖就明白了:

我們要親自編寫這些數據增強算法嗎?通常不需要,比如keras就提供了批量處理圖片變形的方法。

keras中的數據增強方法

keras中提供了ImageDataGenerator類,其構造方法如下:

ImageDataGenerator(featurewise_center=False,samplewise_center=False,featurewise_std_normalization = False,samplewise_std_normalization = False,zca_whitening = False,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.0,horizontal_flip = False,vertical_flip = False,rescale = None,preprocessing_function = None,data_format = K.image_data_format(),
)
復制代碼

參數很多,常用的參數有:

  • rotation_range: 控制隨機的度數范圍旋轉。
  • width_shift_range和height_shift_range: 分別用于水平和垂直移位。
  • zoom_range: 根據[1 - zoom_range,1 + zoom_range]范圍均勻將圖像“放大”或“縮小”。
  • horizontal_flip:控制是否水平翻轉。

完整的參數說明請參考keras文檔。

下面一段代碼將1張給定的圖片擴充為10張,當然你還可以擴充更多:

image = load_img(args["image"])
image = img_to_array(image)
image = np.expand_dims(image, axis=0)aug = ImageDataGenerator(rotation_range=30, width_shift_range=0.1, height_shift_range=0.1,shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode="nearest")aug.fit(image)imageGen = aug.flow(image, batch_size=1, save_to_dir=args["output"], save_prefix=args["prefix"],save_format="jpeg")total = 0
for image in imageGen:# increment out countertotal += 1if total == 10:break
復制代碼

需要指出的是,上述代碼的最后一個迭代是必須的,否在不會在output目錄下生成圖片,另外output目錄必須存在,否則會出現一下錯誤:

Traceback (most recent call last):File "augmentation_demo.py", line 35, in <module>for image in imageGen:File "/data/ai/anaconda3/envs/keras/lib/python3.6/site-packages/keras_preprocessing/image.py", line 1526, in __next__return self.next(*args, **kwargs)File "/data/ai/anaconda3/envs/keras/lib/python3.6/site-packages/keras_preprocessing/image.py", line 1704, in nextreturn self._get_batches_of_transformed_samples(index_array)File "/data/ai/anaconda3/envs/keras/lib/python3.6/site-packages/keras_preprocessing/image.py", line 1681, in _get_batches_of_transformed_samplesimg.save(os.path.join(self.save_to_dir, fname))File "/data/ai/anaconda3/envs/keras/lib/python3.6/site-packages/PIL/Image.py", line 1947, in savefp = builtins.open(filename, "w+b")
FileNotFoundError: [Errno 2] No such file or directory: 'output/image_0_1091.jpeg'
復制代碼

如下一張狗狗的圖片:

經過數據增強技術處理之后,可以得到如下10張形態稍微不同的狗狗的圖片,這相當于在原有數據集上增加了10倍的數據,其實我們還可以擴充得最多:

數據增強之后的比較

我們以MiniVGGNet模型為例,說明在其在17flowers數據集上進行訓練的效果。17flowers是一個非常小的數據集,包含17中品類的花卉圖案,每個品類包含80張圖片,這對于深度學習而言,數據量實在是太小了。一般而言,要讓深度學習模型有一定的精確度,每個類別的圖片至少需要1000~5000張。這樣的數據集可以很好的說明數據增強技術的必要性。

從網站上下載的17flowers數據,所有的圖片都放在一個目錄下,而我們通常訓練時的目錄結構為:

{類別名}/{圖片文件}
復制代碼

為此我寫了一個organize_flowers17.py腳本。

在沒有使用數據增強的情況下,在訓練數據集和驗證數據集上精度、損失隨著訓練輪次的變化曲線圖:

可以看到,大約經過十幾輪的訓練,在訓練數據集上的準確率很快就達到了接近100%,然而在驗證數據集上的準確率卻無法再上升,只能達到60%左右。這個圖可以明顯的看出模型出現了非常嚴重的過擬合。

如果采用數據增強技術呢?曲線圖如下:

從圖中可以看到,雖然在訓練數據集上的準確率有所下降,但在驗證數據集上的準確率有比較明顯的提升,說明模型的泛化能力有所增強。

也許在我們看來,準確率從60%多增加到70%,只有10%的提升,并不是什么了不得的成績。但要考慮到我們采用的數據集樣本數量實在是太少,能夠達到這樣的提升已經是非常難得,在實際項目中,有時為了提升1%的準確率,都會花費不少的功夫。

總結

數據增強技術在一定程度上能夠提高模型的泛化能力,減少過擬合,但在實際中,我們如果能夠收集到更多真實的數據,還是要盡量使用真實數據。另外,數據增強只需應用于訓練數據集,驗證集上則不需要,畢竟我們希望在驗證集上測試真實數據的準確。

以上實例均有完整的代碼,點擊閱讀原文,跳轉到我在github上建的示例代碼。

另外,我在閱讀《Deep Learning for Computer Vision with Python》這本書,在微信公眾號后臺回復“計算機視覺”關鍵字,可以免費下載這本書的電子版。

參考閱讀

提高模型性能,你可以嘗試這幾招...

計算機視覺與深度學習,看這本書就夠了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276122.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276122.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276122.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于不同用戶進入系統報錯的請求

我自己搞了個系統,用超級用戶進入系統正常,用普通用戶進入系統就報錯,Microsoft JET Database Engine (0x80040E07) 標準表達式中數據類型不匹配。 /xs/huiyuan/huiyuan_bf.asp, 第 203 行 代碼如下請各位高手幫忙 <% if request.Cookies("shiwei_username")"…

React 與 Vue 框架的設計思路大 PK

大家好&#xff0c;我是若川。今天分享一篇框架設計思路的好文。關于我 大家好我是花果山的大圣&#xff0c;今天很榮幸&#xff0c;有機會跟大家分享一下很多年輕人感興趣的話題《 Vue 和 React 設計思想 PK》,個人水平有限&#xff0c;如果有理解不到位的請傾盆&#xff0c;大…

php foreach id是否存在數組_請糾正這 5 個 PHP 編碼小陋習

在做過大量的代碼審查后&#xff0c;我經常看到一些重復的錯誤&#xff0c;以下是糾正這些錯誤的方法。在循環之前測試數組是否為空$items [];// ...if (count($items) > 0) {foreach ($items as $item) {// process on $item ...}}foreach以及數組函數 (array_*) 可以處理…

1161轉進制(C語言)

一&#xff1a;題目 二&#xff1a;思路分析 1.首先該題目讓我們使用遞歸求十進制轉其他進制 2.其次&#xff0c;我們要知道十進制轉換為其他進制怎么轉換&#xff0c;以例題所給的數據為例 由此圖可以看出&#xff0c;十進制轉換為其他進制&#xff0c;是輾轉相除法&#xf…

PHP異常處理

轉載鏈接&#xff1a;http://www.blogdaren.com/post-2030.html 版權聲明&#xff1a;除非注明&#xff0c;本文由( manon )原創&#xff0c;轉載請保留文章出處 本文鏈接&#xff1a;PHP register_shutdown_function函數詳解 腳本時常死掉,而且并不總是那么好看. 我們可不想…

應對無協議脫歐 葡萄牙機場將為英籍旅客設快速通道

中新網1月18日電 據臺灣《聯合報》援引英媒報道&#xff0c;英國首相特蕾莎?梅的脫歐協議遭下院否決后&#xff0c;英國無協議脫歐的可能性變大。葡萄牙總理科斯塔17日表示&#xff0c;里斯本當局正對機場開設特殊通道進行規劃&#xff0c;使英國旅客無論英國最后如何脫歐&…

javascript 日期控件

http://www.my97.net/dp/index.asp轉載于:https://www.cnblogs.com/Ken-Cai/archive/2010/04/08/1707080.html

6輪字節前端校招面試經驗分享

大家好&#xff0c;我是若川。最近金三銀四&#xff0c;今天分享一篇字節前端校招面試經驗的輕松好文&#xff0c;相信看完會有所收獲。也歡迎點擊下方卡片關注或者星標我的公眾號若川視野因為我錯過了2020年的秋招&#xff08;ps: 那時候連數據結構與算法都還沒學完&#xff0…

redis存opc_Redis集群的三種模式

一、主從模式通過持久化功能&#xff0c;Redis保證了即使在服務器重啟的情況下也不會損失(或少量損失)數據&#xff0c;因為持久化會把內存中數據保存到硬盤上&#xff0c;重啟會從硬盤上加載數據。但是由于數據是存儲在一臺服務器上的&#xff0c;如果這臺服務器出現硬盤故障等…

斥資近1億港元,小米二次回購

1月21日消息&#xff0c;小米集團發布公告稱&#xff0c;公司于1月18日回購了984.96萬股B類普通股股票&#xff0c;占已發行股份0.041%&#xff0c;平均價為每股B類股10.1527港元&#xff0c;總計斥資近1億港元。 這也是繼1月17日首次回購后&#xff0c;小米集團連續兩日出手進…

MySQL日期數據類型、時間類型使用總結

轉載鏈接&#xff1a;http://www.jb51.net/article/23966.htm MySQL 日期類型&#xff1a;日期格式、所占存儲空間、日期范圍 比較。 日期類型 存儲空間 日期格式 日期范圍 ------------ --------- --------------------- -------------------------------…

ios macos_設計師可以從iOS 14和macOS Big Sur中學到什么?

ios macos重點 (Top highlight)With the introduction of iOS 14 and macOS Big Sur, we are the witness of the next big thing in UI Design. Changes are not so revolutionary like in iOS 7 years before, but they undoubtedly present the trend UI Designers will fol…

Web開發性能優化總結 轉載

1. 使用存儲過程&#xff0c; &#xff08;如果在程序里用exec 存儲過程 參數&#xff0c;這樣執行似乎并沒有快多少&#xff09; 在數據庫里是預編譯的&#xff0c;也不需要在字符串傳輸上花費大量時間。 防sql注入攻擊。 2. 盡量優化數據庫語句&#xff0c;使邏輯盡量…

金三銀四的騰訊、阿里、?字節等大廠前端社招面經

大家好&#xff0c;我是若川。最近金三銀四&#xff0c;今天分享一篇騰訊、阿里、字節等大廠的前端社招面試經驗的好文&#xff0c;相信看完會有所收獲。也歡迎點擊下方卡片關注或者星標我的公眾號若川視野作者面了將近一個月&#xff0c;目前還沒掛過&#xff0c;但由于各種因…

JS中創建函數的幾種方式

使用 "函數聲明" 創建函數 語法&#xff1a;* function 函數名([形參1,形參2...形參N]){* 語句...* } */function fun2(){console.log("這是我的第二個函數~~~");alert("哈哈哈哈哈");document.write("~~~~…

ssm提交post_我用spring mvc做,用post方式提交,后臺獲取不到參數值,用get方式就可以,什么問題...

展開全部因為form表單e68a843231313335323631343130323136353331333365646330的enctype編碼方式不同導致的&#xff1b;enctype 屬性規定在發送到服務器之前應該如何對表單數據進行編碼。默認地&#xff0c;表單數據會編碼為 "application/x-www-form-urlencoded"。就…

網頁設計簡約_簡約網頁設計的主要功能

網頁設計簡約重點 (Top highlight)Minimalism is synonymous with simplicity. Not quite. As the name suggests, minimalism is definitely not about opulent design. But the assumption that minimalism is design-less and plain is also wrong. Minimalism is simple ye…

MySQL_數據庫數據類型(data type)介紹

轉載鏈接&#xff1a;http://www.360sdn.com/mysql/2013/0511/78.html MySQL_數據庫數據類型(data type)介紹 mysql數據庫的數據類型(data type)分以下幾種:數值類型,字符串類型 一、數值類型 MySQL 的數值類型可以大致劃分為兩個類別&#xff0c;一個是整數&#xff0c;另一…

Expo 2010 Japan Pavilion

^_^轉載于:https://www.cnblogs.com/mmmhhhlll/archive/2010/04/16/1713680.html

深度對比學習Vue和React兩大框架

作為國內應用最廣的兩個框架&#xff0c;Vue 和 React 是前端必須掌握的內容&#xff0c;也是面試的重點。但大多數讀者都只擅長其中一個框架&#xff0c;當面試涉及到另一個框架的內容時&#xff0c;就答不好了。比如虛擬dom&#xff0c;兩個框架中都有應用&#xff0c;面試官…