對抗損失函數python的簡單介紹

用對抗的方法生成Hard Triplets

論文:An Adversarial Approach to Hard Triplet Generation

石屏ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為創新互聯公司的ssl證書銷售渠道,可以享受市場價格4-6折優惠!如果有意向歡迎電話聯系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

ReID問題中都是根據圖像embedding之間的特征距離來判斷相似度,但是平常訓練都是根據訓練集的ID做監督,用softmax進行分類。而Triplet loss能夠直接對圖像的特征進行監督,更有利于學到好的embedding。

損失函數:

hard triplets指的是找到minibatch中 最大的一對三元組,即找到 最大的和 最小的。

但是這樣直接的方式不一定能找出具有代表性的三元組,會對網絡的收斂(convergence)造成問題。

三元組損失函數對于三元組的選擇非常敏感,經常會有難以收斂和局部最優的問題,為此 [1] 提出了 Coupled Cluster Loss ,使得訓練階段更加穩定,網絡收斂的更加快。

特征提取網絡 的輸出 ,對于三元組 ,傳統方法的損失函數是: ,其中 是 距離。

給出一個生成器 ,通過這個生成器生成一個新的sample , 的目的是使得正樣本之間距離增大,負樣本之間距離減小,目的是為了生成更harder的sample.

通過降低以下loss來訓練 :

隨后固定學習過的 ,接著訓練 :

但是光靠上面的方法并不夠有效,因為沒有限制的情況下, 會任意操縱(arbitrarily manipulate) 生成的特征向量。打個比方說, 可能隨意輸出一個向量,使得 非常小,但是這個對于訓練來說沒有意義。為了限制 ,需要他輸出的向量不改變原本向量的標簽。

給出一個判別器 ,對于每個特征向量, 能將其分成(K+1)類,K表示真實存在的類別,+1代表fake類別。通過降低以下loss來訓練 :

其中前半部分讓 分辨 生成的特征向量的標簽

表示softmax loss,后半部分讓 分辨 生成的特征向量。

表示fake類別。

之前提到 應該保留住輸入的特征向量的標簽。因此文章中提出下面的loss:

與之前的公式(2) 結合,通過降低以下loss來訓練 :

其中classification(5)確保了 能夠正確分類

首先,basic model同時降低softmax loss和triplet loss。隨后 被加入到basic model。

softmax 和similarity loss在之前的研究中有被結合起來,但是他們之間的關系并沒有被深入的進行研究。

在特征向量空間(feature embedding space)中,所有相同類別的數據坐標經過 規范化后應該是在一個單位超球面(unit hyper sphere)上,圖2中的decision boundary將不同類別的數據分成K個類別,這種結構能加速收斂并達到理想化(optimal)的結果。但是傳統的softmax loss不能很好兼容基于特征距離(distance-based)的similarity loss。如圖3(b)中。由于偏置b的存在,decision boundary不能夠通過原點,因此在 規范化后,不同類別的點可能會重合。這將導致類間距離(inter-class)的縮小,影響特征向量的效果。因此文章中提出了一個沒有偏執b的softmax loss。如圖3(b)所示,這種無偏置softmax損失的所有決策邊界都通過原點,并且決策區域是錐形的,其頂點位于原點。因此,同一類的樣本在單位超球面上具有單獨的投影,這確保了來自不同類別的示例之間的長的類間距離(inter-class)。

給定一個訓練三元組 其中 為anchor圖片 的類別。無偏置的softmax定義為:

其中 表示CNN網絡的輸出特征向量。隨后網絡 通過縮小 來訓練(SGD)。

圖4左邊部分所示, 的輸入是L維的特征向量,這個向量是網絡 的輸出,同時 的輸出具有相同的維度。 包含4個全連接層,前兩個降維,后兩個升維,每一層后面跟了BatchNormalization和ReLU。最后的輸出是輸入向量和輸出向量的對應位置相加。

另外,判別器 接受 產生的L維特征向量,并將其分成K+1類。 也有4個全連接層,前三個后面跟了BatchNormalization和ReLU,最后一個跟的softmax。(怎么感覺 接受的是應該是 產生的?)

文章中使用的優化器是SGD,學習率 ,步驟在Section 3中介紹。

