python - 如何在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
(此处的文档)创建具有相同形状的随机正态张量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)
推荐阅读
- docker - 自定义 docker 以分离模式运行输出
- reactjs - onClick 无法正常工作时遇到问题
- azure - 带有虚拟机的 Azure 高可用性
- java - @Createdby @CreatedDate 在实体更新后为空
- java - Android STT 后端
- python - 客户分析和异常检测-Python
- reactjs - Chrome 扩展:在 React `npm run build` 错误之后:未捕获的类型错误:无法读取未定义的属性 'sendMessage'
- java - 我们可以通过传递类类型作为参数来使用 Java 泛型创建不同的类实例吗
- laravel - Laravel Eloquent Pluck 产生了不正确的数据
- intellij-idea - IntelliJ Alt-单击拖动