从T7模型中取训练参数_而 vgg_normalised.t7 转化不了-程序员宅基地

技术标签: 从torch t7模型中取训练数据  风格转换  

上一章中,我们已经取出层名,层名和层名之间,是存放参数的空间,这样相当于已经给模型分了层。

我们只要在层间搜索参数就可以了。


第2步:搜索参数

以卷积层为例:

if(startsWith(TorchClassName,"nn.SpatialConvolution"))
{

	const char *findstr[] = {
		"name", //名称
		"dW", "dH", //步长
		"kW", "kH", //核宽
		"weight", "bias", //权重,偏移
		"padW", "padH", //补边(2参数)
		"pad_l", "pad_r", "pad_t", "pad_b", //补边(4参数)
		"nInputPlane", "nOutputPlane", //输入、输出维度
		NULL};

	fpos = ftell(m_FilePointer);//记录层开头位置(在文件中)。
	for (int i = 0; findstr[i]; i++)
	{
			
		fout<<findstr[i]<<":"<<endl;

		bool ret=false;
		while(!ret){
			ret=跳到某字符串位置后(findstr[i]); //注意不要跑到下一层去
			if(ret)
				ret=readObject(fout);//这里的一些函数可以从OpenCV稍稍修改而来
		}


		fseek(m_FilePointer, fpos,SEEK_SET);//回到开头位置后再搜索
	}

}

上面我们已经把所有参数都保存到一个文件中了。

这里,我们的目的不是拿出所有参数,我们只要拿出卷积层的训练参数 weight,bias,其它在训练前就知道的就不用了

按OpenCV的代码分析几个t7模型,

存放方式分两种,1是统一存放,另1是分别存入

T7存放方式按:数据首址,数据偏移,数据类型

这里就有两种取法,

1。取数据(OpenCV方式)

2。取地址(=数据首址+数据偏移x sizeof(数据类型))

取地址方式应该灵活一点

取数据偏移:

void readTorchTensor(ofstream &fout, int typeTensor,const char * ch_str)
{
    int ndims = readInt();
    my_readLongRaw(fout, ndims);//读取长原始数据//THFile_readLongRaw
    my_readLongRaw(fout, ndims);

    int64_t offset = readLong() - 1;

	fout<<"偏移:"<<offset<<endl;
	if(this_norm_conv==is_conv)
	{
		if(strcmp(ch_str,"weight")==0)
		
			*file_data_offset.weight_offset =(long)offset;//权重数据偏移 <--这里
		else if(strcmp(ch_str,"bias")==0)
			*file_data_offset.bias_offset =(long)offset;//偏移数据偏移 <--这里
	}
    //read Storage
    int typeidx = readInt();
		
	//fout<<"typeidx:"<<typeidx<<endl;

    assert(typeidx == TYPE_TORCH || (typeidx == TYPE_NIL && ndims == 0));

    if (typeidx == TYPE_NIL)
    {
        return;
    }

    int indexStorage = readInt();
    {
        string className = readTorchClassName();
	fout<<"className:"<<className<<endl;

        int typeStorage = parseStorageType(className);
        readTorchStorage(fout, typeStorage);
    }

}

 

取首址和类型:

void my_readDoubleRaw(ofstream &fout, int64_t size)
{
	//double data;
	fout<<"尺寸:"<<size<<endl;
	fout<<"地址:"<<ftell(m_FilePointer)<<endl;
	if(this_norm_conv==is_conv)
		file_data_offset.data_offset=ftell(m_FilePointer);//数据首址 <--这里
		
	file_data_offset.data_type=sizeof(double);//数据类型 <--这里
  //  for (int64_t i = size - 1; i >= 0; i--)
  //  {
 	//	fread(&data, sizeof(double), 1, m_FilePointer);   
		//fout<<data<<' ';
  //  }fout<<endl;
}

void my_readFloatRaw(ofstream &fout, int64_t size)
{
	//float data;
	fout<<"尺寸:"<<size<<endl;
	fout<<"地址:"<<ftell(m_FilePointer)<<endl;
	if(this_norm_conv==is_conv)
		file_data_offset.data_offset=ftell(m_FilePointer);//数据首址 <--这里
	if(this_norm_conv==is_norm)
		file_InstanceNormalization_data_offset.data_offset=ftell(m_FilePointer);
	if(this_norm_conv==is_batchnorm)
		file_SpatialBatchNormalization_data_offset.data_offset=ftell(m_FilePointer);
		
	file_data_offset.data_type=sizeof(float);//数据类型 <--这里

  //  for (int64_t i = size - 1; i >= 0; i--)
  //  {
 	//	fread(&data, sizeof(float), 1, m_FilePointer);   
		//fout<<data<<' ';
  //  }fout<<endl;
}

这些函数都是从OpenCV中抄过来再稍改改, my_ 对应 THFile_

然后组合:

// 还要加上文件位置
if(strcmp(ch_str,"weight")==0)
{
	*file_data_offset.weight_offset   *= file_data_offset.data_type;//乘 类型 <--这里
	*file_data_offset.weight_offset++ += file_data_offset.data_offset;//加 数据首址 <--这里
}
else if(strcmp(ch_str,"bias")==0)
{
	*file_data_offset.bias_offset   *= file_data_offset.data_offset;
	*file_data_offset.bias_offset++ += file_data_offset.data_offset;
}

这里用到地址池:

struct Data位置
{
	long data_offset;
	long * weight_offset;
	long * bias_offset;
	int data_type;

		
	//构造函数
	Data位置();

};

Data位置::Data位置()
{
	data_offset=0;
	weight_offset=NULL;
	bias_offset=NULL;
	data_type=0;
}

Data位置 file_data_offset;

使用时用:

long *weight_offset=new long[2+2+4+1 ];
long *bias_offset=new long[2+2+4+1 ];
	string pathname ="D:/3D/cv33/cv33/AdaIN-style-master/models/";
	string torch_model_name	="vgg_normalised.t7";
							
							//decoder-content-similar 解码器颜色和内容相似
							//decoder
	pathname += torch_model_name;

loadModel_data_offset(pathname,weight_offset,bias_offset);

loadModel_data_offset函数:

void 	loadModel_data_offset(string torch_model_name,long * weight_offset,long * bias_offset)
{
	file_data_offset.weight_offset=weight_offset;
	file_data_offset.bias_offset=bias_offset;
	readModel(torch_model_name);

}

这样就已经从t7模型取出训练数据了。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/juebai123/article/details/87161477

智能推荐

【计算机组成实验】四位加法器_四位串行进位加法器-程序员宅基地

文章浏览阅读7.5k次,点赞2次,收藏34次。并行地形成各级进位,各进位之间不存在依赖关系,因而这种方式也称为先行进位、同时进位或跳跃进位。_四位串行进位加法器

selenium对元素进行操作(三):日期控件处理_selenium日期控件处理-程序员宅基地

文章浏览阅读7.6k次,点赞3次,收藏36次。1分钟了解一个测开小知识:selenium对元素进行操作(三):日期控件处理如果日期控件支持输入,可以直接使用send_keys,按照文本框录入时间。但是大多数日期控件,都是这种格式<input type="text" autocomplete="off" readonly="readonly" placeholder="选择日期" class="aty-input aty-input-hasicon">控件的html描述是这样婶的。可以看到readonly="r_selenium日期控件处理

华为软开云新手使用过程-程序员宅基地

文章浏览阅读2.2k次。我们公司说是小公司,老板说每年资金进场很大,说是大公司,来来回回,人的流动性挺高的。公司有从华为出来的"大牛",姑且称之为大牛吧,说要为了规范我们项目开发的流程和代码的质量,极力推荐使用软开云。本人也是一头雾水,因为野惯了,还真不习惯,找了不少资料,终于部署成功和拉取和上传代码了。工作里面的需求什么的略过...1.代码要上传,需要先建立一个仓库,点击下面的代码托管,再点击普通新建,为什..._软开云

计算机网络基础知识点-程序员宅基地

文章浏览阅读7k次,点赞5次,收藏54次。1.网络介绍由通信介质将地理位置不同、相互独立的计算机连接起来,实现数据和资源共享。2.网络分类2.1 按照拓扑结构分类1.总线型(一根线上串好多计算机)特点:两端信号终结器,分叉处有T型头2.环形网络效率很低,同一时间只有两个计算机通信,这两台计算机有其自己的令牌。3.星形线路利用率虽然高,但是线路单一,一旦坏了就少了一条线路。且中央节点压力大。 单点护照网络利用率高,但是中央节点压力大。2.2 按照地域分类1.局域网一个公司、一个家庭2.城域网一个区、一个城市、一个国家_计算机网络基础知识点

