如何在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()

此解决方案与我的体系结构绑定,如果我决定添加更多层,则需要重新编码。有什么方法可以更有效、更干净地做到这一点吗?无论我的网络架构如何,都希望它能正常工作。

感谢

pytorchnumpy是面向tensor的,例如,您对类似多维数组的对象中包含的多个项进行操作。

您可以将整个代码更改为这一行:

import torch
child_agent = network()
for param in child_agent.parameters():
param.data += mutation.power * torch.randn_like(param)

randn_like(此处为docs(创建具有与param相同形状的随机法线张量。

此外,如果这个参数需要grad(它可能需要(,则应该修改它的data字段。

MCVE:

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)

相关内容

  • 没有找到相关文章

最新更新