一、简介

VGG网络在2014年的 ILSVRC localization and classification 两个问题上分别取得了第一名和第二名。VGG网络非常深,通常有16-19层,如果自己训练网络模型的话很浪费时间和计算资源。因此这里采用一种方法获取VGG19模型的模型数据,从而能够更快速的应用到自己的任务中来,

本文在加载模型数据的同时,还可视化图片在网络传播过程中,每一层的输出特征图。让我们能够更直接的观察网络传播的状况。

运行环境为spyder,Python3.5,tensorflow1.2.1 
模型名称为: imagenet-vgg-verydeep-19.mat 大家可以在网上下载。

二、VGG19模型结构

模型的每一层结构如下图所示: 

三、代码

    #加载VGG19模型并可视化一张图片前向传播的过程中每一层的输出#引入包import tensorflow as tfimport numpy as npimport matplotlib.pyplot as pltimport scipy.ioimport scipy.misc#定义一些函数#卷积def _conv_layer(input, weights, bias):conv = tf.nn.conv2d(input, tf.constant(weights), strides=(1, 1, 1, 1),padding='SAME')return tf.nn.bias_add(conv, bias)#池化def _pool_layer(input):return tf.nn.max_pool(input, ksize=(1, 2, 2, 1), strides=(1, 2, 2, 1),padding='SAME')#减像素均值操作def preprocess(image, mean_pixel):return image - mean_pixel#加像素均值操作def unprocess(image, mean_pixel):return image + mean_pixel#读def imread(path):return scipy.misc.imread(path).astype(np.float)#保存def imsave(path, img):img = np.clip(img, 0, 255).astype(np.uint8)scipy.misc.imsave(path, img)print ("Functions for VGG ready")#定义VGG的网络结构,用来存储网络的权重和偏置参数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)#原网络在训练的过程中,对每张图片三通道都执行了减均值的操作,这里也要减去均值mean = data['normalization'][0][0][0]mean_pixel = np.mean(mean, axis=(0, 1))#print(mean_pixel)#取到权重参数W和b,这里运气好的话,可以查到VGG模型中每层的参数含义,查不到的#话可以打印出weights,然后打印每一层的shape,推出其中每一层代表的含义weights = data['layers'][0]#print(weights)net = {}current = input_image#取到w和bfor i, name in enumerate(layers):#:4的含义是只看每一层的前三个字母,从而进行判断kind = name[:4]if kind == 'conv':kernels, bias = weights[i][0][0][0][0]# matconvnet: weights are [width, height, in_channels, out_channels]\n",# tensorflow: weights are [height, width, in_channels, out_channels]\n",#这里width和height是颠倒的,所以要做一次转置运算kernels = np.transpose(kernels, (1, 0, 2, 3))#将bias转换为一个维度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] = currentassert len(net) == len(layers)return net, mean_pixel, layersprint ("Network for VGG ready")#cwd  = os.getcwd()#这里用的是绝对路径VGG_PATH = "F:/mnist/imagenet-vgg-verydeep-19.mat"#需要可视化的图片路径,这里是一只小猫IMG_PATH = "D:/VS2015Program/cat.jpg"input_image = imread(IMG_PATH)#获取图像shapeshape = (1,input_image.shape[0],input_image.shape[1],input_image.shape[2]) #开始会话with tf.Session() as sess:image = tf.placeholder('float', shape=shape)#调用net函数nets, mean_pixel, all_layers = net(VGG_PATH, image)#减均值操作(由于VGG网络图片传入前都做了减均值操作,所以这里也用相同的预处理input_image_pre = np.array([preprocess(input_image, mean_pixel)])layers = all_layers # For all layers \n",# layers = ('relu2_1', 'relu3_1', 'relu4_1')\n",for i, layer in enumerate(layers):print ("[%d/%d] %s" % (i+1, len(layers), layer))features = nets[layer].eval(feed_dict={image: input_image_pre})print (" Type of 'features' is ", type(features))print (" Shape of 'features' is %s" % (features.shape,))# Plot response \n",#画出每一层if 1:plt.figure(i+1, figsize=(10, 5))plt.matshow(features[0, :, :, 0], cmap=plt.cm.gray, fignum=i+1)plt.title("" + layer)plt.colorbar()plt.show()

四、程序运行结果

1、print(weights)的结果: 

2、程序运行最终结果: 
 
中间层数太多,这里就不展示了。程序最后两层的可视化结果: 

