Pytorch Pytork自定义重量

Pytorch Pytork自定义重量,pytorch,Pytorch,我有一个网络 class Net(nn.Module) 以及两个不同的权重w0和w1(将所有层的权重连接到一个向量中)。现在我想优化连接w0和w1的线路上的网络,这意味着权重的形式为theta*w0+(1-theta)*w1。所以现在我要优化的参数不再是权重本身,而是θ 我如何实现这一点?在Pytorch中,如何将参数定义为theta,并将权重设置为所需的形式。具体来说,如果我创建一个新类 NetOnLine(nn.Module) 如何编写转发(self,X)函数?您可以将网络中的参数the

我有一个网络

class Net(nn.Module)
以及两个不同的权重
w0
w1
(将所有层的权重连接到一个向量中)。现在我想优化连接
w0
w1
的线路上的网络,这意味着权重的形式为
theta*w0+(1-theta)*w1
。所以现在我要优化的参数不再是权重本身,而是θ

我如何实现这一点?在Pytorch中,如何将参数定义为
theta
,并将权重设置为所需的形式。具体来说,如果我创建一个新类

NetOnLine(nn.Module)

如何编写
转发(self,X)
函数?

您可以将网络中的参数
theta
定义为
nn.parameter
。您应该以与普通相同的方式定义forward函数——将数据传递到所需的层或操作中,然后返回它

下面是一个简单的例子,我训练一个“网络”来学习张量乘以2:

将numpy导入为np
进口火炬
SampleNet类(火炬nn模块):
定义初始化(自):
super(SampleNet,self)。\uuuu init\uuuuu()
self.theta=torch.nn.参数(torch.rand(1))
def前进(自身,x):
x=x*self.theta.expand_as(x)#expand_as()以匹配大小
返回x
序列数据=np.rand.rand(1000,10)
列车组数据[:,5:]=2*列车组数据[:,:5]
列车数据=火炬张量(列车数据)
示例_net=SampleNet()
optimizer=torch.optim.Adam(params=sample\u net.parameters())
mse_损耗=火炬.nn.MSELoss()
对于范围(5)中的历元:
对于列车_数据中的数据:
x=数据[:5]
y=数据[5:]
optimizer.zero_grad()
预测=样本净(x)
损失=mse_损失(y,预测)
loss.backward()
optimizer.step()
打印(f“Epoch{Epoch},Loss{Loss.data.item()}”)
print(f“Learned theta:{sample_net.theta.data.item()}”)
打印出来的

Epoch 0, Loss 0.03369491919875145
Epoch 1, Loss 0.0018534092232584953
Epoch 2, Loss 1.2343853995844256e-05
Epoch 3, Loss 2.2044337466553543e-09
Epoch 4, Loss 4.0527581290916714e-12
Learned theta: 1.999994158744812

查看
nn.Module
register\u parameter
方法和
nn.parameter
文档,但我的网络结构非常复杂。它可能包含许多层,包括线性层和二维层,并被视为黑盒。此外,似乎这些层的所有权重都自动视为参数。那么,我如何将它们转换为一个数字,并添加我自己的参数θ。您可以使用
layer.weight.data
直接访问层权重,然后根据需要将它们乘以θ。我不清楚你想如何在你的模型中使用权重和θ,所以我很难说。也许本讨论将帮助您访问权重: