python數據增強三種方法(常用的數據增強方法)

本文目錄一覽:

數據增強的方法有哪些

1 什麼是數據增強?

數據增強也叫數據擴增,意思是在不實質性的增加數據的情況下,讓有限的數據產生等價於更多數據的價值。

比如上圖,第1列是原圖,後面3列是對第1列作一些隨機的裁剪、旋轉操作得來。

每張圖對於網絡來說都是不同的輸入,加上原圖就將數據擴充到原來的10倍。假如我們輸入網絡的圖片的分辨率大小是256×256,若採用隨機裁剪成224×224的方式,那麼一張圖最多可以產生32×32張不同的圖,數據量擴充將近1000倍。雖然許多的圖相似度太高,實際的效果並不等價,但僅僅是這樣簡單的一個操作,效果已經非凡了。

如果再輔助其他的數據增強方法,將獲得更好的多樣性,這就是數據增強的本質。

數據增強可以分為,有監督的數據增強和無監督的數據增強方法。其中有監督的數據增強又可以分為單樣本數據增強和多樣本數據增強方法,無監督的數據增強分為生成新的數據和學習增強策略兩個方向。

2 有監督的數據增強

有監督數據增強,即採用預設的數據變換規則,在已有數據的基礎上進行數據的擴增,包含單樣本數據增強和多樣本數據增強,其中單樣本又包括幾何操作類,顏色變換類。

2.1. 單樣本數據增強

所謂單樣本數據增強,即增強一個樣本的時候,全部圍繞着該樣本本身進行操作,包括幾何變換類,顏色變換類等。

(1) 幾何變換類

幾何變換類即對圖像進行幾何變換,包括翻轉,旋轉,裁剪,變形,縮放等各類操作,下面展示其中的若干個操作。

水平翻轉和垂直翻轉

隨機旋轉

隨機裁剪

變形縮放

翻轉操作和旋轉操作,對於那些對方向不敏感的任務,比如圖像分類,都是很常見的操作,在caffe等框架中翻轉對應的就是mirror操作。

翻轉和旋轉不改變圖像的大小,而裁剪會改變圖像的大小。通常在訓練的時候會採用隨機裁剪的方法,在測試的時候選擇裁剪中間部分或者不裁剪。值得注意的是,在一些競賽中進行模型測試時,一般都是裁剪輸入的多個版本然後將結果進行融合,對預測的改進效果非常明顯。

以上操作都不會產生失真,而縮放變形則是失真的。

很多的時候,網絡的訓練輸入大小是固定的,但是數據集中的圖像卻大小不一,此時就可以選擇上面的裁剪成固定大小輸入或者縮放到網絡的輸入大小的方案,後者就會產生失真,通常效果比前者差。

(2) 顏色變換類

上面的幾何變換類操作,沒有改變圖像本身的內容,它可能是選擇了圖像的一部分或者對像素進行了重分布。如果要改變圖像本身的內容,就屬於顏色變換類的數據增強了,常見的包括噪聲、模糊、顏色變換、擦除、填充等等。

基於噪聲的數據增強就是在原來的圖片的基礎上,隨機疊加一些噪聲,最常見的做法就是高斯噪聲。更複雜一點的就是在面積大小可選定、位置隨機的矩形區域上丟棄像素產生黑色矩形塊,從而產生一些彩色噪聲,以Coarse Dropout方法為代表,甚至還可以對圖片上隨機選取一塊區域並擦除圖像信息。

添加Coarse Dropout噪聲

顏色變換的另一個重要變換是顏色擾動,就是在某一個顏色空間通過增加或減少某些顏色分量,或者更改顏色通道的順序。

顏色擾動

還有一些顏色變換,本文就不再詳述。

幾何變換類,顏色變換類的數據增強方法細緻數還有非常多,推薦給大家一個git項目:

預覽一下它能完成的數據增強操作吧。

2.2. 多樣本數據增強

不同於單樣本數據增強,多樣本數據增強方法利用多個樣本來產生新的樣本,下面介紹幾種方法。

(1) SMOTE[1]

SMOTE即Synthetic Minority Over-sampling Technique方法,它是通過人工合成新樣本來處理樣本不平衡問題,從而提升分類器性能。

類不平衡現象是很常見的,它指的是數據集中各類別數量不近似相等。如果樣本類別之間相差很大,會影響分類器的分類效果。假設小樣本數據數量極少,如僅佔總體的1%,則即使小樣本被錯誤地全部識別為大樣本,在經驗風險最小化策略下的分類器識別準確率仍能達到99%,但由於沒有學習到小樣本的特徵,實際分類效果就會很差。

SMOTE方法是基於插值的方法,它可以為小樣本類合成新的樣本,主要流程為:

第一步,定義好特徵空間,將每個樣本對應到特徵空間中的某一點,根據樣本不平衡比例確定好一個採樣倍率N;

第二步,對每一個小樣本類樣本(x,y),按歐氏距離找出K個最近鄰樣本,從中隨機選取一個樣本點,假設選擇的近鄰點為(xn,yn)。在特徵空間中樣本點與最近鄰樣本點的連線段上隨機選取一點作為新樣本點,滿足以下公式:

第三步,重複以上的步驟,直到大、小樣本數量平衡。

該方法的示意圖如下。

在python中,SMOTE算法已經封裝到了imbalanced-learn庫中,如下圖為算法實現的數據增強的實例,左圖為原始數據特徵空間圖,右圖為SMOTE算法處理後的特徵空間圖。

(2) SamplePairing[2]

SamplePairing方法的原理非常簡單,從訓練集中隨機抽取兩張圖片分別經過基礎數據增強操作(如隨機翻轉等)處理後經像素以取平均值的形式疊加合成一個新的樣本,標籤為原樣本標籤中的一種。這兩張圖片甚至不限制為同一類別,這種方法對於醫學圖像比較有效。

經SamplePairing處理後可使訓練集的規模從N擴增到N×N。實驗結果表明,因SamplePairing數據增強操作可能引入不同標籤的訓練樣本,導致在各數據集上使用SamplePairing訓練的誤差明顯增加,而在驗證集上誤差則有較大幅度降低。

儘管SamplePairing思路簡單,性能上提升效果可觀,符合奧卡姆剃刀原理,但遺憾的是可解釋性不強。

(3) mixup[3]

mixup是Facebook人工智能研究院和MIT在“Beyond Empirical Risk Minimization”中提出的基於鄰域風險最小化原則的數據增強方法,它使用線性插值得到新樣本數據。

令(xn,yn)是插值生成的新數據,(xi,yi)和(xj,yj)是訓練集隨機選取的兩個數據,則數據生成方式如下

λ的取值範圍介於0到1。提出mixup方法的作者們做了豐富的實驗,實驗結果表明可以改進深度學習模型在ImageNet數據集、CIFAR數據集、語音數據集和表格數據集中的泛化誤差,降低模型對已損壞標籤的記憶,增強模型對對抗樣本的魯棒性和訓練生成對抗網絡的穩定性。

SMOTE,SamplePairing,mixup三者思路上有相同之處,都是試圖將離散樣本點連續化來擬合真實樣本分布,不過所增加的樣本點在特徵空間中仍位於已知小樣本點所圍成的區域內。如果能夠在給定範圍之外適當插值,也許能實現更好的數據增強效果。

3 無監督的數據增強

無監督的數據增強方法包括兩類:

(1) 通過模型學習數據的分布,隨機生成與訓練數據集分布一致的圖片,代表方法GAN[4]。

(2) 通過模型,學習出適合當前任務的數據增強方法,代表方法AutoAugment[5]。

3.1 GAN

關於GAN(generative adversarial networks),我們已經說的太多了。它包含兩個網絡,一個是生成網絡,一個是對抗網絡,基本原理如下:

(1) G是一個生成圖片的網絡,它接收隨機的噪聲z,通過噪聲生成圖片,記做G(z) 。

(2) D是一個判別網絡,判別一張圖片是不是“真實的”,即是真實的圖片,還是由G生成的圖片。

GAN的以假亂真能力就不多說了。

2 Autoaugmentation[5]

AutoAugment是Google提出的自動選擇最優數據增強方案的研究,這是無監督數據增強的重要研究方向。它的基本思路是使用增強學習從數據本身尋找最佳圖像變換策略,對於不同的任務學習不同的增強方法,流程如下:

(1) 準備16個常用的數據增強操作。

(2) 從16個中選擇5個操作,隨機產生使用該操作的概率和相應的幅度,將其稱為一個sub-policy,一共產生5個sub-polices。

(3) 對訓練過程中每一個batch的圖片,隨機採用5個sub-polices操作中的一種。

(4) 通過模型在驗證集上的泛化能力來反饋,使用的優化方法是增強學習方法。

(5) 經過80~100個epoch後網絡開始學習到有效的sub-policies。

(6) 之後串接這5個sub-policies,然後再進行最後的訓練。

總的來說,就是學習已有數據增強的組合策略,對於門牌數字識別等任務,研究表明剪切和平移等幾何變換能夠獲得最佳效果。

北大青鳥設計培訓:怎樣才能提高Python運行效率?

python逐漸走入人們的視線,成為熱門編程語言,隨之而來,加入python培訓的准程序員大軍也成為社會熱點。

Python具有許多其他編程語言不具備的優勢,譬如能通過極少量代碼完成許多操作,以及多進程,能夠輕鬆支持多任務處理。

