Python 如何在pytorch中变异NN的权重
我正在用pytorch玩遗传算法,我正在寻找一种更有效的方法来改变网络的权重(对它们进行一个小的修改) 现在我有了一个次优的解决方案,我循环遍历参数并应用随机修改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
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)