imagenet-vgg-verydeep-19参数结构解析

      第一次用网上下载的VGG-19参数来训练网络,下载的参数文件是

      imagenet-vgg-verydeep-19.mat

     文件有500多兆,不明觉厉害(大神莫笑,如果写得有问题欢迎指出以使我进步,哈哈),一下子不清楚它的参数是怎么组织的,为了弄清楚,参考了网上的帖子,也自己用笨办法一层一层的剥离了一下试试看,把解析后的结构记录一下。

一、VGG-19的结构

    先上一下VGG-Net的结构图,来自论文《VERY DEEP CONVOLUTIONAL NETWORK SFORLARGE-SCALE IMAGE RECOGNITION,发表于ICLR 2015,比较起ALEXNET,VGG对图片有更精确的估值以及更省空间。注意19只包含了卷积层,没有算池化、Relu和最后的FC-1000,而在下载的模型参数中这些层都有包含,导致开始没有想明白。


二、笨办法尝试参数结构

# -*- coding:utf-8 -*
import scipy.io
import numpy as np 
import os 
import scipy.misc 


cwd = os.getcwd()
VGG_PATH = cwd + "/data/imagenet-vgg-verydeep-19.mat"
vgg = scipy.io.loadmat(VGG_PATH)
#先显示一下数据类型,发现是dict
print(type(vgg))
#字典就可以打印出键值dict_keys(['__header__', '__version__', '__globals__', 'layers', 'classes', 'normalization'])
print(vgg.keys())
#进入layers字段,我们要的权重和偏置参数应该就在这个字段下
layers = vgg['layers']

#打印下layers发现输出一大堆括号,好复杂的样子:[[ array([[ (array([[ array([[[[ ,顶级array有两个[[
#所以顶层是两维,每一个维数的元素是array,array内部还有维数
#print(layers)

#输出一下大小,发现是(1, 43),说明虽然有两维,但是第一维是”虚的”,也就是只有一个元素
#根据模型可以知道,这43个元素其实就是对应模型的43层信息(conv1_1,relu,conv1_2…),Vgg-19没有包含Relu和Pool,那么看一层就足以,
#而且我们现在得到了一个有用的index,那就是layer,layers[layer]
print("layers.shape:",layers.shape)
layer = layers[0]
#输出的尾部有dtype=[('weights', 'O'), ('pad', 'O'), ('type', 'O'), ('name', 'O'), ('stride', 'O')])
#可以看出顶层的array有5个元素,分别是weight(含有bias), pad(填充元素,无用), type, name, stride信息,
#然后继续看一下shape信息,
print("layer.shape:",layer.shape)
#print(layer)输出是(1, 1),只有一个元素
print("layer[0].shape:",layer[0].shape)
#layer[0][0].shape: (1,),说明只有一个元素
print("layer[0][0].shape:",layer[0][0].shape)

#layer[0][0][0].shape: (1,),说明只有一个元素
print("layer[0][0][0].shape:",layer[0][0][0].shape)
#len(layer[0][0]):5,即weight(含有bias), pad(填充元素,无用), type, name, stride信息
print("len(layer[0][0][0]):",len(layer[0][0][0]))
#所以应该能按照如下方式拿到信息,比如说name,输出为['conv1_1']
print("name:",layer[0][0][0][3])
#查看一下weights的权重,输出(1,2),再次说明第一维是虚的,weights中包含了weight和bias
print("layer[0][0][0][0].shape",layer[0][0][0][0].shape)
print("layer[0][0][0][0].len",len(layer[0][0][0][0]))

#weights[0].shape: (2,),weights[0].len: 2说明两个元素就是weight和bias
print("layer[0][0][0][0][0].shape:",layer[0][0][0][0][0].shape)
print("layer[0][0][0][0].len:",len(layer[0][0][0][0][0]))

weights = layer[0][0][0][0][0]
#解析出weight和bias
weight,bias = weights
#weight.shape: (3, 3, 3, 64)
print("weight.shape:",weight.shape)
#bias.shape: (1, 64)
print("bias.shape:",bias.shape)

三、总结

   所以Vgg-19的layers部分参数数据结构应该是:




  • 15
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值