除了多種優勢外,python也有不好的地方,運行較慢,下面電腦培訓為大家介紹6個竅門,可以幫你提高python的運行效率。

1.在排序時使用鍵Python含有許多古老的排序規則,這些規則在你創建定製的排序方法時會佔用很多時間,而這些排序方法運行時也會拖延程序實際的運行速度。

最佳的排序方法其實是儘可能多地使用鍵和內置的sort()方法。

2.交叉編譯你的應用開發者有時會忘記計算機其實並不理解用來創建現代應用程序的編程語言。

計算機理解的是機器語言。

為了運行你的應用,你藉助一個應用將你所編的人類可讀的代碼轉換成機器可讀的代碼。

有時,你用一種諸如Python這樣的語言編寫應用,再以C++這樣的語言運行你的應用,這在運行的角度來說,是可行的。

關鍵在於,你想你的應用完成什麼事情,而你的主機系統能提供什麼樣的資源。

3.關鍵代碼使用外部功能包Python簡化了許多編程任務,但是對於一些時間敏感的任務,它的表現經常不盡人意。

使用C/C++或機器語言的外部功能包處理時間敏感任務,可以有效提高應用的運行效率。

這些功能包往往依附於特定的平台,因此你要根據自己所用的平台選擇合適的功能包。

簡而言之,這個竅門要你犧牲應用的可移植性以換取只有通過對底層主機的直接編程才能獲得的運行效率。

4.針對循環的優化每一種編程語言都強調最優化的循環方案。

當使用Python時,你可以藉助豐富的技巧讓循環程序跑得更快。

然而,開發者們經常遺忘的一個技巧是:盡量避免在循環中訪問變量的屬性。

5.嘗試多種編碼方法每次創建應用時都使用同一種編碼方法幾乎無一例外會導致應用的運行效率不盡人意。

可以在程序分析時嘗試一些試驗性的辦法。

譬如說,在處理字典中的數據項時,你既可以使用安全的方法,先確保數據項已經存在再進行更新,也可以直接對數據項進行更新,把不存在的數據項作為特例分開處理。

6.使用較新的Python版本你要保證自己的代碼在新版本里還能運行。

你需要使用新的函數庫才能體驗新的Python版本,然後你需要在做出關鍵性的改動時檢查自己的應用。

只有當你完成必要的修正之後,你才能體會新版本的不同。

圖像處理和數據增強

前言:用CNN進行訓練模型的時候,通常需要對圖像進行處理,有時候也叫做數據增強,常見的圖像處理的Python庫:OpenCV、PIL、matplotlib、tensorflow等,這裡用TensorFlow介紹圖像處理的過程

進行圖像的讀取和解碼,然後調用函數進行展示

結果如下:

圖片的大小為:(512, 512, 3)

結果:

圖片的大小為:(20, 20, 3)

注意:當放大時候,幾乎圖像不失真

上述為中間位置剪切或者填充,下面介紹任意位置剪切或者填充

這樣就可以截取任意圖像裡面的內容了

下面的圖像處理歸結到數據增強裡面了

當訓練數據有限的時候,可以通過一些變換來從已有的訓 練數據集中生成一些新的數據,來擴大訓練數據。數據增強的方法有:

以水平面為對稱軸如下:

轉置,相當於矩陣的轉置,90度轉換

注意:顏色空間的轉換必須講image的值轉換為float32類型,不能使用unit8類型

圖像基本格式:

rgb(顏色)0-255,三個255為白色,轉化為float32就是把區間變為0-1

hsv(h: 圖像的色彩/色度,s:圖像的飽和度,v:圖像的亮度)

grab(灰度)

這樣的方法,可以運用到車牌設別的過程中,對車牌自動進行截取。

高斯噪聲、模糊處理

樣本不均衡即有些類別圖像特別多,有些特別少。類別不平衡數據的處理:Label shuffle

具體步驟如下圖所示:

先按最多的類別進行隨機抽取序號,組數為label的數目,然後對每個label中的樣本書取模,然後分別對應自己序號的圖像,最後得到的樣本所有類別都一樣多。

python可以做數據分析,好處是什麼呢?怎麼學習?

鏈接:

提取碼:7234

煉數成金:Python數據分析。Python是一種面向對象、直譯式計算機程序設計語言。也是一種功能強大而完善的通用型語言,已經具有十多年的發展歷史,成熟且穩定。Python 具有腳本語言中最豐富和強大的類庫,足以支持絕大多數日常應用。 Python語法簡捷而清晰,具有豐富和強大的類庫。它常被昵稱為膠水語言,它能夠很輕鬆的把用其他語言製作的各種模塊(尤其是C/C++)輕鬆地聯結在一起。

課程將從Python的基本使用方法開始,一步步講解,從ETL到各種數據分析方法的使用,並結合實例,讓學員能從中借鑒學習。

