.mat是matlab生成的文件.用matlab打開文件imagenet-vgg-verydeep-19.mat可以幫助理解其結構.matlab代碼如下:
a = open('D:\imagenet-vgg-verydeep-19.mat');
a的結構如下圖所示.
對於讀取imagenet-vgg-verydeep-19.mat,與matlab代碼相應對的python代碼為
matpath = r"D:\imagenet-vgg-verydeep-19.mat"
a = scipy.io.loadmat(matpath)
在python代碼中a是一個dict類型,長度為3,對應圖1的layers,classes,normalization. data["layers"]可以取到matlab中layers對應的數據結構,data["classes"]可以取到matlab中classes對應的數據結構,data["normalization"]可以取到matlab中normalization對應的數據結構.下面分開討論.
layers
data['layers']是一個1*43的ndarray.data['layers'][0]就是一個長度為43的ndarray,對應vgg19的43個各層操作的結果.具體為對應關系為
0 對應 conv1_1 (3, 3, 3, 64)
1 對應 relu
2 對應 conv1_2 (3, 3, 64, 64)
3 對應 relu
4 對應 maxpool
5 對應 conv2_1 (3, 3, 64, 128)
6 對應 relu
7 對應 conv2_2 (3, 3, 128, 128)
8 對應 relu
9 對應 maxpool
10 對應 conv3_1 (3, 3, 128, 256)
11 對應 relu
12 對應 conv3_2 (3, 3, 256, 256)
13 對應 relu
14 對應 conv3_3 (3, 3, 256, 256)
15 對應 relu
16 對應 conv3_4 (3, 3, 256, 256)
17 對應 relu
18 對應 maxpool
19 對應 conv4_1 (3, 3, 256, 512)
20 對應 relu
21 對應 conv4_2 (3, 3, 512, 512)
22 對應 relu
23 對應 conv4_3 (3, 3, 512, 512)
24 對應 relu
25 對應 conv4_4 (3, 3, 512, 512)
26 對應 relu
27 對應 maxpool
28 對應 conv5_1 (3, 3, 512, 512)
29 對應 relu
30 對應 conv5_2 (3, 3, 512, 512)
31 對應 relu
32 對應 conv5_3 (3, 3, 512, 512)
33 對應 relu
34 對應 conv5_4 (3, 3, 512, 512)
35 對應 relu
36 對應 maxpool
37 對應 fullyconnected (7, 7, 512, 4096)
38 對應 relu
39 對應 fullyconnected (1, 1, 4096, 4096)
40 對應 relu
41 對應 fullyconnected (1, 1, 4096, 1000)
42 對應 softmax
看下面的代碼
vgg_layers = data['layers'][0]
layer0 = vgg_layers[0]
layer0就對應conv1_1.注意這里是對應,要取到w和b的值要用下面的方法.
import scipy.io
matpath = r"D:\imagenet-vgg-verydeep-19.mat"
data = scipy.io.loadmat(matpath)
vgg_layers = data['layers'][0] # type 1*43
# vgg_layers[0]對應conv1_1,vgg_layers[1]對應relu,vgg_layers[2]對應conv1_2...
w = vgg_layers[0][0][0][0][0][0]
b = vgg_layers[0][0][0][0][0][1]
print(w.shape) # 輸出是(3, 3, 3, 64)
print(b.shape) # (1, 64)
## 顯示第0個filter的3個通道
print(w[:, :, 0, 0])
print(w[:, :, 1, 0])
print(w[:, :, 2, 0])
模仿上面的例子可以找到vgg任意一個中間層各參數的值.