神经网络:caffe特征可视化的代码样例

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特征可视化的代码样例,布布扣,bubuko.com

时间: 2024-10-05 03:44:33

神经网络:caffe特征可视化的代码样例的相关文章

zookeeper实战:SingleWorker代码样例

们需要一个“单点worker”系统,此系统来确保系统中定时任务在分布式环境中,任意时刻只有一个实例处于活跃:比如,生产环境中,有6台机器支撑一个应用,但是一个应用中有30个定时任务,这些任务有些必须被在“单线程”环境中运行(例如“数据统计”任务),避免并发的原因不是在java层面,可能是在操作db数据时,或者是在消息消费时,或者是信息推送时等.某个指标的“数据统计”任务,每天只需要执行一次,即使执行多次也是妄费,因为这种类型的定时任务,需要被“单点”.同时,如果一个任务在没有报告结果的情况下异常

java的二重循环代码样例

1.计算三个班的平均分 import java.util.Scanner; public class AvgScore{ public static void main (Sting[] args){ int[] score = new int[]; //成绩数组 int classNum = 3;        //班级数量 double sun = 0.0;       //成绩总和 double[] average = new  double[classNum];//平均成绩数组 //循环

Java操作HDFS代码样例

代码在GitHub上. 包括如下几种样例代码: 新建文件夹 删除文件/文件夹 重命名文件/文件夹 查看指定路径下的所有文件 新建文件 读文件 写文件 下载文件至本地 上传本地文件 https://github.com/quchunhui/tod-train-1.0/tree/master/hadoop/src/main/java/hdfs 原文地址:https://www.cnblogs.com/quchunhui/p/9112510.html

Python代码样例列表

├─algorithm│       Python用户推荐系统曼哈顿算法实现.py│      NFA引擎,Python正则测试工具应用示例.py│      Python datetime计时程序的实现方法.py│      python du熊学斐波那契实现.py│      python lambda实现求素数的简短代码.py│      Python localtime()方法计算今天是一年中第几周.py│      Python math方法算24点代码详解.py│      Pyth

10个超级有用、必须收藏的PHP代码样例

作为一个正常的程序员,会好几种语言是十分正常的,相信大部分程序员也都会编写几句PHP程序,如果是WEB程序员,PHP一定是必备的,即使你没用它开发过大型软件项目,也一定多少了解它的语法. 尽管PHP经常被人诟病,被人贬低,被人当玩笑开,事实证明,PHP是全世界网站开发中使用率最高的编程语言.PHP最大的缺点是太简单,语法不严谨,框架体系很弱,但这也是它最大的优点,一个有点编程背景的普通人,只需要学习PHP半天时间,就可以上手开始开发web应用了. 网上有人总结几种编程语言的特点,我觉得也挺有道理

Java中23种设计模式(附代码样例)

一.设计模式分类总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式.结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式.行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式.其实还有两类:并发型模式和线程池模式 二.设计模式的六大原则1.开闭原则(Open Close Principle)开闭原则就是说对

XPath JAVA用法总结及代码样例

一.基本概念介绍 XPath 是一门在 XML 文档中查找信息的语言, 可用来在 XML 文档中对元素和属性进行遍历.XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 同时被构建于 XPath 表达之上.因此,对 XPath 的理解是很多高级 XML 应用的基础.    XPath非常类似对数据库操作的SQL语言,或者说JQuery,它可以方便开发者抓起文档中需要的东西.(dom4j也支持xpath 1.节点类型 XPath中有七种结点类型:元素.属性.

三个PHP常用代码样例

作为一个正常的程序员,会好几种语言是十分正常的,相信大部分程序员也都会编写几句PHP程序,如果是WEB程序员,PHP一定是必备的.尽管PHP经常被人诟病,被人贬低,被人当玩笑开,事实证明,PHP是全世界网站开发中使用率最高的编程语言.PHP最大的缺点是太简单,语法不严谨,框架体系很弱,但这也是它最大的优点. 网上有人总结几种编程语言的特点: PHP 就是: Quick and Dirty Java 就是: Beauty and Slowly Ruby 就是: Quick and Beauty p

SCALA中的抽象类代码样例

package com.hengheng.scala class AbstractClass { } abstract class People { def speak val name : String var age : Int } class Worker extends People { def speak { println("Hello, Worker!!!") } val name = "Rocky" var age = 27 } object Abs