VGG是一个非常经典的卷积神经网络架构,他的版本很多,用的最广泛的应该是D版本,本人最近使用的是训练好的VGG-19,也就是下面的E版本。
下载地址:http://www.vlfeat.org/matconvnet/models/beta16/imagenet-vgg-verydeep-19.mat
第一次看到VGG19模型的参数时我整个人是懵的(疯狂套娃那种),这个模型参数应该是使用MATLAB导出的,所以要可视化好像需要下MATLAB。但仍然可以导入后在python环境里大概看看长什么样子。
vgg = scipy.io.loadmat(path)
vgg.keys()
'__header__', '__version__', '__globals__', 'layers', 'classes', 'normalization']
这里最重要的是后面三个(normalization对图像预处理用的上)。
w,b参数的获取
由上面我们可以知道
获取第0索引层(也就是input层和第一层之间的)w:vgg['layers'][0][0][0][0][0][0][0]
获取第0索引层(也就是input层和第一层之间的)b:vgg['layers'][0][0][0][0][0][0][1]
也可以直接w,b=vgg['layers'][0][0][0][0][0][0]
把上面红色的0增加就可以获取到所有的层参数
网络层参数的准备代码
def net(data_path, input_image):
layers = (
'conv1_1', 'relu1_1', 'conv1_2', 'relu1_2', 'pool1',
'conv2_1', 'relu2_1', 'conv2_2', 'relu2_2', 'pool2',
'conv3_1', 'relu3_1', 'conv3_2', 'relu3_2', 'conv3_3',
'relu3_3', 'conv3_4', 'relu3_4', 'pool3',
'conv4_1', 'relu4_1', 'conv4_2', 'relu4_2', 'conv4_3',
'relu4_3', 'conv4_4', 'relu4_4', 'pool4',
'conv5_1', 'relu5_1', 'conv5_2', 'relu5_2', 'conv5_3',
'relu5_3', 'conv5_4', 'relu5_4'
)
data = scipy.io.loadmat(data_path)
weights = data['layers'][0]
net = {}
current = input_image
for i, name in enumerate(layers):
kind = name[:4]
if kind == 'conv':
kernels, bias = weights[i][0][0][0][0]
kernels = np.transpose(kernels, (1, 0, 2, 3))
bias = bias.reshape(-1)
current = _conv_layer(current, kernels, bias)
elif kind == 'relu':
current = tf.nn.relu(current)
elif kind == 'pool':
current = _pool_layer(current)
net[name] = current
assert len(net) == len(layers)
return net, mean_pixel, layers
print ("Network for VGG ready")
最后
这里只说如何得到权重参数设置网络层,真正要用起来还需要对图片预处理等等什么的,那个就暂时不说了,如有需要会在之后更新本文,请点赞,收藏(/滑稽)
参考文章
1.tensorflow入门应用方法(五)——Imagenet VGG-19网络加载和特征可视化
2.imagenet-vgg-verydeep-19参数解析