此外,文章中嘗試構建一個更強大的提取器 ,允許HTG從細粒度的局部細節創建更hard三元組,因此視覺識別模型可以用更難的三元組示例挑戰變得更加魯棒。

實際上,局部特征在許多細粒度的視覺識別任務中起著關鍵作用。用于圖像分類的典型深度神經網絡擅長提取高級全局特征,但常常缺少局部細節的特征。這可能會限制HTG探索本地細節以創建更難的triplets。例如,在沒有本地細節的情況下,HTG無法生成能夠識別不同車輛的大多數有辨別力的部分的三元組,例如徽標,燈光和天窗。

為了解決這個問題,文章中介紹了一種更加關注局部特征的關鍵點圖。例如ResNet-18包含了4個連續的卷積塊,在最后一個卷積塊后面跟著一個全連接層作為全局特征 .對于卷積塊 來說,他的輸出特征圖可以表示為 .隨后我們加一個局部分支叫做keypoint bolck,它具有類似于卷積塊的結構,用于本地化關鍵點的分布,這些關鍵點可以關注最具辨別力的部分以創建更難的三元組。高級語義特征映射是稀疏的(不太明白這里),我們假設關鍵點層的每個通道對應于特定類型的關鍵點,因此我們在關鍵點層的輸出特征上應用通道層面(channel-wise)softmax來估計不同圖像位置上關鍵點的密度:

是clock-l的輸出特征圖在通道c及位置(i,j)上的的點。

block-l局部特征 :

文章中提取了bolck-3和block-4的特征,和全劇特征concat后作為最后的輸出特征。

備注:這部分沒有看的很明白,我理解的大概意思是在網絡的中間層先做一個softmax,最后和全局特征的softmax concat起來。

python gradientboostingregressor可以做預測嗎

可以

最近項目中涉及基于Gradient Boosting Regression 算法擬合時間序列曲線的內容,利用python機器學習包?scikit-learn 中的GradientBoostingRegressor完成

因此就學習了下Gradient Boosting算法,在這里分享下我的理解

Boosting 算法簡介

Boosting算法,我理解的就是兩個思想:

1)“三個臭皮匠頂個諸葛亮”,一堆弱分類器的組合就可以成為一個強分類器;

2)“知錯能改,善莫大焉”,不斷地在錯誤中學習,迭代來降低犯錯概率

當然,要理解好Boosting的思想,首先還是從弱學習算法和強學習算法來引入:

1)強學習算法:存在一個多項式時間的學習算法以識別一組概念,且識別的正確率很高;

2)弱學習算法:識別一組概念的正確率僅比隨機猜測略好;

Kearns Valiant證明了弱學習算法與強學習算法的等價問題,如果兩者等價,只需找到一個比隨機猜測略好的學習算法,就可以將其提升為強學習算法。

那么是怎么實現“知錯就改”的呢?

Boosting算法,通過一系列的迭代來優化分類結果,每迭代一次引入一個弱分類器,來克服現在已經存在的弱分類器組合的shortcomings

在Adaboost算法中,這個shortcomings的表征就是權值高的樣本點

而在Gradient Boosting算法中,這個shortcomings的表征就是梯度

無論是Adaboost還是Gradient Boosting,都是通過這個shortcomings來告訴學習器怎么去提升模型,也就是“Boosting”這個名字的由來吧

Adaboost算法

Adaboost是由Freund 和 Schapire在1997年提出的,在整個訓練集上維護一個分布權值向量W,用賦予權重的訓練集通過弱分類算法產生分類假設(基學習器)y(x),然后計算錯誤率,用得到的錯誤率去更新分布權值向量w,對錯誤分類的樣本分配更大的權值,正確分類的樣本賦予更小的權值。每次更新后用相同的弱分類算法產生新的分類假設,這些分類假設的序列構成多分類器。對這些多分類器用加權的方法進行聯合,最后得到決策結果。

其結構如下圖所示:

前一個學習器改變權重w,然后再經過下一個學習器,最終所有的學習器共同組成最后的學習器。

如果一個樣本在前一個學習器中被誤分,那么它所對應的權重會被加重,相應地,被正確分類的樣本的權重會降低。

