本文目錄一覽:
數據增強的方法有哪些
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 有哪些好的 Web 框架
常見的5種Web框架:
第一個:Django
Django是一個開源的Web應用框架,由Python寫成,支持許多數據庫引擎,可以讓Web開發變得迅速和可擴展,並會不斷的版本更新以匹配Python最新版本,如果是新手程序員,可以從這個框架入手。
第二個:Flask
Flask是一個輕量級的Web應用框架,使用Python編寫。基於WerkzeugWSGI工具箱和JinJa2模板引擎,使用BSD授權。
Flask也被稱為microframework,因為它使用簡單的核心,用extension增加其他功能。Flask沒有默認使用的數據庫、窗體驗證工具。然而Flask保留了擴增的彈性,可以用Flask-extension加入這些功能:ORM、窗體驗證工具、文件上傳、各種開放式身份驗證技術。
第三個:Web2py
Web2py是一個用Python語言編寫的免費的開源Web框架,旨在敏捷快速的開發Web應用,具有快速、可擴展、安全以及可移植的數據庫驅動的應用,遵循LGPLv3開源協議。
Web2py提供一站式的解決方案,整個開發過程都可以在瀏覽器上進行,提供了Web版的在線開發,HTML模板編寫,靜態文件的上傳,數據庫的編寫的功能。其他的還有日誌功能,以及一個自動化的admin接口。
第四個:Tornado
Tornado即是一個Webserver,同時又是一個類web.py的micro-framework,作為框架的Tornado的思想主要來源於web.PY,大家在web.PY的網站首頁也可以看到Tornado的大佬Bret
Taylor的這麼一段話:“[web.py inspired the] Web framework we use at FriendFeed [and] thewebapp framework that ships with App Engine…”,因為這層關係,後面不再單獨討論Tornado。
第五個:CherryPy
CherryPy是一個用於Python的、簡單而非常有用的Web框架,其主要作用是以儘可能少的操作將Web服務器與Python代碼連接,其功能包括內置的分析功能、靈活的插件系統以及一次運行多個HTTP服務器的功能,可運行在最新版本的Python、Jython、android上。
請教關於MLST數據庫的使用
MLST數據庫中,每種細菌一般是進行7個基因片段的測序,在網站上都有引物序列。
1. 按序列合成引物後,PCR擴增(兩次獨立擴增),雙向測序(上下游引物分別使用一個PCR產物,避免擴增過程中引入突變);
2. 每株菌的每個基因片段進行拼接,如果有質量不好的位點需要進行重新擴增測序;
3. 將拼接後的序列遞交到數據庫,數據庫會返回一個Alle number,如果匹配不上,恭喜你,發現一個新的Alle,將原始峰圖文件遞交給網站管理者,審核合格後,會給你的序列分配一個新的Alle number。
4. 一株菌會有7個Alle number,將這7個數字輸入數據庫,會返回一個ST number,就是序列型,如果匹配不上,恭喜你,發現一個新的ST型。
5. 獲得ST型後,可利用eBurst等軟件進行簡單分析;如果需用進行系統發育分析,需要將7個序列拼接起來,利用MEGA,ClonalFrame,Structure等軟件進行。
Pandas 入門
pd.Series 主要設置兩個參數,data 和 index,如果不設置 index,則 index 從 0 開始遞增。除此之外,還可以設置 dtype。
除了直接設置各個字段,還可以將字典作為參數傳入,series 會自動將 key 作為 index,將 value 作為 data。
為了保證數據存取的效率,series 的 index 必須是可哈希的。
series 和字典一樣,索引和修改的時間複雜度為 。它有兩種索引方式,第一種索引方式與字典相同,但強烈不推薦,會導致各種副作用:
在某些情況下,它會產生歧義:
第二種索引方式是採用 .loc 方法,這種寫法是推薦的:
注意一個細節:利用 index 做切片時,和 list 或者 array 利用下標切片,不包括末尾元素不同,index 切片是包括 end 元素的。
除了利用 index 切片,Series 也可以用下標切片,此時不包括終點下標對應的元素,表現和 python 慣例一致:
不像字典的 key 是唯一的,Series 支持 index 包含重複元素。但對 Series 做切片時,如果重複的 index 不是相鄰的,則會報錯:”Cannot get left\right slice bound for non-unique label: ‘xxx’ “。
因此強烈建議先對 index 排序,這樣可以保證切片能夠一直能正確運行,並且還能提高索引的效率。
和 numpy 一樣,Series 也支持高級索引:
兩個 Series 可以相加,只有相同 label 的數據會相加,只存在於其中一個 Series 的數據相加後為 NaN,但也可以指定一方缺失的 label 對應的默認值:
需要注意的是,在操作過程中, series value 的數據類型可能會隱式地被改變,如果不注意,很有可能影響增刪的效率,甚至產生錯誤的結果。
影響效率的例子:
產生錯誤結果的例子:
DataFrame 還支持廣播功能:
可以將 DataFrame 保存為 csv 文件或 json 文件
包括一系列函數:
p.describe() 默認只顯示數字列,但也可以設置參數 include=’all’ 現實所有列。
p.loc[‘sonia’] 展示 sonia 行
p.loc[‘sonia’, ‘age’] 只顯示 sonia 的年齡
篩選出女性條目:
增加年齡篩選條件:
DataFrame.mean() 可以按列計算平均值
幾種不建議的寫法:
p.drop(columns=[‘mean’, ], inplace=True) 用於刪除一列或多列, inplace 作用是,設置是否修改原來的 p,如果True,返回 None,原 p 被修改,如果 False,返回被修改後的 DataFrame,同時原 p 保留。
DataFrame 支持所有 numpy 的函數,numpy 函數可以直接施加在 DataFrame 上,例如:
但是,如果需要用到 DataFrame 的 label 對齊特性,例如兩個 index 順序並不相同的 DataFrame 相加,那麼 numpy 的函數將直接計算中間的 values,而不會考慮它們 label 對齊的問題。(該問題已經在 pandas 0.2.5 中被修正)
運算中設置 fill_value 可以讓表中缺失的數據被 fill_value 代替。
當一個 Series 和一個 DataFrame 相加時,pandas 會默認 Series 是一行,並把它廣播到其它行。Series 的 index 會被對應到 DataFrame 的列上,並對齊。如果 Series 的 index 與 DataFrame 的列沒關係,那麼會擴增 DataFrame,擴增區域對應的數據為 NaN。如果想讓 Series 的 index 和 DataFrame 的index 對應,則需要指定 axis=0:
在構建 pandas Series 或者 DataFrame 時,有兩種方式可以表示 NaN,一種是 np.NaN ,另一種是python 的 None 對象。 np.NaN 的數據類型是 float ,因此,在 pandas 中,存在 NaN 的對象要麼是 float64 的,要麼是 object 類型。
pandas 利用如下方法處理缺失數據:
MultiIndex 適用於數組大於二維的情況。所有可以用 Index 的地方,都可以用 MultiIndex 。
MultiIndex Series
MultiIndex DataFrame 利用 from_product 可以方便地創建 MultiIndex。
MultiIndex DataFrame 的索引十分方便
元組配合 slice ,為 MultiIndex DataFrame 做切片:
concat 用於將兩個表拼接起來,它適用於兩個表有相同的 index 或者有相同的 columns。
concat 也適用於拼接 Series,但是不論是 DataFrame 還是 Series,它不會檢查各行的 index 是否重複。
一個解決方案是設置 verify_integrity 參數,它會在遇到兩個相同 index 的時候報錯。但是這無疑會導致額外的計算,因此除非確實必要,一般不設置它。
設置拼接參數
merge 適用於兩個表某 列 相同,然後所有的融合都基於該列:
merge 默認採取 inner join 的策略,如果以某列為基準,那麼最終結果中,只有同時出現在這兩列中的數據被保留。
總共有三種merge 的方式:
merge 可以設置 on= 或者 left_on= 、 right_on= 顯式指定基準列
當兩表中的基準列元素不完全一致時,通過設置 how 有四種 merge 策略:
groupby 按照某個指標聚類,分別計算各類數據
groupby 返回值的屬性:
groupby 方法分發。 groupby 返回的對象如果沒有實現某個 DataFrame的方法,該對象仍然可以調用,只不過是遍歷每個類別,分別調用。
groupby().agg 方法:agg 中以 list/dict 形式傳入函數名(或名字的字符串),計算每個組的統計量。
groupby().filter() filter 內傳入篩選條件,可以是 lambda 表達式
groupby().transform() transform 內傳入變換函數,如 lambda 表達式,變換函數將施加在每個子 group 上,一個經典用例是用它來對每個 group 內部中心化,或者用group 均值代替其中的 NaN。
以 titanic 的例子,我們希望得到這樣的表格:有三行,每行代表一個艙位級別;有兩列,每列代表一個性別。此時需要用到 pivot_table 。 pivot_table 相當於把 groupby 的結果表示為二維表格。
numpy 和 pandas 可以很好地處理各種格式的時間字符串,將其轉化為標準格式。同時提供了一系列方法,對時間序列求區間、採樣等等。
python 怎麼向ndarray添加元素
python中的list叫做列表,可以通過append方法在列表的末尾添加單個元素
x = [1,2,3]
x.append(4)
或者使用extend方法在列表末位添加多個元素,參數就變成了列表
x.append([4,5,6])
或者使用insert方法在任意位置添加元素,第一個參數是插入元素的位置,第二個參數是插入元素的值
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/285958.html