Python 如何在pytorch中变异NN的权重

Python 如何在pytorch中变异NN的权重,python,deep-learning,pytorch,genetic-algorithm,Python,Deep Learning,Pytorch,Genetic Algorithm,我正在用pytorch玩遗传算法,我正在寻找一种更有效的方法来改变网络的权重(对它们进行一个小的修改) 现在我有了一个次优的解决方案,我循环遍历参数并应用随机修改 child\u agent=network() 对于child_agent.parameters()中的参数: 如果len(param.shape)==4:#Conv2D的权重 对于范围内的i0(参数形状[0]): 对于范围内的i1(参数形状[1]): 对于范围内的i2(参数形状[2]): 对于范围内的i3(参数形状[3]): par

我正在用pytorch玩遗传算法,我正在寻找一种更有效的方法来改变网络的权重(对它们进行一个小的修改)

现在我有了一个次优的解决方案,我循环遍历参数并应用随机修改

child\u agent=network()
对于child_agent.parameters()中的参数:
如果len(param.shape)==4:#Conv2D的权重
对于范围内的i0(参数形状[0]):
对于范围内的i1(参数形状[1]):
对于范围内的i2(参数形状[2]):
对于范围内的i3(参数形状[3]):
param[i0][i1][i2][i3]+=变异幂*np.random.randn()
elif len(参数形状)=2:#线性层的权重
对于范围内的i0(参数形状[0]):
对于范围内的i1(参数形状[1]):
param[i0][i1]+=mutation_power*np.random.randn()
elif len(参数形状)=1:#线性层或转换层的偏差
对于范围内的i0(参数形状[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
()创建与
param
形状相同的随机法向张量

此外,如果此参数需要
grad
(它可能需要),则应修改其
数据
字段

:


我不需要任何毕业生,因为我只需要实例化网络,改变/加入它们,而从不训练它们。
import torch

mutation_power = 0.4

child_agent = torch.nn.Sequential(
    torch.nn.Conv2d(1, 3, 3, padding=1), torch.nn.Linear(10, 20)
)

for param in child_agent.parameters():
    param.data += mutation_power * torch.randn_like(param)