這里主要涉及到兩個權重的計算問題:

1)樣本的權值

1 沒有先驗知識的情況下,初始的分布應為等概分布,樣本數目為n,權值為1/n

2 每一次的迭代更新權值,提高分錯樣本的權重

2)弱學習器的權值

1 最后的強學習器是通過多個基學習器通過權值組合得到的。

2 通過權值體現不同基學習器的影響,正確率高的基學習器權重高。實際上是分類誤差的一個函數

Gradient Boosting

和Adaboost不同,Gradient Boosting 在迭代的時候選擇梯度下降的方向來保證最后的結果最好。

損失函數用來描述模型的“靠譜”程度,假設模型沒有過擬合,損失函數越大,模型的錯誤率越高

如果我們的模型能夠讓損失函數持續的下降,則說明我們的模型在不停的改進,而最好的方式就是讓損失函數在其梯度方向上下降。

下面這個流程圖是Gradient Boosting的經典圖了,數學推導并不復雜,只要理解了Boosting的思想,不難看懂

這里是直接對模型的函數進行更新,利用了參數可加性推廣到函數空間。

訓練F0-Fm一共m個基學習器,沿著梯度下降的方向不斷更新ρm和am

GradientBoostingRegressor實現

python中的scikit-learn包提供了很方便的GradientBoostingRegressor和GBDT的函數接口,可以很方便的調用函數就可以完成模型的訓練和預測

GradientBoostingRegressor函數的參數如下:

class sklearn.ensemble.GradientBoostingRegressor(loss='ls', learning_rate=0.1, n_estimators=100, subsample=1.0, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_depth=3, init=None, random_state=None, max_features=None, alpha=0.9, verbose=0, max_leaf_nodes=None, warm_start=False, presort='auto')[source]?

loss: 選擇損失函數,默認值為ls(least squres)

learning_rate: 學習率,模型是0.1

n_estimators: 弱學習器的數目,默認值100

max_depth: 每一個學習器的最大深度,限制回歸樹的節點數目,默認為3

min_samples_split: 可以劃分為內部節點的最小樣本數,默認為2

min_samples_leaf: 葉節點所需的最小樣本數,默認為1

……

可以參考

官方文檔里帶了一個很好的例子,以500個弱學習器,最小平方誤差的梯度提升模型,做波士頓房價預測,代碼和結果如下:

1 import numpy as np 2 import matplotlib.pyplot as plt 3 ?4 from sklearn import ensemble 5 from sklearn import datasets 6 from sklearn.utils import shuffle 7 from sklearn.metrics import mean_squared_error 8 ?9 ###############################################################################10 # Load data11 boston = datasets.load_boston()12 X, y = shuffle(boston.data, boston.target, random_state=13)13 X = X.astype(np.float32)14 offset = int(X.shape[0] * 0.9)15 X_train, y_train = X[:offset], y[:offset]16 X_test, y_test = X[offset:], y[offset:]17 18 ###############################################################################19 # Fit regression model20 params = {'n_estimators': 500, 'max_depth': 4, 'min_samples_split': 1,21 ? ? ? ? ? 'learning_rate': 0.01, 'loss': 'ls'}22 clf = ensemble.GradientBoostingRegressor(**params)23 24 clf.fit(X_train, y_train)25 mse = mean_squared_error(y_test, clf.predict(X_test))26 print("MSE: %.4f" % mse)27 28 ###############################################################################29 # Plot training deviance30 31 # compute test set deviance32 test_score = np.zeros((params['n_estimators'],), dtype=np.float64)33 34 for i, y_pred in enumerate(clf.staged_predict(X_test)):35 ? ? test_score[i] = clf.loss_(y_test, y_pred)36 37 plt.figure(figsize=(12, 6))38 plt.subplot(1, 2, 1)39 plt.title('Deviance')40 plt.plot(np.arange(params['n_estimators']) + 1, clf.train_score_, 'b-',41 ? ? ? ? ?label='Training Set Deviance')42 plt.plot(np.arange(params['n_estimators']) + 1, test_score, 'r-',43 ? ? ? ? ?label='Test Set Deviance')44 plt.legend(loc='upper right')45 plt.xlabel('Boosting Iterations')46 plt.ylabel('Deviance')47 48 ###############################################################################49 # Plot feature importance50 feature_importance = clf.feature_importances_51 # make importances relative to max importance52 feature_importance = 100.0 * (feature_importance / feature_importance.max())53 sorted_idx = np.argsort(feature_importance)54 pos = np.arange(sorted_idx.shape[0]) + .555 plt.subplot(1, 2, 2)56 plt.barh(pos, feature_importance[sorted_idx], align='center')57 plt.yticks(pos, boston.feature_names[sorted_idx])58 plt.xlabel('Relative Importance')59 plt.title('Variable Importance')60 plt.show()

