在劍橋大學擔任神經成像和人工智能研究科學家期間,我面臨著使用最新的深度學習技術,尤其是,在復雜的大腦數據集上進行圖像分割的挑戰。在這項工作中,我注意到存在一個顯著的差距:對不確定性估計的忽視!然而,不確定性對于可靠的決策卻是至關重要的。
在計算機視覺和機器學習領域,圖像分割是一個核心問題。無論是在醫學成像、自動駕駛汽車還是機器人領域,準確的分割對于有效的決策至關重要。然而,一個經常被忽視的方面是與這些分割相關的不確定性的衡量。
在許多實際應用中,不正確的分割可能會導致可怕的后果。例如,如果一輛自動駕駛汽車誤認了一個物體,或者醫學成像系統錯誤地標記了一個腫瘤,后果可能是災難性的。不確定性估計為我們提供了一個衡量模型對其預測的“確定度”的指標,從而做出更明智的決策。
熵(Entropy)是從熱力學和信息論中借來的一個概念,它量化了系統中的不確定性或隨機性。在機器學習的背景下,熵可以用來測量模型預測的不確定性。
在數學上,對于具有概率質量函數P(X)的離散隨機變量X,熵H(X)定義為:
或者在連續的情況下:
下面,我們給出一個經典的例子來輔助充分掌握熵這個概念:
想象一下,一枚非均勻的硬幣,正面向上的概率為p=0.9,反面向上的概率為1-p=0.1。
現在讓我們想象一個兩面均勻的硬幣,它的正面和反面都著地的概率都是p=0.5。于是,其熵為:
熵更大時,這與我們之前所說的一致,即有:更多的不確定性=更多的熵。
實際上,值得注意的是,p=0.5對應于最大熵:
從直覺上來看,均勻分布對應熵最大的情況。如果每個結果都是同樣可能的,那么這將對應于最大的不確定性。
為了將其與圖像分割聯系起來,請考慮在深度學習中,最終的Softmax層通常提供每個像素的類別概率??梢曰谶@些Softmax輸出來容易地計算每個像素的熵。
當模型對屬于特定類別的特定像素非常有信心時,Softmax層對該類別顯示出高概率(~1),而對其他類別顯示出非常小的概率(~0)。
相反,當模型不確定時,Softmax輸出更均勻地分布在多個類別中。
顯然,上面的概率結果表現得比較分散,如果你還記得的話,這接近于均勻分布的情況,因為模型無法決定哪個類別與像素相關。
如果你能堅持閱讀到現在,那就太好了!這說明你應該對熵的工作原理有很好的直覺理解了。
接下來,讓我們使用一個醫學成像的實際例子來說明這一點,特別是胎兒的T1大腦掃描的情況。有關這個案例研究的所有代碼和圖像都可以在我的中找到。
正如我們之前所說,我們正在使用神經網絡給出的Softmax輸出張量。這種方法不依賴于具體的模型,它只使用每個類別的概率。
下面,讓我們來澄清一些關于我們正在處理的張量的維度的重要內容。
如果使用2D圖像,則Softmax層的形狀應為:
這意味著,對于每個像素(或三維像素),我們都有一個大小為Classes的向量,這樣就確定了一個像素屬于我們所擁有的每個類別的概率。
于是,熵應該是沿著第一維度的計算結果:
defcompute_entropy_4D(tensor):"""計算具有形狀(number_of_classes,256256256)的4D張量上的熵。參數:tensor(np.ndarray):形狀(number_of_classes,256,256,256)的4D張量。返回值:np.ndarray:形狀(256,256,256)的3D張量,相應于每一個像素的熵值。"""#首先,沿著類別坐標軸歸一化張量,使其表示概率sum_tensor=np.sum(tensor,axis=0,keepdims=True)tensor_normalized=tensor/sum_tensor#計算熵entropy_elements=-tensor_normalized*np.log2(tensor_normalized1e-12)#添加一個小數,以避免log(0)entropy=np.sum(entropy_elements,axis=0)entropy=np.transpose(entropy,(2,1,0))total_entropy=np.sum(entropy)returnentropy,total_entropy
現在,讓我們在圖像分割的每個切片上使用熱圖來可視化不確定性。
讓我們看看另一個例子:
結果看起來很棒!事實上,我們可以看到這是一致的,因為高熵區位于形狀的輪廓處。這是正常的,因為模型并不真正懷疑每個區域中間的點,而是很難發現的邊界或輪廓。
最后,如果你喜歡這篇文章,并且想了解更多的相關信息的話,請查看這個代碼倉庫:https://github.com/FrancoisPorcher?source=post_page-----812cca769d7a
北京市海淀區中關村南1條甲1號ECO中科愛克大廈6-7層
北京市公安局海淀分局備案編號:110108002980號營業執照
defcompute_entropy_4D(tensor):"""計算具有形狀(number_of_classes,256256256)的4D張量上的熵。參數:tensor(np.ndarray):形狀(number_of_classes,256,256,256)的4D張量。返回值:np.ndarray:形狀(256,256,256)的3D張量,相應于每一個像素的熵值。"""#首先,沿著類別坐標軸歸一化張量,使其表示概率sum_tensor=np.sum(tensor,axis=0,keepdims=True)tensor_normalized=tensor/sum_tensor#計算熵entropy_elements=-tensor_normalized*np.log2(tensor_normalized1e-12)#添加一個小數,以避免log(0)entropy=np.sum(entropy_elements,axis=0)entropy=np.transpose(entropy,(2,1,0))total_entropy=np.sum(entropy)returnentropy,total_entropy
相關標簽:
Python、 開發、 熵、
本文地址:http://www.schoolwires.net.cn/article-417.html