實作yolov1
計算layer輸出
{: w=”700” h=”200” }
- 首先可以看到輸入的圖片是448 x 448,然後經過7 x 7 x 64 stripe 2 的conv layer,以及2 x 2 stripe 2 的Maxpool layer。
如果直接計算輸出的dimension,會發現計算有問題!!因為$${ 輸入寬度 - kernel寬度 \over stripe} \ne 224$$。查詢後發現如果去看yolov1.cfg,第一層的padding=1,也就是這層conv有paddind。
首先先看到darknet/src/parser.c的parse_convolutional
可以發現if(pad) padding = size/2;
,也就是如果cfg的padding=1,padding的大小就是$$\lfloor {kernel \ size \over 2} \rfloor$$ 取整數。所以第一層的padding是$$\lfloor {7 \over 2} \rfloor$$取整數3。
再去看darknet/src/convolutional_layer.c的make_convolutional_layer
呼叫的convolutional_out_width
,就可以看到詳細計算。conv的輸出尺寸是
$$\lfloor{ {輸入長(寬) + 2 \times padding - kernel \ 長(寬)} \over stride}\rfloor + 1 = \lfloor{447 \over 2}\rfloor + 1 = 224$$
接下來是2 x 2 Maxpool layer,輸出尺寸為112,輸出channel是
64
!!不過如果直接對照圖看,會發現圖上寫112 x 112 x 192,這很可能是論文的圖寫錯了,因為如果用darknet幫你計算每一層的輸出的話應該是如下圖。
{: w=”700” h=”200” }1 x 1 的conv稱為reduction layers
Pytorch實作
下面以圖片作為輸入來舉例
- CONV2D: 輸入的tensor每一個維度所對應的是$$(N,C_{in},H,W)$$
- $$N$$: 照片張數,一次一張照片為1
- $$C_{in}$$:照片channel,彩色照片為3
- $$H$$: 照片高度
- $$W$$: 照片寬度
darknet的conv layer程式碼疑問:
1 | for(i = 0; i < l.nweights; ++i) l.weights[i] = scale*rand_normal(); #209 |
其他紀錄
計算總共有多少個weights
layer定義
h:輸入高
w:輸入寬
c:輸入channel
n:輸出channel
size:kernel size
nweights = (c / groups) * n * size * size
darknet載入權重
src -> parser.c -> load_convolutional_weights
- 讀取biases,每一個conv的filter都有一個,如yolov1第一層有64個
- 讀取batch_normalize
- 讀取scales,數量等於輸出channel
- 讀取rolling_mean,數量等於輸出channel
- 讀取rolling_variance,數量等於輸出channel
- 讀取weights
計算weight數量
史丹佛cs231n的這張圖解釋得非常清楚,權重的總數為
輸入channel x kernel 寬 x kernel 高 x 輸出channel
local layer
參考:
Dive into Deep learning
https://d2l.ai/chapter_convolutional-neural-networks/padding-and-strides.html#stride
CS231
https://cs231n.github.io/convolutional-networks/#comp
Deep learning
http://neuralnetworksanddeeplearning.com
caculate weights number : Convolution Demo
https://cs231n.github.io/convolutional-networks/
Batch-Normalization
https://towardsdatascience.com/batch-normalization-in-3-levels-of-understanding-14c2da90a338
Locally Connected Layers說明
https://www.cs.toronto.edu/~lczhang/aps360_20191/lec/w03/convnet.html
Understanding Convolutions
http://colah.github.io/posts/2014-07-Understanding-Convolutions/
local connected layer
http://sintesis.ugto.mx/WintemplaWeb/01Neural%20Lab/09Convolutional%20NN/10Locally%20Connected/index.htm
local connected layer 實作
https://github.com/pytorch/pytorch/pull/1583/files
local connected layer 實作
https://github.com/nsoul97/yolov1_pytorch/blob/main/code/model.py
local connected layer 實作
https://github.com/pytorch/pytorch/issues/499
GDB
https://cotonne.github.io/gdb/2019/07/14/gdb-beginner-guide.html
GDB https://condor.depaul.edu/glancast/373class/docs/gdb.html
Math Syntax
https://www.rapidtables.com/math/symbols/Basic_Math_Symbols.html
GDB指令:
p sizeof(array)/sizeof(*array) ptype array 印出array長度
印出指標array的長度
p *l.biases@10 印出array的前10個元素