可以發現,如果要用Gradient Boosting 算法的話,在sklearn包里調用還是非常方便的,幾行代碼即可完成,大部分的工作應該是在特征提取上。

感覺目前做數據挖掘的工作,特征設計是最重要的,據說現在kaggle競賽基本是GBDT的天下,優劣其實還是特征上,感覺做項目也是,不斷的在研究數據中培養對數據的敏感度。

從零開始用Python構建神經網絡

從零開始用Python構建神經網絡

動機:為了更加深入的理解深度學習,我們將使用 python 語言從頭搭建一個神經網絡,而不是使用像 Tensorflow 那樣的封裝好的框架。我認為理解神經網絡的內部工作原理,對數據科學家來說至關重要。

這篇文章的內容是我的所學,希望也能對你有所幫助。

神經網絡是什么?

介紹神經網絡的文章大多數都會將它和大腦進行類比。如果你沒有深入研究過大腦與神經網絡的類比,那么將神經網絡解釋為一種將給定輸入映射為期望輸出的數學關系會更容易理解。

神經網絡包括以下組成部分

? 一個輸入層,x

? 任意數量的隱藏層

? 一個輸出層,?

? 每層之間有一組權值和偏置,W and b

? 為隱藏層選擇一種激活函數,σ。在教程中我們使用 Sigmoid 激活函數

下圖展示了 2 層神經網絡的結構(注意:我們在計算網絡層數時通常排除輸入層)

2 層神經網絡的結構

用 Python 可以很容易的構建神經網絡類

訓練神經網絡

這個網絡的輸出 ? 為:

你可能會注意到,在上面的等式中,輸出 ? 是 W 和 b 函數。

因此 W 和 b 的值影響預測的準確率. 所以根據輸入數據對 W 和 b 調優的過程就被成為訓練神經網絡。

每步訓練迭代包含以下兩個部分:

? 計算預測結果 ?,這一步稱為前向傳播

? 更新 W 和 b,,這一步成為反向傳播

下面的順序圖展示了這個過程:

前向傳播

正如我們在上圖中看到的,前向傳播只是簡單的計算。對于一個基本的 2 層網絡來說,它的輸出是這樣的:

我們在 NeuralNetwork 類中增加一個計算前向傳播的函數。為了簡單起見我們假設偏置 b 為0:

但是我們還需要一個方法來評估預測結果的好壞(即預測值和真實值的誤差)。這就要用到損失函數。

損失函數

常用的損失函數有很多種,根據模型的需求來選擇。在本教程中,我們使用誤差平方和作為損失函數。

誤差平方和是求每個預測值和真實值之間的誤差再求和,這個誤差是他們的差值求平方以便我們觀察誤差的絕對值。

訓練的目標是找到一組 W 和 b,使得損失函數最好小,也即預測值和真實值之間的距離最小。

反向傳播

我們已經度量出了預測的誤差(損失),現在需要找到一種方法來傳播誤差,并以此更新權值和偏置。

為了知道如何適當的調整權值和偏置,我們需要知道損失函數對權值 W 和偏置 b 的導數。

回想微積分中的概念,函數的導數就是函數的斜率。

梯度下降法

如果我們已經求出了導數,我們就可以通過增加或減少導數值來更新權值 W 和偏置 b(參考上圖)。這種方式被稱為梯度下降法。

但是我們不能直接計算損失函數對權值和偏置的導數,因為在損失函數的等式中并沒有顯式的包含他們。因此,我們需要運用鏈式求導發在來幫助計算導數。