TensorFlow载入VGG并可视化每层相关推荐

  1. tensorflow随笔——VGG网络

    这次用slim搭个稍微大一点的网络VGG16,VGG16和VGG19实际上差不多,所以本例程的代码以VGG16来做5类花的分类任务. VGG网络相比之前的LeNet,AlexNet引入如下几个特点: ...

  2. Tensorflow命名空间与计算图可视化

    Tensorflow命名空间与计算图可视化 觉得有用的话,欢迎一起讨论相互学习~ 参考文献 强烈推荐Tensorflow实战Google深度学习框架 实验平台: Tensorflow1.4.0 pyt ...

  3. 用TensorFlow可视化卷积层的方法

    深度学习中对于卷积层的可视化可以帮助理解卷积层的工作原理与训练状态,然而卷积层可视化的方法不只一种.最简单的方法即直接输出卷积核和卷积后的filter通道,成为图片.然而也有一些方法试图通过反卷积(转 ...

  4. Tensorflow新手通过PlayGround可视化初识神经网络

    北京 上海巡回站 | NVIDIA DLI深度学习培训 2018年1月26/1月12日 NVIDIA 深度学习学院 带你快速进入火热的DL领域 阅读全文                        ...

  5. tensorflow中如何进行可视化和减轻过拟合(转)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/liuchonge/article/details/77181508 </div>< ...

  6. tensorflow中如何进行可视化和减轻过拟合

    TensorFlow可视化界面与过拟合 最近因为一些需要所以做了一个关于TensorFlow如何使用tensorboard进行可视化以及如何减轻模型训练过程中的过拟合现象的小demo.这里就直接发出来 ...

  7. Tensorflow载入模型详解,方法一(基础版):针对测试模型性能 和 使用模型。

    我们知道了如何保存我们的模型接下来,我们就要想办法加载模型,调用模型,这也是我们用来做验证也好.做应用也好必须要做的.当然这里我们只考虑应用和验证,且只涉及模型部分,数据预处理,大家要自己加油啦.下一 ...

  8. 深度学习之利用TensorFlow实现简单的全连接层网络(MNIST数据集)

    Tensorflow是一个基于数据流编程(Dataflow Programming)的符号数学系统,被广泛应用于各类机器学习(Machine Learning)算法的编程实现,其前身是谷歌的神经网络算 ...

  9. Tensorflow中卷积神经网络之卷积层

    卷积层:与传统全连接层不同,卷积层中每一个节点的输入只是上一层神经网络的一小块.(试图将神经网络中的每一小块进行更加深入地分析从中得到抽象程度更高的特征) 在卷积层中:1.过滤器(filter)处理的 ...

最新文章

  1. C/C++连接MySql数据库
  2. 这个开源项目...看了就停不下来啊!
  3. 【转】GPS定位原理
  4. 弹出ALV的几种方法(ALV POPUP)
  5. 【论文解读】IPM2020 | 长短期兴趣建模的图神经网络新闻推荐系统
  6. 一般控制矩阵转能控标准型
  7. 【BZOJ2330】【tyvj1785】【codevs2404】糖果,第一次的差分约束
  8. struts2学习笔记(2)
  9. 帧中继多点子接口下配置OSPF
  10. mixin风格的bases class
  11. FunCode---游戏设计之Fireman(火柴人大战)
  12. java代码实现流程中的会签_Activiti实现会签功能
  13. html 调试502谷歌浏览器,谷歌浏览器打不开网页提示Server Error 502 Bad Gateway怎么修复?...
  14. 记一次quartz定时任务不执行排雷
  15. 计算机硬件技术心得,计算机硬件技术基础学习心得.doc
  16. 另一个伊甸 更新进度 23-01-27
  17. MD文本编辑工具推荐-matktext
  18. 头条号《群媒体》,自媒体工作室必看
  19. 悦然插件资源分享:WooCommerce Order Details订单详情插件
  20. 运放-1-理想运放与虚断虚短的来源

热门文章

  1. Python字符串的encode与decode 解决乱码问题
  2. SSM项目使用example查询时多次查询条件相同
  3. Python string生成随机数
  4. 解决挖矿病毒(定时任务、计划任务、系统定时器、定时启动、crontab、入侵)
  5. 函数、迭代器、生成器、装饰器
  6. Zend Studio 13.6.1汉化破解版方法(中文离线包)
  7. 多Kinect下WaitNoneUpdateAll老是报错,烦躁……
  8. 翻译预告 《介绍 GENEVA Beta 1 白皮书》
  9. 史上最全!用Pandas读取CSV,看这篇就够了
  10. Pandas最详细教程来了!