元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。
python 中通过debug 可以发现 变量的结构描述: _metadata
模型部署时,要进行模型和网络精简,删除模型中无用层权重参数,注释掉无用层
步骤一:删除无用层权重参数
步骤二:删除网络中不需要层定义( 最好和上面对应)
产生问题:
1:load_state_dict 且 strict=True 此时报错或者警告,说明前两步骤 删除没有对应或者冗余参数,debug 观察, 继续前两步骤即可;
2:强迫症的我要求 disA加载之后,它的 _metadata(元数据)描述 应该是严谨的(没有冗余);
1:如下代码,剔除 判别器 disA 中的 无用层权重参数方法如下:
def load(self): params = torch.load(os.path.join('model/face_model.pt')) self.gen2B.load_state_dict(params['gen2B']) self.disA.load_state_dict(params['disA'], strict=True) print('--------- model load success -----------------') # 重新存放到 temp_params temp_params = {} temp_params['gen2B'] = self.gen2B.state_dict() temp_params['disA'] = self.disA.state_dict() print(temp_params['disA'].keys()) # 删除 后面 19个 无用层 权重参数 for i in range(19): temp_params['disA'].popitem() # print( temp_params['disA'].keys()) # 删除 特定层的 权重参数 temp_params['disA'].pop("conv0.weight_orig") temp_params['disA'].pop("conv0.weight_u") temp_params['disA'].pop("conv0.weight_v") temp_params['disA'].pop("conv1.weight_orig") temp_params['disA'].pop("conv1.weight_u") temp_params['disA'].pop("conv1.weight_v") temp_params['disA'].pop("pad.total_ops") temp_params['disA'].pop("pad.total_params") torch.save(temp_params, os.path.join('model/face_reduced.pt'))2:手动注释或者删除网络中定义的无用层,然后对 disA _metadata(元数据)描述进行修正;方法是网络正确加载模型 face_reduced.pt 之后,再重新保存一次为 face_reduced_end.pt 进行使用即可:
def load(self): params = torch.load(os.path.join('model/face_reduced.pt')) self.gen2B.load_state_dict(params['gen2B']) self.disA.load_state_dict(params['disA'], strict=True) print('--------- model load success -----------------') print('-----------------------------------------------') temp_params = {} temp_params['gen2B'] = self.gen2B.state_dict() temp_params['disA'] = self.disA.state_dict() torch.save(temp_params, os.path.join('model/face_reduced_end.pt'))对 disA _metadata(元数据)描述进行修正,代码如上, 示例过程如下: