因為最近在解 Leetcode 的 91. Decode Ways,
部落格
-
費波納契數列的最佳計算複雜度 O(logn) 實現及推導(fibonacci sequence in cpp)
要用到 Fibonacci sequence 來解,就我所知上次解 70. Climbing Stairs 的時候,用 recursive 求解 Fibonacci sequence 的時候會 TLE。(所以我就偷懶跑去用 Python3 解大數)這次再遇到應該是要進步了xDDD正文開始:Fibonacci sequence 會長這個樣子:根據基本定義,第 N 個 Fibonacci value 等於前兩個 Fibonacci value 相加,我們便可以得到公式:得到公式以後把它擴展成 轉移矩陣 M 的形式,因為我們把前兩項當作初始值,所以 轉移矩陣 M 的指數會減二:所以我們現在只要計算 M 的 (n-2) 次方就能得到第 N 個 Fibonacci value。(左上角的 M00 會等於 第N個 Fibonacci value)此時的計算複雜度為:O(n)以第 45 個 value 值來比較,此方法已經比遞迴快很多了xD但是我還要教你一個威力加強版外掛:平方求冪(左岸又稱快速冪 or double-and-add)我們在這裡要用平方求冪去優化轉移矩陣 M。平方求冪的想法是把任何高階指數都化為與指數二有關的指數和,屁話一堆直接看數學比較快:如果你說 n 是 odd 怎麼辦?啊不簡單?直接減一再乘回去R~:這樣的好處是能大大的減少計算量,數學意義上來說是二分搜尋法,以找 n = 16 舉例,沒有平方求冪的版本會很老實地計算十五次乘法,而有平方求冪外掛的版本會跳著算:像是圖中有幾個節點,就計算幾次,每次都是跟自己相乘,所以實際上只要算黃色螢光筆那條路徑,不必考慮其他條黑色路徑。由此可以 16 = 2^4,所以有 4 個節點,只需計算 4次。此時又可推導出 計算複雜度為:O(logn)(log 以 2 為底。)用 C++ 實現的程式碼我放在這裡有興趣的可以直接拿來用,不用再造車輪了xD感謝各位 -
[論文筆記] Point2SpatialCapsule 看完這篇就入門 CapsuleNet!
最近要提升手上模型分類的準確度,
所以在讀各種各樣的論文(#
這篇主要發想來自 Geoffrey E. Hinton 大師覺得 BP 根本太荒謬了,
人腦不會有 BP 這種架構,他想把神經網路更優化、更趨近於人腦所做的 Capsule 計畫。
(避免誤會,這篇是左岸同胞的延伸論文,並不是 Geoffrey E. Hinton 大師手筆。)
CapsuleNet 架構最主要想解決的問題是:
1.傳統 CNN 需要大量資料學習
2.提升 Permutation invariance
(廢話xD 一堆論文都在做這東西)
這篇論文與 CapsuleNet 架構最大的不同就是:
把空間特徵塞進去膠囊裡面
簡單用一張圖解釋:
人腦辨識左邊是R的過程是把圖型旋轉過來,但是 CNN 是需要看過很多不同狀態的R。
像是轉了30度、60度、90度 的 R 都拿下去訓練,最後把這些結果分給 R 這個 Label,
CNN 才知道:噢?這個是R?
大師覺得要解決這種問題,就要從圖型的內部結構下手。
像是人臉的眼睛會在鼻子的上面、鼻子在嘴巴的上面、嘴巴會在下巴的上面。
只要獲得這一連串的內部對應關係,神經網路就不用每個角度再造一次車輪。
這篇怎麼做的?
Geometric Feature AggregationMulti-Scale Local Feature Extraction首先用 GMM (Gaussian Mixture Model – Free Mind) + MSG (Multi-Scale Grouping)
抓相鄰點特徵。
作者說因為計算量會比較小所以用 GMM 而不是 K-Means。
這點我認為是完全唬爛,
GMM的計算量、變數量都比 K-Means 要來得大。

經過 MSG抓特徵的影響 經過 MSG 抓特徵後會有特徵太相似的困擾,
設想一個狀況,上圖是 MSG 抓兩層特徵 ( K=2 ) 的狀況下的圖示。
外面那圈重疊的面積比裡面那圈大很多,對吧?
面積在這裡可以換成機率,所以對於相鄰點來說:
外面那圈的大尺度抓到的特徵有很大的機率會很像。
Multi-Scale Shuffling

洗牌!(T代表抓取的尺度,C代表通道維度) 所以我們做一個洗牌的動作(文字癌),把大小尺度的特徵混在一起增強特徵。
Spatial Relationship AggregationRearrange and Squashing其中 C(qk) 代表 xyz 軸輸入、 C(yk) 代表 MLP 過後的 高維度特徵。C(Sk) 僅代表 C(qk) 與 C(yk) concat 起來,也是本篇最大的改進。ui是 C(Sk) 經過全連接層做出來的東西,論文用 256個 輸出的全連接層做。物理意義上ui代表每個不同的特徵(顏色、深度、方向…等)。以下詳細解說膠囊如何運作:我們要知道 CapsuleNet 架構裡面,每個特徵點被觸發的方式是由底層的膠囊一層一層傳播上去。至於為什麼膠囊架構會長成這樣,這篇講得很好,我就不多贅述了。(fixation point 的部分)首先從第 i 層抓一個膠囊啟動,輸出向量為 Ui。這個 Ui 會乘上權重矩陣 變成預測的 hat Uij,hat Uij 的物理意義是估計 Uj 這顆膠囊的輸出向量來說 Ui 輸出向量的比重。然後乘上耦合函數 Cij 後用 squashing函數 做真實輸出 -> 這顆膠囊的真實輸出 Vj乘上耦合函數 Cij 的物理意義是當 Ui 這顆膠囊對於 Uj 貢獻巨大時,Cij 會趨近於一(或等於一),Uj 的參數會全部灌給 Uj 去做輸出。很巧妙的一個設計。CapsuleNet 系列都有一個 squashing 函式,這邊給出的解釋是 Geoffrey E. Hinton 大師 希望膠囊的長度(本篇膠囊=ui)能夠代表機率,長度越長的膠囊長度越要趨近於一、長度越短的膠囊長度要趨近於零。所以這個函數會把每個向量(膠囊)長度正規化,圖形會長這樣:這邊的長度要用 Two-norm 帶入,否則會證不出來。然後特別要注意的一點是這裡的 squashing 只會在 Vj 做一次,第一行 squashing 的函式與 第三行的 Ui 沒有半點毛線關係。這篇看很久都看不透,一部分是因為數學符號混用,強烈建議這篇方程式要跟原版論文對照著看。(嚴重懷疑變數會長這麼醜,是為了規避論文重疊性比對。)後面的 bij 就是迭代真實輸出與估計去更新 Cij 而已。 -
[論文筆記] SegGCN – 利用 Fuzzy Spherical 改善 Octree guided CNN 的分割點雲方法
因為教授可能想讓我做 partial & segmentation,
所以被 assign 了這篇論文。SegGCN 做了兩件事情:一是 Fuzzy Spherical 的波波獸(Proposal),可以有效提升舊有 Hard Spherical 的準確度、提升稀疏點雲的 robustness。二來提出了新的 SegGCN 架構,只有提到效能還不錯,主要是 Decoder 端的 Resnet block 換成 1×1 的 Conv。這篇主要比較對象是 KPConv。首先來了解 Fuzzy Spherical,Fuzzy Spherical 是 base on Hard Spherical。而 Hard Spherical 是 Octree guided CNN 那個流派提出來的,Octree guided CNN 主要的貢獻就是用 球座標 來處理點雲。為了更好的節省球座標的記憶體容量,所以用了八元樹(Octree)來處理。有點混亂?沒關係,你只要知道 Hard Spherical 是球座標的一種模式就可以了。用論文圖來解釋:假設把球座標投影至二維平面(後面會提到特別指 XY平面)。左邊的 (a) 就是 Hard Spherical,每個區塊有個別的權重、越靠近原點的區塊權重越大,這就是 Hard Spherical 的核心概念。Hard Spherical 的三維概念大概長這樣:在論文裡面 Hard Spherical 尺寸是 n * p * q ,但讀論文的時候要注意:總共有 n * p * q 個 Bins"n , p , q"在這裡全都代表分割的個數,不是軸的概念。論文裡面還是用球座標的但是這裡 Hard Spherical 會遇到兩個問題:第一看到 圖(一) 左側的 s,t 點,當兩點很接近 Bin 邊緣的時候,空間位置接近、但是權重會落差很大。第二見圖(三),當兩點 phi 角呈正負關係,且其餘兩維不變時,在 Hard Spherical 裡面權重會不一樣。附註.這裡的權重為所以 Fuzzy Spherical 的解決方法就是把 半徑 r 軸線性化、不分 Bin 了。想像一下,把上面 圖(一) 視為 球座標 對 XY軸 的投影。使用新的 k 計算方法:比較一下 Fuzzy Spherical(上) 與 Hard Spherical(下) 的特徵方程式:可以看到有個靠北難念的 ξk 向量,那代表在 Fuzzy Spherical 中所有點都考慮隔壁鄰居 k 的關係向量。(ξ的念法)而 Hard Spherical 是 Fuzzy Spherical 的特例,把 ξk 變成 one-hot 向量去處理掉了。(one-hot 向量 這篇 講得不錯,建議閱讀。)再來是 SegGCN 架構:最後給了個在 SegGCN 中使用 Fuzzy 與 Hard 的比較圖,這張圖同樣在 8192 點的資料下面做的、變因是 dropout 的參數。可以看到 Fuzzy 的很 robust。但是用哪個資料集就沒有明講,可能是什麼獨家機密吧(#?結論:1. Fuzzy Spherical 在取樣點數少的情況下較 robust,換句話說 Acc 也比較高。2. SegGCN 在 S3DIS 與 ScanNET 資料集下比 KPConv 快 100倍。(但是 mIOU 跟 mAcc 是輸的xD)他們給的解釋是 16 for 20 都有贏啦(剩下四個巨爛)然後自己搞了個 Kernal comparison 說我們把 Fuzzy Spherical 帶進 KPConv 有贏!用哪個資料集、怎麼比的都不知道xD哇,如此厚顏無恥之人!好總之,晚安。 -
[程式碼筆記] 利用程式碼實現 KNN
因為前陣子在審視架構的時候,亂報(X)沒讀熟(O),
所以架構被老師質疑,被遣送回實驗室重讀一遍 DGCNN 怎麼刻 KNN 的部分?
以下的 KNN 程式碼 都是 base on DGCNN 的 model.py 裡面的 KNN function。
前情提要:
1. KNN 要幹嘛?
:拿到兩點的歐式距離。
2. 歐式距離是什麼?
吃公式:
我們塞進 KNN function 的資料 x 會長得像是:
[ Batch_size, Channel, Number_of_point ]
其中 Channel 是資料維度的意思,如果是三維的 x, y ,z 座標,
Channel 就會等於 3。
接下來來看程式碼:
inner = -2*torch.matmul(x.transpose(2, 1), x)因為 torch.matmul 代表矩陣相乘
ineer 出來的資料尺寸就會是
[ Batch_size, Number_of_point , Number_of_point ]
令 P1 = [ x1, y1, z1], P2 =[ x2, y2, z2]
ineer 所代表的數學意義為
[ x1*x2 + y1*y2 + z1*z2]
再來看第二行程式碼:
xx = torch.sum(x**2, dim=1, keepdim=True)
xx 出來的資料尺寸為
[ Batch_size, 1 , Number_of_point ]
因為 keepdim=True 的關係,所有 sum 起來的資料會存到第一格。
xx 所代表的數學意義為
[x1^2 + y1^2 + z1^2, … , xn^2 + yn^2 + zn^2]
最後一行程式碼就是組合起來,變成歐式距離的平方:
pairwise_distance = -xx - inner - xx.transpose(2, 1)
會變成:
就是歐式距離平方的展開。至於負號是為了後面要做 TopK 所以放上的。以上 ODO -
[論文筆記] SE-NET 的威力加強版 – Convolutional Block Attention Module (CBAM)
我為什麼要讀這篇論文?
這篇論文可以做什麼?
這篇論文怎麼做?
首先,因為我的 DGCNN 模型遭遇到了訓練瓶頸,
所以我到處找論文來 inprove 模型的準確度。
這篇論文可以加強模型的準確度,前提是 base on ResNet-50。
裡面提到這種架構可以插在任意的 convolution 層中間,
是不會消耗太多計算量的輕量型架構。
這篇論文是從 SE-Net 加強而來,
最主要的差別在於 SE-Net 只對 Channel 做 Attention Module,
而 CBAM 對 Spatial 也做了 Attention Module 並且把它加進來。
整個核心觀念就是用 attention Module 對 CNN 去優化,
至於 Attention Module 是什麼概念可以參考上一篇 SE-Net。
整個架構會長這樣:

圖一:CBAM整體架構 這對解釋接下來的方程式很有幫助。想像那顆 Feature 是一顆生吐司,每一片都是不同口味。其中有地瓜、甜芋頭、秋葵三種口味,我是一個特別喜歡甜芋頭、極度討厭秋葵的人,Channel Attention 在做的事情就是找出我喜歡的部分,然後想辦法甜芋頭變得更甜、秋葵變得更無味、讓我更喜歡這顆生吐司。這顆生吐司(Feature)在我心目中的價值就會越來越高。我不知道未來的女朋友會不會閒到來看部落格,但是如果妳覺得火鍋裡面一定要放芋頭,我會好好思考我們之間的關係。會把芋頭放進火鍋都是邪教徒吧?從公式來看架構,剛剛(圖一)說過了尺寸很重要。這部分會叫 Channel Attention 就是因為它是從 Channel 下去切割的。Maxpooling 與 Avgpooling 過後的資料尺寸為 C x 1 x 1 的一條濃縮吐司。MC(F) 就是整個做完的特徵圖(資料)、sigma = sigmoid operator;W0 與 W1 是結構圖中間進 MLP 的權重,我在 SE-Net 有講過就不贅述了。至於最重要的,為什麼要做 Maxpooling + Avgpooling?
原作者表示:啊這樣可以更精確地分別每個通道的權重…(幹話。
我自己的觀察:
從 PointConv 這篇論文提到 PointNet 的問題在於 Maxpooling 只能提供 global 或是 local 的 Feature。
又 SE-Net 使用 Avgpooling 能夠促進模型的性能。
所以小孩子才做選擇,我們兩種混在一起做撒尿牛丸!
解釋一下為什麼這個叫 Spatial Attention ,因為他是切 1 x H x W。所以得到的特徵是 H x W 在每個通道的值(也就是空間位置)。比較需要解釋的是 f 7*7,這顆是 Hyperparameter,試出來最好的 kernel。結論:
根據數據來看 CBAM base on ResNet-50 的時候,最差那個圖的錯誤率(Top-1 Error)減少了 1.9%。這種 Attention 架構是一定會變好,但是我個人猜測要在某些架構的前提下才會變好比較多。至於CBAM 加進 DGCNN 會不會變好?我還沒嘗試,但是根據上次 SE-NET 的經驗,是增加了 萬分之十的準確率。這次預估能增加萬分之十五應該就很不錯了(O) -
[名詞筆記] Channel-wise
Channel-wise
之前在 【論文筆記】Squeeze-and-Excitation Networks 那篇 遇到過,
這次來很淺的解釋一下 Channel-wise 大概在做什麼?
就我的解釋來看:
Channel-wise 在做 "base on Channel 的分組連接",
目的是減少計算量。
以 H x W x C 為尺寸 2 x 2 x 9 為例,三個分成一組。以 【論文筆記】Squeeze-and-Excitation Networks 那篇 來說
我們要使用一顆 H x W x C 的 Feature 來做 Channel-wise,
總共有 C 個 Channel 每個 Channel 自己一組。
分組後的 Channel 再去做 Cov。
大概就是這樣<3
-
【論文筆記】Squeeze-and-Excitation Networks
簡介:
Squeeze-and-Excitation Networks(以下簡稱 SENet)是一種類似於 plugin 的概念,
獲得對於 C 個特徵(frature)間的關係,進而提升整體模型的準確率。
方法概要:
Step1
先拿一組 H’ x W’ x C’ 的 feature ,經過 Ftr 後 得到標準輸入 U 。
Step2
想像一下把 U 這顆像生吐司的東西整個壓縮,經過 Fsq 後 變成 1 x 1 x C 的濃縮生吐司資料。
然後這裡做了 channel-wise 的運算,也就是分組 base on C 的概念。
做了以後會得到 C 組的 1 x 1 資料
channel-wise 的概念請點這篇
Step3
因為濃縮生吐司資料的尺寸是 1 x 1 x C ,所以可以想像成有 C 片小土司。
為了減少計算量 + 得到每片吐司 裡面模型的互相關係,所以做 Fex。
得到權重序列 S (1 x 1 x C)
其中 W1,W2 的維度變換是因為 Activation Function 的緣故。
Step4
把權重序列 S 乘上生吐司 U (標準輸入 feature),
讓你的生吐司成為威力加強版!
想像一下,如果拿去做二維邊緣偵測,經過這個 SENet 之後的輪廓理論上會加深。
解釋計算方程式:
Ftr():
Ftr 就是在做捲積運算,算到想要到生吐司尺寸。
Faq():
Zc 就是上文所提到的濃縮生吐司資料,這邊在幹的事情很簡單。
把 H x W 這個二維平面上的每一個點做平均得到一個純量,總共有 C 個純量。
正經且學術上的講法是 Global Average Pooling
Fex():
Fex() 是本文核心重點,利用 Fex() 獲得 Channel feature map 間的關係。
首先要說明 σ 跟 δ 的特殊性關係(#
σ = sigmoid ; δ = ReLU
z 則是等效上面的 Zc
從右邊看起 維度 C 的 濃縮生吐司資料 左乘 W1 出來的資料維度是 1 x 1 x C/r ,
這筆資料做 Sigmoid 後 左乘 W2 又變回 1 x 1 x C 的資料。

最後 ReLU 運算後,得到權重序列 S 。
Fscale():
核心概念概念就是把這串權重序列 S 分配給傻傻的並聯生吐司 U,
這樣你的 生吐司 U 就會變成擁有 Channel feature 間關係 的威力加強版 tilde X。文章的 Reference 來自於這兩篇:
(深度學習)SENet(Squeeze-and-Excitation Networks)
SENet(Squeeze-and-Excitation Networks)算法笔记
如果小弟我有寫錯,或是有更好的想法歡迎來信討論~
信箱地址:wuyiulin@gmail.com
-
[Python] YAML.dump TypeError: ‘str’ object is not callable 解決辦法
當出現 TypeError: ‘str’ object is not callable
但你確定傳進來的變數的確是 str 時?
別緊張,可能只是命令參數給錯了。
像是下圖只包到檔案名稱,沒把參數 ‘w’ 用 () 包起來,就會出現這種錯誤。
把
yaml.dump(‘654’+ ‘n‘ + ’65’, open(‘test.yml’),‘w’)修改成
yaml.dump(‘654’+ ‘n‘ + ’65’, open(‘test.yml’,‘w’))就可以囉OAOAOAOAOA
低級錯誤me,撞豆腐自殺。
-
Andriod一堆app閃退怎麼辦?
點開 Google Play 商店
搜尋 Android system webviwer 解除安裝就好了
Google 在搞
本文更新於 2021/03/23
Ref.https://www.ptt.cc/bbs/MobileComm/M.1616455704.A.7D0.html
-
[心得] 破解 Google 雲端下載限制(非建立副本)
各位紳士們,一定都有碰過下面這張圖的情況吧?
像這樣這時如果你直接按下載就會顯示下載次數已經超過如果建立副本就會卡死但是!如果你框住複數個檔案 像下圖就可以完美下載啦!灑花穴穴指交



































