如何解决如何在pytorch中改变NN的权重
我正在使用pytorch来研究遗传算法,我正在寻找一种更有效的方法来改变网络的权重(对它们进行小的修改)
现在,我有一个次优的解决方案,其中遍历参数并应用随机修改。
child_agent = network()
for param in child_agent.parameters():
if len(param.shape) == 4: # weights of Conv2D
for i0 in range(param.shape[0]):
for i1 in range(param.shape[1]):
for i2 in range(param.shape[2]):
for i3 in range(param.shape[3]):
param[i0][i1][i2][i3] += mutation_power * np.random.randn()
elif len(param.shape) == 2: # weights of linear layer
for i0 in range(param.shape[0]):
for i1 in range(param.shape[1]):
param[i0][i1] += mutation_power * np.random.randn()
elif len(param.shape) == 1: # biases of linear layer or conv layer
for i0 in range(param.shape[0]):
param[i0] += mutation_power * np.random.randn()
此解决方案已绑定到我的体系结构,如果我决定添加更多层,则需要重新编码。有什么办法可以更有效,更清洁地做到这一点?不管我的网络架构如何,它都是可行的。
谢谢
解决方法
pytorch
和numpy
面向tensor
,例如您需要对多维数组状对象中包含的多个项目进行操作。
您可以将整个代码更改为以下一行:
import torch
child_agent = network()
for param in child_agent.parameters():
param.data += mutation.power * torch.randn_like(param)
randn_like
(docs here)创建具有与param
相同形状的随机法线张量。
此外,如果此参数需要grad
(它可能需要这样做),则应修改它的data
字段。
MCVE:
import torch
mutation_power = 0.4
child_agent = torch.nn.Sequential(
torch.nn.Conv2d(1,3,padding=1),torch.nn.Linear(10,20)
)
for param in child_agent.parameters():
param.data += mutation_power * torch.randn_like(param)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。