超声波指纹识别技术_超声指纹识别原理-程序员宅基地

文章浏览阅读5.9k次,点赞2次,收藏15次。前言: 2015年,整个超声技术界最引人注目的事情莫过于高通推出了超声波指纹识别技术Sense ID,而小米手机也成功搭载了这一项黑科技。自上世纪五十年代全国超声热之后,超声技术终于有机会成为大众话题之一超声检测技术基础之基础 绝大多数超声波的检测技术原理都基于pulse-echo——你在山谷里喊一声就是pulse, 被岩壁或者树反射回来的回声就是echo。 对于超声检测而言,特制的晶_超声指纹识别原理

真正搞懂hashCode和hash算法_浅显理解 hashcode 和 hash 算法-程序员宅基地

文章浏览阅读3.1w次,点赞417次,收藏1.4k次。自从搞懂hash,妈妈再也不担心我找不到工作啦_浅显理解 hashcode 和 hash 算法

随便推点

VS Code搭建Python开发环境_为什么没人用vs写python-程序员宅基地

文章浏览阅读1.5k次。VS Code(Visual Studio Code)是一个由微软开发的免费的跨平台代码编辑器,可以在Windows、Linux和macOS上运行。它支持多种编程语言和文件格式,并具有许多功能和插件,可以增强编辑器的功能。VS Code具有内置的调试器、Git版本控制、智能代码完成、代码片段和扩展等功能,可以提高开发人员的生产力和代码质量。它也是一个开源项目,并且有一个活跃的社区来支持和扩展它的功能。最近我又增加了GitHub Copilot插件,编程爽得简直不要不要的。_为什么没人用vs写python

Pytorch交叉熵损失(CrossEntropyLoss)函数内部运算解析_crossentropyloss(reduction="mean")-程序员宅基地

文章浏览阅读5.5k次,点赞2次,收藏17次。  对于交叉熵损失函数的来由有很多资料可以参考,这里就不再赘述。本文主要尝试对交叉熵损失函数的内部运算做深度解析。 1. 函数介绍  Pytorch官网中对交叉熵损失函数的介绍如下:CLASS torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=- 100,reduce=None, reduction=‘mean’, label_smoothing=0.0)  该损失函数计算输入和目标值之间的交叉熵损失。_crossentropyloss(reduction="mean")

数学建模笔记CH3:线性代数方法建模_线性代数建模-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏10次。CH3线性代数方法建模overview线性代数是以向量和矩阵为对象,以实向量空间为背景的一种抽象数学工具,它的应用遍及科学技术和国民经济各个领域。本篇通过基因遗传学、投入产出模型等几个例子阐述以线性代数为主要工具建立数学模型的一般方法和步骤。3.1常染色体基因遗传常染色体基因遗传中,后代是从每个亲本的基因对中各继承一个基因,形成自己的基因对。模型一 植物基因的分布植物基因对为AA、Aa..._线性代数建模

防御性编程?这不就来了_防御编程-程序员宅基地

文章浏览阅读382次,点赞7次,收藏9次。2023 全年都在降本增效,节能开猿的浪潮下度过。虽然本文是给大家讲防御性编程如何实践,但终究只是博君一笑,请勿当真。这里我还是希望每一个互联网打工人都能平稳度过这波寒冬。积蓄力量,多思考,多元发展。在来年,春暖花开,金三银四之月,都能找到自己满意的工作,得到属于自己的果实。_防御编程

“Unknown initial character set index '255' received from serve”错误解决过程 - Mybatis 示例_unknown initial character 255-程序员宅基地

文章浏览阅读4.7k次,点赞8次,收藏13次。今天在学习Mybaits的时候,根据教程写出了一个第一个程序——从数据库读取一条数据并打印。当一切都就绪了:user.javaUserMapper.xmlmybatis-config.xml测试类依葫芦画瓢地写下来,以为没问题了,运行这个测试方法,竟然报错了:org.apache.ibatis.exceptions.PersistenceException: ### Err..._unknown initial character 255

[附源码]JAVA+ssm校友信息管理系统(程序+Lw)_java校友信息管理系统-程序员宅基地

文章浏览阅读307次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:SSM + mybatis + Maven + Vue 等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;_java校友信息管理系统

推荐文章

热门文章

相关标签