imagenet-vgg-verydeep-19.mat格式详解

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

classes

normalization

参考资料

  1. TensorFlow Implementation of A Neural Algorithm of Artistic Style
  2. neural-style
  3. MatConvNet Convolutional Neural Networks for MATLAB
原文地址:https://www.cnblogs.com/zhouyang209117/p/6684761.html