課程目錄:

Python基礎

Python的概覽——Python的基本介紹、安裝與基本語法、變量類型與運算符

了解Python流程控制——條件、循環語句與其他語句

常用函數——函數的定義與使用方法、主要內置函數的介紹

…..

優化Python編程的4個妙招

1. Pandas.apply() – 特徵工程瑰寶

Pandas 庫已經非常優化了,但是大部分人都沒有發揮它的最大作用。想想它一般會用於數據科學項目中的哪些地方。一般首先能想到的就是特徵工程,即用已有特徵創造新特徵。其中最高效的方法之一就是Pandas.apply(),即Pandas中的apply函數。

在Pandas.apply()中,可以傳遞用戶定義功能並將其應用到Pandas Series的所有數據點中。這個函數是Pandas庫最好的擴展功能之一,它能根據所需條件分隔數據。之後便能將其有效應用到數據處理任務中。

2. Pandas.DataFrame.loc – Python數據操作絕妙技巧

所有和數據處理打交道的數據科學家(差不多所有人了!)都應該學會這個方法。

很多時候,數據科學家需要根據一些條件更新數據集中某列的某些值。Pandas.DataFrame.loc就是此類問題最優的解決方法。

3. Python函數向量化

另一種解決緩慢循環的方法就是將函數向量化。這意味着新建函數會應用於輸入列表,並返回結果數組。在Python中使用向量化能至少迭代兩次,從而加速計算。

事實上,這樣不僅能加速代碼運算,還能讓代碼更加簡潔清晰。

4. Python多重處理

多重處理能使系統同時支持一個以上的處理器。

此處將數據處理分成多個任務,讓它們各自獨立運行。處理龐大的數據集時,即使是apply函數也顯得有些遲緩。

關於優化Python編程的4個妙招,青藤小編就和您分享到這裡了。如果您對python編程有濃厚的興趣,希望這篇文章可以為您提供幫助。如果您還想了解更多關於python編程的技巧及素材等內容,可以點擊本站的其他文章進行學習。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/288746.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-24 03:00
下一篇 2024-12-24 03:00

相關推薦

  • Python讀取CSV數據畫散點圖

    本文將從以下方面詳細闡述Python讀取CSV文件並畫出散點圖的方法: 一、CSV文件介紹 CSV(Comma-Separated Values)即逗號分隔值,是一種存儲表格數據的…

    編程 2025-04-29
  • ArcGIS更改標註位置為中心的方法

    本篇文章將從多個方面詳細闡述如何在ArcGIS中更改標註位置為中心。讓我們一步步來看。 一、禁止標註智能調整 在ArcMap中設置標註智能調整可以自動將標註位置調整到最佳顯示位置。…

    編程 2025-04-29
  • 解決.net 6.0運行閃退的方法

    如果你正在使用.net 6.0開發應用程序,可能會遇到程序閃退的情況。這篇文章將從多個方面為你解決這個問題。 一、代碼問題 代碼問題是導致.net 6.0程序閃退的主要原因之一。首…

    編程 2025-04-29
  • Python創建分配內存的方法

    在python中,我們常常需要創建並分配內存來存儲數據。不同的類型和數據結構可能需要不同的方法來分配內存。本文將從多個方面介紹Python創建分配內存的方法,包括列表、元組、字典、…

    編程 2025-04-29
  • Python中init方法的作用及使用方法

    Python中的init方法是一個類的構造函數,在創建對象時被調用。在本篇文章中,我們將從多個方面詳細討論init方法的作用,使用方法以及注意點。 一、定義init方法 在Pyth…

    編程 2025-04-29
  • 使用Vue實現前端AES加密並輸出為十六進制的方法

    在前端開發中,數據傳輸的安全性問題十分重要,其中一種保護數據安全的方式是加密。本文將會介紹如何使用Vue框架實現前端AES加密並將加密結果輸出為十六進制。 一、AES加密介紹 AE…

    編程 2025-04-29
  • 用不同的方法求素數

    素數是指只能被1和自身整除的正整數,如2、3、5、7、11、13等。素數在密碼學、計算機科學、數學、物理等領域都有着廣泛的應用。本文將介紹幾種常見的求素數的方法,包括暴力枚舉法、埃…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • Python 常用數據庫有哪些?

    在Python編程中,數據庫是不可或缺的一部分。隨着互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的數據庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • 如何用Python統計列表中各數據的方差和標準差

    本文將從多個方面闡述如何使用Python統計列表中各數據的方差和標準差, 並給出詳細的代碼示例。 一、什麼是方差和標準差 方差是衡量數據變異程度的統計指標,它是每個數據值和該數據值…

    編程 2025-04-29

發表回復

登錄後才能評論