AI框架的使用技巧

本文分享了作者在实际工作中遇到的深度学习框架使用技巧,包括MindSpore中正确注册子模块的方法,PyTorch获取网络权重的注意事项,TensorFlow如何设置和获取权重,以及如何进行跨框架权重迁移,特别是PyTorch到MindSpore的权重转换策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

这里记录我在工程中摸索到的技术,大部分是在网络中搜不到的或者很难快速搜到的


1 mindspore的技术点

2 pytorch的技术点

2.1 不能简单地用list来包含子module

在编写了一个网络以后,想要通过Module.state_dict()来获取网络权重,但是失效了,返回的是一个空的OrderedDict(),但是可以前向运算。这就非常纳闷了我giao。我直接创建了一个子Module(有时称为模块),发现是可以state_dict()是可以返回非空OrderedDict()的。也就是说,父模块包含了子模块,但是无法获取子模块的权重。然而!我的子模块里也包含了子模块(我称它为孙子模块),子模块是可以通过state_dict()来获取孙子模块的权重的。经过多次的摸索,我发现父模块包含子模块时,我用的是简单的list,如下所示:

class son(nn.Module):
	def __init__(self, bias_len):
		self.bias = nn.parameter.Parameter(torch.ones((bias_len,)))
	def forward(self, x):
		out = x + self.bias
		return out

class father(nn.Module):
	def __init__(self, bias_len, num_layers):
		self.layers = [son(bias_len) for i in range(num_layers)]
	def forward(self, x):
		for layer in self.layers:
			x = layer(x)
		return x

这相当于没有把子模块注册到父模块中,我估计这种写法是不能训练的(没试过,试完再补充)。一定要把子模块组成的list用nn.ModuleList()封装起来,才算把子模块注册到了父模块。完整的代码如下:

class son(nn.Module):
	def __init__(self, bias_len):
		self.bias = nn.parameter.Parameter(torch.ones((bias_len,)))
	def forward(self, x):
		out = x + self.bias
		return out

class father(nn.Module):
	def __init__(self, bias_len, num_layers):
		self.layers = [son(bias_len) for i in range(num_layers)]
		self.layers = nn.ModuleList(self.layers) #补充这一句即可
	def forward(self, x):
		for layer in self.layers:
			x = layer(x)
		return x

3 tensorflow的技术点

3.1 获取tensorflow网络中的权重

tensorflow以Variable(变量)表示网络中的参数,默认是可训练的,如果想要设置成不可训练,只需要在创建Variable时令参数trainable=False即可。
从网络中直接获取权重,而不是从文件加载权重到网络,也不是从网络保存权重到文件,使用以下两个语句之一即可:

net = CRNN(
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值