鏈式法則用于計算損失函數對 W 和 b 的導數。注意,為了簡單起見。我們只展示了假設網絡只有 1 層的偏導數。

這雖然很簡陋,但是我們依然能得到想要的結果—損失函數對權值 W 的導數(斜率),因此我們可以相應的調整權值。

現在我們將反向傳播算法的函數添加到 Python 代碼中

為了更深入的理解微積分原理和反向傳播中的鏈式求導法則,我強烈推薦 3Blue1Brown 的如下教程:

Youtube:

整合并完成一個實例

既然我們已經有了包括前向傳播和反向傳播的完整 Python 代碼,那么就將其應用到一個例子上看看它是如何工作的吧。

神經網絡可以通過學習得到函數的權重。而我們僅靠觀察是不太可能得到函數的權重的。

讓我們訓練神經網絡進行 1500 次迭代,看看會發生什么。 注意觀察下面每次迭代的損失函數,我們可以清楚地看到損失函數單調遞減到最小值。這與我們之前介紹的梯度下降法一致。

讓我們看看經過 1500 次迭代后的神經網絡的最終預測結果:

經過 1500 次迭代訓練后的預測結果

我們成功了!我們應用前向和方向傳播算法成功的訓練了神經網絡并且預測結果收斂于真實值。

注意預測值和真實值之間存在細微的誤差是允許的。這樣可以防止模型過擬合并且使得神經網絡對于未知數據有著更強的泛化能力。

下一步是什么?

幸運的是我們的學習之旅還沒有結束,仍然有很多關于神經網絡和深度學習的內容需要學習。例如:

? 除了 Sigmoid 以外,還可以用哪些激活函數

? 在訓練網絡的時候應用學習率

? 在面對圖像分類任務的時候使用卷積神經網絡

我很快會寫更多關于這個主題的內容,敬請期待!

最后的想法

我自己也從零開始寫了很多神經網絡的代碼

雖然可以使用諸如 Tensorflow 和 Keras 這樣的深度學習框架方便的搭建深層網絡而不需要完全理解其內部工作原理。但是我覺得對于有追求的數據科學家來說,理解內部原理是非常有益的。

這種練習對我自己來說已成成為重要的時間投入,希望也能對你有所幫助

標題名稱:對抗損失函數python的簡單介紹
當前路徑:http://m.kartarina.com/article46/hddihg.html

成都網站建設公司_創新互聯,為您提供品牌網站制作App開發動態網站網站營銷網站維護面包屑導航

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

綿陽服務器托管
主站蜘蛛池模板: 亚洲AV成人无码久久WWW| 国产午夜精品无码| 国产成人精品一区二区三区无码 | 特级小箩利无码毛片| 无码一区18禁3D| 久久久久久国产精品无码下载| 国产产无码乱码精品久久鸭| 毛片一区二区三区无码| 亚洲精品无码不卡在线播HE| 中文字幕无码亚洲欧洲日韩| 中文无码伦av中文字幕| 熟妇人妻无码中文字幕老熟妇 | 性生交片免费无码看人| 少妇性饥渴无码A区免费| 亚洲人片在线观看天堂无码| 亚洲AV无码成人网站久久精品大| 亚洲äv永久无码精品天堂久久 | 中文字幕精品无码一区二区三区| 无码喷水一区二区浪潮AV| 免费A级毛片无码A∨免费| 伊人久久综合精品无码AV专区| 久久综合一区二区无码| 99热门精品一区二区三区无码| 日韩免费无码视频一区二区三区| 亚洲欧洲美洲无码精品VA | 亚洲国产精品无码AAA片| 性色AV一区二区三区无码| 无码不卡av东京热毛片| 无码区日韩特区永久免费系列| 久久午夜伦鲁片免费无码| 无码人妻一区二区三区在线视频 | 一区二区三区人妻无码| 午夜无码视频一区二区三区| 狠狠久久精品中文字幕无码| 无码色偷偷亚洲国内自拍| 亚洲AV无码一区二区三区网址| 无码专区人妻系列日韩精品少妇| 日韩av无码成人无码免费| 无码人妻一区二区三区免费视频 | 日韩精品专区AV无码| 国产成人无码久久久精品一|