上一篇博客,介绍了怎么对训练好的model的各层权重可视化,这篇博客,我们介绍测试图片输入网络后产生的特征图的可视化

记得上篇中,我们是写了一个新的文件test.cpp,然后编译运行那个文件的,这是因为权重可视化,是不需要网络的前向传播,只要加载model就好了,而我们如果需要可视化特征图,那就必须进行网络的前向传播了,所以,这次,我们对caffe根目录下的examples/cpp_classification/classification.cpp文件基础上,进行修改,添加我们自己需要的功能(可视化),同样的,我们把这个文件拷贝过来,放在自己的某个文件夹下,假设取名依然为test.cpp,而我们要修改的,就是Predict函数,定位到Predict函数,在net_->Forward();后面加入以下代码:

  1. //打印出一张图片经过网络各层产出的各层输出

  2. cout<<"网络中的Blobs名称为:\n";

  3. vector<shared_ptr<Blob<float> > > blobs=net_->blobs(); //得到各层的输出特征向量

  4. vector<string> blob_names=net_->blob_names(); //各层的输出向量名字

  5. cout<<blobs.size()<<" "<<blob_names.size()<<endl;

  6. for(int i=0;i<blobs.size();i++){

  7. cout<<blob_names[i]<<" "<<blobs[i]->shape_string()<<endl;

  8. }

  9. cout<<endl;

编译该文件,编译命令参照上一篇博客,此时会打印出如下信息

  1. 网络中的Blobs名称为:

  2. 15 15

  3. data 1 3 227 227 (154587)

  4. conv1 1 96 55 55 (290400)

  5. pool1 1 96 27 27 (69984)

  6. norm1 1 96 27 27 (69984)

  7. conv2 1 256 27 27 (186624)

  8. pool2 1 256 13 13 (43264)

  9. norm2 1 256 13 13 (43264)

  10. conv3 1 384 13 13 (64896)

  11. conv4 1 384 13 13 (64896)

  12. conv5 1 256 13 13 (43264)

  13. pool5 1 256 6 6 (9216)

  14. fc6 1 4096 (4096)

  15. fc7 1 4096 (4096)

  16. fc8 1 1000 (1000)

  17. prob 1 1000 (1000)

可以看到,此时将每个层的输出特征图的维度信息都打印出来了,比如data层的输出是1 3 227 277,因为网络的输入图片是1个,3通道,尺寸是227*227;经过conv1层的输出是1 96 55 55,因为conv1层有96个卷积核,卷积核大小为11*11,步长为4,所以其输出的每个特征图的尺寸为(227-11)/4+1=55,所以特征图的尺寸也对应着1 96 55 55.

好了,我们接下来再输入一下代码,进行对经过conv1的特征图可视化,其尺寸是1 96 55 55,也就看出是96个55*55大小的灰度图

  1. //将测试图片经过第一个卷积层的特征图可视化

  2. string blobName="conv1"; //我们取经过第一个卷积层的特征图

  3. assert(net_->has_blob(blobName)); //为免出错,我们必须断言,网络中确实有名字为blobName的特征图

  4. shared_ptr<Blob<float> > conv1Blob=net_->blob_by_name(blobName); //1*96*55*55 断言成功后,按名字返回该 特征向量

  5. cout<<"测试图片的特征响应图的形状信息为:"<<conv1Blob->shape_string()<<endl; //打印输出的特征图的形状信息

  6. //和前面的博客一样,此时的特征向量是经过了ReLU激活函数的,范围在0~无穷大,我们为了可视化,仍然需要归一化到0~255

  7. //下面的代码,跟上一篇博客中是一样的

  8. float maxValue=-10000000,minValue=10000000;

  9. const float* tmpValue=conv1Blob->cpu_data();

  10. for(int i=0;i<conv1Blob->count();i++){

  11. maxValue=std::max(maxValue,tmpValue[i]);

  12. minValue=std::min(minValue,tmpValue[i]);

  13. }

  14. int width=conv1Blob->shape(2); //响应图的宽度

  15. int height=conv1Blob->shape(3); //响应图的高度

  16. int num=conv1Blob->shape(1); //个数

  17. int imgHeight=(int)(1+sqrt(num))*height;

  18. int imgWidth=(int)(1+sqrt(num))*width;

  19. Mat img2(imgHeight,imgWidth,CV_8UC1,Scalar(0)); //此时,应该是灰度图

  20. int kk=0;

  21. for(int x=0;x<imgHeight;x+=height){

  22. for(int y=0;y<imgWidth;y+=width){

  23. if(kk>=num)

  24. continue;

  25. Mat roi=img2(Rect(y,x,width,height));

  26. for(int i=0;i<height;i++){

  27. for(int j=0;j<width;j++){

  28. float value=conv1Blob->data_at(0,kk,i,j);

  29. roi.at<uchar>(i,j)=(value-minValue)/(maxValue-minValue)*255;

  30. }

  31. }

  32. kk++;

  33. }

  34. }

  35. resize(img2,img2,Size(500,500));//进行显示

  36. imshow("2",img2);

  37. waitKey(0);

