神经网络:caffe特征可视化的代码例子
caffe特征可视化的代码例子
不少读者看了我前面两篇文章
deep learning实践经验总结2--准确率再次提升,到达0.8。再来总结一下
之后。想知道我是怎么实现特征可视化的。
简单来说,事实上就是让神经网络正向传播一次。然后把某层的特征值给取出来。然后转换为图片保存。
以下我提供一个demo,大家能够依据自己的需求改动。
先看看我的demo的用法。
visualize_features.bin net_proto pretrained_net_proto iterations [CPU/GPU] img_list_file dstdir laydepth
visualize_features.bin是cpp编译出来的可运行文件
以下看看各參数的意义:
1 net_proto:caffe规定的一种定义网络结构的文件格式,后缀名为".prototxt"。
这个文件定义了网络的输入,已经相关參数,还有就是总体的网络结构。
2 pretrained_net_proto:这个是已经训练好了的模型
3 iterations:迭代次数
4 [CPU/GPU]:cpu还是gpu模式
5 img_list_file:待測试的文件名称列表。我这里须要这个主要是为了得到图片的类名。
6 dstdir:图片输出的目录
7 laydepth:须要输出哪一层的特征
以下是一个实例样例:
./visualize_features.bin /home/linger/linger/caffe-action/caffe-master/examples/cifar10/cifar10_full_test.prototxt /home/linger/linger/caffe-action/caffe-master/examples/cifar10/cifar10_full_iter_60000
20 GPU /home/linger/linger/testfile/skirt_test_attachment/image_filename /home/linger/linger/testfile/innerproduct/ 7
以下是源码:
// Copyright 2013 Yangqing Jia
//
// This is a simple script that allows one to quickly test a network whose
// structure is specified by text format protocol buffers, and whose parameter
// are loaded from a pre-trained network.
// Usage:
// test_net net_proto pretrained_net_proto iterations [CPU/GPU] #include <cuda_runtime.h>
#include <fstream>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <utility>
#include "caffe/caffe.hpp"
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <opencv2/imgproc/imgproc.hpp> using std::make_pair;
using std::pair;
using namespace caffe; // NOLINT(build/namespaces)
using namespace std; vector<string> fileNames;
char * filelist; /*
* 读入的文件的内容格式相似这样子的:全局id 类名_所在类的id.jpg
0 一步裙_0.jpg
1 一步裙_1.jpg
2 一步裙_10.jpg
*/
void readFile()
{
if(fileNames.empty())
{
ifstream read(filelist);
//"/home/linger/linger/testfile/test_attachment/image_filename"
// "/home/linger/imdata/test_files_collar.txt"
// "/home/linger/linger/testfile/testfilename"
if(read.is_open())
{
while(!read.eof())
{
string name;
int id;
read>>id>>name;
fileNames.push_back(name);
}
}
}
} /*
* 依据图片id获取类名
*/
string getClassNameById(int id)
{
readFile();
int index = fileNames[id].find_last_of('_') ;
return fileNames[id].substr(0, index);
} void writeBatch(const float* data,int num,int channels,int width,int height,int startID,const char*dir)
{
for(int id = 0;id<num;id++)
{
for(int channel=0;channel<channels;channel++)
{
cv::Mat mat(height,width, CV_8UC1);//高宽
vector<vector<float> > vec;
vec.resize(height);
float max = -1;
float min = 999999;
for(int row=0;row<height;row++)
{
vec[row].resize(width);
for(int col=0;col<width;col++)
{
vec[row][col] =
data[id*channels*width*height+channel*width*height+row*width+col];
if(max<vec[row][col])
{
max = vec[row][col];
}
if(min>vec[row][col])
{
min = vec[row][col];
} }
} for(int row=0;row<height;row++)
{
for(int col=0;col<width;col++)
{
vec[row][col] = 255*((float)(vec[row][col]-min))/(max-min);
uchar& img = mat.at<uchar>(row,col);
img= vec[row][col]; }
}
char filename[100];
string label = getClassNameById(startID+id);
string file_reg =dir;
file_reg+="%s%05d_%05d.png";
snprintf(filename, 100, file_reg.c_str(), label.c_str(),startID+id,channel);
//printf("%s\n",filename);
cv::imwrite(filename, mat);
} }
} int main(int argc, char** argv)
{
if (argc < 4)
{
LOG(ERROR) << "visualize_features.bin net_proto pretrained_net_proto iterations "
<< "[CPU/GPU] img_list_file dstdir laydepth";
return 0;
}
/* ./visualize_features.bin /home/linger/linger/caffe-action/caffee-ext/Caffe_MM/prototxt/triplet/triplet_test_simple.prototxt /home/linger/linger/caffe-action/caffee-ext/Caffe_MM/snapshorts/_iter_100000 8 GPU /home/linger/linger/testfile/test_attachment/image_filename /home/linger/linger/testfile/innerproduct/ 6 */ filelist = argv[5];
cudaSetDevice(0);
Caffe::set_phase(Caffe::TEST); if (argc == 5 && strcmp(argv[4], "GPU") == 0)
{
LOG(ERROR) << "Using GPU";
Caffe::set_mode(Caffe::GPU);
}
else
{
LOG(ERROR) << "Using CPU";
Caffe::set_mode(Caffe::CPU);
} NetParameter test_net_param;
ReadProtoFromTextFile(argv[1], &test_net_param);
Net<float> caffe_test_net(test_net_param);
NetParameter trained_net_param;
ReadProtoFromBinaryFile(argv[2], &trained_net_param);
caffe_test_net.CopyTrainedLayersFrom(trained_net_param); int total_iter = atoi(argv[3]);
LOG(ERROR) << "Running " << total_iter << " Iterations."; double test_accuracy = 0;
vector<Blob<float>*> dummy_blob_input_vec; int startID = 0;
int nums;
int dims;
int batchsize = test_net_param.layers(0).layer().batchsize(); int laynum = caffe_test_net.bottom_vecs().size();
printf("num of layers:%d\n",laynum); for (int i = 0; i < total_iter; ++i)
{
const vector<Blob<float>*>& result =
caffe_test_net.Forward(dummy_blob_input_vec); int laydepth = atoi(argv[7]); Blob<float>* features = (*(caffe_test_net.bottom_vecs().begin()+laydepth))[0];//调整第几层就可以 nums = features->num();
dims= features->count()/features->num(); int num = features->num();
int channels = features->channels();
int width = features->width();
int height = features->height();
printf("channels:%d,width:%d,height:%d\n",channels,width,height);
writeBatch(features->cpu_data(),num,channels,width,height,startID,argv[6]);
startID += nums; } return 0;
}
神经网络:caffe特征可视化的代码例子的更多相关文章
- caffe net 可视化工具,,层特征可视化
1.只用网络在线结构绘制可视化网络模型 http://ethereon.github.io/netscope/#/editor 将对应的网络输入到里面,然后按shift+enter即可查看对应的网络结 ...
- 深度学习之卷积神经网络(CNN)详解与代码实现(一)
卷积神经网络(CNN)详解与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10430073.html 目 ...
- 《神经网络的梯度推导与代码验证》之CNN的前向传播和反向梯度推导
在FNN(DNN)的前向传播,反向梯度推导以及代码验证中,我们不仅总结了FNN(DNN)这种神经网络结构的前向传播和反向梯度求导公式,还通过tensorflow的自动求微分工具验证了其准确性.在本篇章 ...
- HOG特征原理及代码实现
HOG特征原理 HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子. 它通过计算和统计 ...
- 《神经网络的梯度推导与代码验证》之FNN(DNN)前向和反向过程的代码验证
在<神经网络的梯度推导与代码验证>之FNN(DNN)的前向传播和反向梯度推导中,我们学习了FNN(DNN)的前向传播和反向梯度求导,但知识仍停留在纸面.本篇章将基于深度学习框架tensor ...
- 《神经网络的梯度推导与代码验证》之CNN前向和反向传播过程的代码验证
在<神经网络的梯度推导与代码验证>之CNN的前向传播和反向梯度推导 中,我们学习了CNN的前向传播和反向梯度求导,但知识仍停留在纸面.本篇章将基于深度学习框架tensorflow验证我们所 ...
- 《神经网络的梯度推导与代码验证》之vanilla RNN的前向传播和反向梯度推导
在本篇章,我们将专门针对vanilla RNN,也就是所谓的原始RNN这种网络结构进行前向传播介绍和反向梯度推导.更多相关内容请见<神经网络的梯度推导与代码验证>系列介绍. 注意: 本系列 ...
- 30个php操作redis常用方法代码例子
From: http://www.jb51.net/article/51884.htm 这篇文章主要介绍了30个php操作redis常用方法代码例子,本文其实不止30个方法,可以操作string类型. ...
- 30 个 php 操作 redis 常用方法代码例子
这篇文章主要介绍了 30 个 php 操作 redis 常用方法代码例子 , 本文其实不止 30 个方法 , 可以操作 string 类型. list 类型和 set 类型的数据 , 需要的朋友可以参 ...
随机推荐
- 开源项目DataTimePicker实现时间和日期的选择
这个开源项目是模仿Google官方的time选择器做的,是否漂亮.让我爱不释手,真心喜欢.很有幸和大家一起分享下,那么话不多说开始讲解. 开源项目地址:https://github.com/fl ...
- attrs.xml中declare-styleable 详解(用于自定义控件的属性)
1. 框架定义: <declare-styleable name = "名称"> <attr name = "……" format = &qu ...
- 摩拜单车模式优于OFO双向通信才能被认可
马化腾 :摩拜单车模式优于OFO双向通信才能被认可 2017-06-20 00:12 最近共享单车里最头条的新闻是 悟空单车宣布退出竞争,并全部退还投资款和押金以及余额.运营才5个月,成为第一家倒下的 ...
- [转]php curl经典最常用的5个例子
转自: http://www.jb100.net/html/content-22-821-1.html php curl常用的5个例子 我用php ,curl主要是抓取数据,当然我们可以用其他的方法来 ...
- img设置默认图片最简单的解决方法
<img src='图片的路径' onerror='this.src="如果图片不存在,则使用该图片"' 这个解决方法除了简单外,还有一个优点. 就是当你不知道图片是否存在, ...
- Oracle简单的备份和恢复-导出和导入(1)
ylbtech-Oracle:Oracle简单的备份和恢复-导出和导入(1) Oracle简单的备份和恢复-导出和导入 1. 用户导出自己的表(emp,dept)返回顶部 1.1, 我们启动Oracl ...
- %date~0,4%和 %time~0,2%等用法详解(转)
比如在windowscmd命令行窗口执行date命令后这个环境变量的值为当前日期:2014-09-01 星期六 或2014/09/01 周六那么如下的各个操作的意义如下:%date:~0,4% 表示从 ...
- C#与Visual Basic的异与同
C#是一种高级程序设计语言,是一种安全.稳定.简单.优雅的编程语言,它与Visual Basic有很多相同的地方,同时也有很多不同的地方.我们今天这篇博客本着学习C#的原则,着重介绍一下C#与Visu ...
- 【大数据】MongoDB安装(转)
https://note.youdao.com/share/?id=40be7f77434910e8860c5fd1ef5d24fe&type=note#/ MongoDB安装 环境 Cent ...
- Eclipse中GitLab的配置和使用入门
一.Eclipse中配置GitLab的前提条件 1.1:安装Git客户端 去官网https://git-scm.com/downloads下载合适的版本即可,一般开发环境是windows的就下载win ...