借助Keras和Opencv实现的神经网络中间层特征图的可视化功能,方便我们研究CNN这个黑盒子里到发生了什么。

自定义网络特征可视化

代码:

# coding: utf-8

from keras.models import Model
import cv2
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers.convolutional import Convolution2D,MaxPooling2D
from keras.layers import Activation
from pylab import *
import keras def get_row_col(num_pic):
squr = num_pic ** 0.5
row = round(squr)
col = row + 1 if squr - row > 0 else row
return row,col def visualize_feature_map(img_batch):
feature_map = np.squeeze(img_batch,axis=0)
print feature_map.shape feature_map_combination=[]
plt.figure() num_pic = feature_map.shape[2]
row,col = get_row_col(num_pic) for i in range(0,num_pic):
feature_map_split=feature_map[:,:,i]
feature_map_combination.append(feature_map_split)
plt.subplot(row,col,i+1)
plt.imshow(feature_map_split)
axis('off')
title('feature_map_{}'.format(i)) plt.savefig('feature_map.jpg')
plt.show() # 各个特征图按1:1 叠加
feature_map_sum = sum(ele for ele in feature_map_combination)
plt.imshow(feature_map_sum)
plt.savefig("feature_map_sum.jpg") def create_model():
model = Sequential() # 第一层CNN
# 第一个参数是卷积核的数量,第二三个参数是卷积核的大小
model.add(Convolution2D(9, 5, 5, input_shape=img.shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(4, 4))) #第二层CNN
model.add(Convolution2D(9, 5, 5, input_shape=img.shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3, 3))) # 第三层CNN
model.add(Convolution2D(9, 5, 5, input_shape=img.shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2))) # 第四层CNN
model.add(Convolution2D(9, 3, 3, input_shape=img.shape))
model.add(Activation('relu'))
# model.add(MaxPooling2D(pool_size=(2, 2))) return model if __name__ == "__main__": img = cv2.imread('001.jpg') model = create_model() img_batch = np.expand_dims(img, axis=0)
conv_img = model.predict(img_batch) # conv_img 卷积结果 visualize_feature_map(conv_img)

这里定义了一个4层的卷积,每个卷积层分别包含9个卷积、Relu激活函数和尺度不等的池化操作,系数全部是随机初始化。

输入的原图如下:

第一层卷积后可视化的特征图:

所有第一层特征图1:1融合后整体的特征图:

第二层卷积后可视化的特征图:

所有第二层特征图1:1融合后整体的特征图:

第三层卷积后可视化的特征图:

所有第三层特征图1:1融合后整体的特征图:

第四层卷积后可视化的特征图:

所有第四层特征图1:1融合后整体的特征图:

从不同层可视化出来的特征图大概可以总结出一点规律:

  • 1. 浅层网络提取的是纹理、细节特征
  • 2. 深层网络提取的是轮廓、形状、最强特征(如猫的眼睛区域)
  • 3. 浅层网络包含更多的特征,也具备提取关键特征(如第一组特征图里的第4张特征图,提取出的是猫眼睛特征)的能力
  • 4. 相对而言,层数越深,提取的特征越具有代表性
  • 5. 图像的分辨率是越来越小的

VGG19网络特征可视化

代码:

# coding: utf-8
from keras.applications.vgg19 import VGG19
from keras.preprocessing import image
from keras.applications.vgg19 import preprocess_input
from keras.models import Model
import numpy as np
import matplotlib.pyplot as plt
from pylab import * def get_row_col(num_pic):
squr = num_pic ** 0.5
row = round(squr)
col = row + 1 if squr - row > 0 else row
return row,col def visualize_feature_map(img_batch):
feature_map = img_batch
print feature_map.shape feature_map_combination=[]
plt.figure() num_pic = feature_map.shape[2]
row,col = get_row_col(num_pic) for i in range(0,num_pic):
feature_map_split=feature_map[:,:,i]
feature_map_combination.append(feature_map_split)
plt.subplot(row,col,i+1)
plt.imshow(feature_map_split)
axis('off') plt.savefig('feature_map.jpg')
plt.show() # 各个特征图按1:1 叠加
feature_map_sum = sum(ele for ele in feature_map_combination)
plt.imshow(feature_map_sum)
plt.savefig("feature_map_sum.jpg") if __name__ == "__main__":
base_model = VGG19(weights='imagenet', include_top=False)
# model = Model(inputs=base_model.input, outputs=base_model.get_layer('block1_pool').output)
# model = Model(inputs=base_model.input, outputs=base_model.get_layer('block2_pool').output)
# model = Model(inputs=base_model.input, outputs=base_model.get_layer('block3_pool').output)
# model = Model(inputs=base_model.input, outputs=base_model.get_layer('block4_pool').output)
model = Model(inputs=base_model.input, outputs=base_model.get_layer('block5_pool').output) img_path = '001.jpg'
img = image.load_img(img_path)
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
block_pool_features = model.predict(x)
print(block_pool_features.shape) feature = block_pool_features.reshape(block_pool_features.shape[1:]) visualize_feature_map(feature)

从第一到第五层的特征图分别如下:

从第一层到第五层各特征图按1:1比例融合后特征依次为:

卷积神经网络特征图可视化(自定义网络和VGG网络)的更多相关文章

  1. CNN可视化技术总结(一)--特征图可视化

    导言: 在CV很多方向所谓改进模型,改进网络,都是在按照人的主观思想在改进,常常在说CNN的本质是提取特征,但并不知道它提取了什么特征,哪些区域对于识别真正起作用,也不知道网络是根据什么得出了分类结果 ...

  2. Keras中间层输出的两种方式,即特征图可视化

    训练好的模型,想要输入中间层的特征图,有两种方式: 1. 通过model.get_layer的方式.创建新的模型,输出为你要的层的名字. 创建模型,debug状态可以看到模型中,base_model/ ...

  3. GhostNet: 使用简单的线性变换生成特征图,超越MobileNetV3的轻量级网络 | CVPR 2020

    为了减少神经网络的计算消耗,论文提出Ghost模块来构建高效的网络结果.该模块将原始的卷积层分成两部分,先使用更少的卷积核来生成少量内在特征图,然后通过简单的线性变化操作来进一步高效地生成ghost特 ...

  4. 跟我学算法-图像识别之图像分类(上)(基础神经网络, 卷积神经网络(CNN), AlexNet,NIN, VGG)

    1.基础神经网络: 输入向量x,权重向量w, 偏置标量b, 激活函数sigmoid(增加非线性度) 优化手段: 梯度下降优化, BP向后传播(链式规则) 梯度下降优化: 1. 使用得目标函数是交叉熵  ...

  5. 卷积神经网络(CNN)在语音识别中的应用

    前言 总结目前语音识别的发展现状,dnn.rnn/lstm和cnn算是语音识别中几个比较主流的方向.2012年,微软邓力和俞栋老师将前馈神经网络FFDNN(Feed Forward Deep Neur ...

  6. pytorch中网络特征图(feture map)、卷积核权重、卷积核最匹配样本、类别激活图(Class Activation Map/CAM)、网络结构的可视化方法

    目录 0,可视化的重要性: 1,特征图(feture map) 2,卷积核权重 3,卷积核最匹配样本 4,类别激活图(Class Activation Map/CAM) 5,网络结构的可视化 0,可视 ...

  7. visualization of filters keras 基于Keras的卷积神经网络(CNN)可视化

    https://adeshpande3.github.io/adeshpande3.github.io/ https://blog.csdn.net/weiwei9363/article/detail ...

  8. [DeeplearningAI笔记]卷积神经网络2.2经典网络

    4.2深度卷积网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 [LeNet]--Lécun Y, Bottou L, Bengio Y, et al. Gradient-bas ...

  9. PyTorch基础——使用卷积神经网络识别手写数字

    一.介绍 实验内容 内容包括用 PyTorch 来实现一个卷积神经网络,从而实现手写数字识别任务. 除此之外,还对卷积神经网络的卷积核.特征图等进行了分析,引出了过滤器的概念,并简单示了卷积神经网络的 ...

随机推荐

  1. idea 的一些基本的配置

    1. 2. 3. http://139.199.89.239:1008/88414687-3b91-4286-89ba-2dc813b107ce 531403098@qq.com R+0oOAb3rx ...

  2. zzw原创_非root用户下安装nginx

    想自己安装nginx,又不相用到root用户. 非root用户下(本文为用户bdctool)来ngnix安装,要依赖pcre库.zlib库等, 1. 下载依赖包:下载地址 pcre(www.pcre. ...

  3. canal demo搭建全记录

    一.环境介绍 canal是阿里开源的中间件,主要用于同步mysql数据库变更.具体参见:https://github.com/alibaba/canal/releases 搭建环境: vmware c ...

  4. ORACLE相关函数使用总结

    1. 2018年12月12日 12时12分  这种时间格式怎么转成2018-12-12 12:12  解决: select regexp_replace(regexp_replace('2009年6月 ...

  5. 略解TCP乱序和丢包

    在使用基于TCP实现的各种组件的时候,我们经常会处理数据包.这数据包说来奇怪,从来不会丢失,也不会乱序,只会产生粘包.底层的机制是如何实现的呢?进来我们就来用简洁易懂的文字描述清楚. 在TCP数据包设 ...

  6. Linux中安装tomcat后,window中访问不到tomcat的欢迎界面问题

    首先,可以通过xftp把下载的tomcat的tar.gz包传输到Linux中. 然后进行解压,tar -zxvf   tomcat的压缩包名称(可以使用tab键快速补齐) 解压后,可以使用修改/con ...

  7. 设计模式之Factory模式(C++)

    Factory模式具有两大重要的功能: (1).定义创建对象的接口,封装了对象的创建: (2).使具体化类工作延迟到了子类中. //Product.h #ifndef _PRODUCT_H_ #def ...

  8. 开个小灶——turtle 海龟图形

    turtle 海龟图形 turtle数据库是python语言中最流行的绘制函数图形的数据库,绘制笔头像个小海龟,因此一般称为 海龟图形.海龟数据库的导入   import turtle 1 画布大小设 ...

  9. linux常用命令 awk命令

    awk命令 awk [选项] '条件1{动作1} 条件2{动作2}...' 文件名 条件(Pattern) *) 一般使用关系表达式作为条件 *) x>10 判断变量x是否大于10 *) x&g ...

  10. 信用卡欺诈数据的分析-excel篇

    本篇文章为大家提供了数据集分析的思路和步骤,同时也分享了自己的经验. 一.背景 反欺诈是一项识别服务,是对交易诈骗.网络诈骗.电话诈骗.盗卡盗号等行为的一项风险识别.其核心是通过大数据的收集.分析和处 ...