输入图片

特征图

会了这一点后,大家如果想将CNN单纯的当做特征提取器,可以将第一个全连接层的前一层的输出特征向量(比如这个网络,是pool5层的输出特征1*256*6*6=9216)提取出来,这是该图片经过CNN后的最初步的特征,当然如果觉得维度高,也可以提取出第一个全连接层的特征向量,这里是4096维,然后再送进泛化性能更好的分类器(如SVM)去分类识别,我用提取第一个全连接层的4096维特征试验了下SVM,在线性核下,分类效果大致相当。大家可以根据自己的需求去尝试。

caffe之特征图可视化及特征提取相关推荐

  1. caffe for windows的matlab接口(四):权重和特征图可视化的一个例子

    模型读取 参照三,想实现一个自己图像的可视化过程: 首先我发现自己训练出的model没有deploy文件.查阅了下:"如果要把训练好的模型拿来测试新的图片,那必须得要一个deploy.pro ...

  2. 收藏 | PyTorch模型训练特征图可视化(TensorboardX)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者丨Pa ...

  3. 卷积神经网络特征图可视化及其意义

    文章目录 特征图可视化方法 1. tensor->numpy->plt.save 2. register_forward_pre_hook函数实现特征图获取 3. 反卷积可视化 特征图可视 ...

  4. 深度学习网络和特征图可视化的工具介绍

    1.深度学习网络结构画图工具: 网络结构画图工具https://cbovar.github.io/ConvNetDraw/ 输入:层信息 输出:网络结构图 网络结构图实例 2.caffe可视化工具 输 ...

  5. CNN神经网络猫狗分类经典案例,深度学习过程中间层激活特征图可视化

    AI:CNN神经网络猫狗分类经典案例,深度学习过程中间层激活特征图可视化 基于前文 https://zhangphil.blog.csdn.net/article/details/103581736 ...

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

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

  7. yolov5特征图可视化

    文章目录 前言 一.效果图 二.使用步骤 1.使用方法 2.注意事项 总结 参考 前言 最近写论文需要观察中间特征层的特征图,使用的是yolov5的代码仓库,但是苦于找不到很好的轮子,于是参考了很多, ...

  8. 卷积神经网络特征图可视化热图可视化

    文章目录 前言 一.可视化特征图 二.热力图可视化(图像分类) 总结 前言 使用pytorch中的钩子将特征图和梯度勾出来,从而达到可视化特征图(featuremap)和可视化热图(heatmap)的 ...

  9. 【总结】Keras+VGG16特征图可视化,帮助你深入理解VGG16

    Keras+VGG16特征图可视化 一.VGG16结构理解 1. 可视化结构图 2. VGGNet各级别网络结构图 3. VGG16网络结构图 二.Keras实现VGG16 代码实现 三.VGG16特 ...

最新文章

  1. 在XML布局里给View设置点击事件
  2. Hbase的学习笔记(1)
  3. 利用C#进行Socket通信编程之二:一个实例
  4. sizeof与strlen使用中的问题
  5. CSS-标准盒模型和怪异盒模型box-sizing
  6. 计算机2级c 语言题库,计算机2级C语言题库.doc
  7. antv g6 禁止移动_十 AntV
  8. 计算机网络工程税收分类编码,工程款税收分类编码
  9. Windows内核原理与实现之Windows研究内核(WRK)
  10. 8.23打架学习一个
  11. 逻辑删除数据库中的数据。
  12. CSS常用定位方法(绝对定位、相对定位、固定定位)
  13. python 千位分隔符_千位分隔符的完整攻略
  14. SOCK_STREAM与SOCK_DGRAM套接口类型
  15. cadence 通孔焊盘_过孔上焊盘,电源笑开颜
  16. CSS设置html网页背景图片 CSS设置网页背景颜色
  17. 『ACM』ACM部分训练日记(以此纪念和队友与FLS一起度过的快乐时光)
  18. Android自定义控件入门到精通--Region区域
  19. 网易考拉卖身阿里的前夜:HR欲哭无泪,太难了。
  20. QQ2006beta2sp3forsp1的下载地址

热门文章

  1. boost::statechart模块实现无效结果复制测试
  2. boost::signals2::deconstruct 作为构建后的工厂函数的测试程序
  3. boost::advance用法的测试程序
  4. boost::geometry::dot_product用法的测试程序
  5. boost::fibers模块实现single stream的测试程序
  6. boost::exception_test::throw_test_exception<T>的测试程序
  7. boost::describe模块宏BOOST_DESCRIBE_PP_POINTER的测试程序
  8. Boost:异步操作,需要boost :: asio :: async_initiate函数的测试程序
  9. Qt Creator设置Meson
  10. QT实现PhotoSurface