.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任意一个中间层各参数的值.