【pytorch】如何更新模型父类参数

更新方法例子如下:

import torch
import torch.nn as nn
class A(nn.Module):
    def __init__(self):
        super(A,self).__init__()
        self.l1=nn.Linear(2,2)
    def forward(self,x):
        return self.l1(x)

class B(A):
    def __init__(self):
        super(B,self).__init__()
        self.a=A()
        self.l2=nn.Linear(2,1)
    def forward(self,x):
        x=self.a(x)
        return self.l2(x)

class C(A):
    def __init__(self):
        super(C,self).__init__()
        self.l1=nn.Linear(2,2)
        self.l2=nn.Linear(2,1)
    def forward(self,x):
        x=self.l1(x)
        return self.l2(x)

from torch.optim import Adam
from torch.nn import MSELoss
x=torch.FloatTensor([1,2])

y=torch.FloatTensor([0.5])
b=B()
c=C()
p=[]
p.extend(b.parameters())
p.extend(b.a.parameters())
optimizer1 = Adam(p,lr=0.1)
optimizer2 = Adam(c.parameters(),lr=0.1)
loss_func = MSELoss()

print('======= b origin  ========')
print(b.a.l1.weight,'\n',b.l1.weight,'\n',b.l2.weight)
logit = b(x)
loss=loss_func(logit,y)
loss.backward()
optimizer1.step()

print('======= b after  ========')
print(b.a.l1.weight,'\n',b.l1.weight,'\n', b.l2.weight)

输出:

======= b origin  ========
Parameter containing:
tensor([[ 0.0655,  0.6051],
        [-0.4282, -0.2897]], requires_grad=True) 
 Parameter containing:
tensor([[ 0.6422, -0.1793],
        [-0.6748,  0.3853]], requires_grad=True) 
 Parameter containing:
tensor([[-0.0885,  0.1957]], requires_grad=True)
======= b after  ========
Parameter containing:
tensor([[-0.1345,  0.4051],
        [-0.2282, -0.0897]], requires_grad=True) 
 Parameter containing:
tensor([[ 0.6422, -0.1793],
        [-0.6748,  0.3853]], requires_grad=True) 
 Parameter containing:
tensor([[0.0115, 0.0957]], requires_grad=True)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 PyTorch 搭建 LSTM 网络模型的基本步骤: 1. 导入必要的库: ```python import torch import torch.nn as nn ``` 2. 定义 LSTM 模型: ```python class LSTMModel(nn.Module): def __init__(self, input_dim, hidden_dim, layer_dim, output_dim): super(LSTMModel, self).__init__() # 定义 LSTM 层 self.lstm = nn.LSTM(input_dim, hidden_dim, layer_dim, batch_first=True) # 定义全连接层 self.fc = nn.Linear(hidden_dim, output_dim) def forward(self, x): # 初始化 LSTM 隐藏层状态 h0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_() c0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_() # 前向传播 out, (_, _) = self.lstm(x, (h0.detach(), c0.detach())) out = self.fc(out[:, -1, :]) return out ``` 在上面的代码中,我们定义了一个名为 `LSTMModel` 的,该继承自 `nn.Module`。该包含一个 LSTM 层和一个全连接层。在的构造函数中,我们首先调用父类构造函数,并传递必要的参数。然后,我们定义了 LSTM 层和全连接层。在 `forward()` 方法中,我们首先初始化 LSTM 隐藏层状态,然后进行前向传播,并将最后一个时序输出传递给全连接层,最后返回输出结果。 3. 实例化模型: ```python input_dim = 28 hidden_dim = 100 layer_dim = 1 output_dim = 10 model = LSTMModel(input_dim, hidden_dim, layer_dim, output_dim) ``` 在这个例子中,我们实例化了一个 `LSTMModel` 的对象,并传递必要的参数。 4. 定义损失函数和优化器: ```python criterion = nn.CrossEntropyLoss() learning_rate = 0.1 optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) ``` 在这个例子中,我们使用交叉熵损失函数和随机梯度下降(SGD)优化器。你可以根据你的实际需求选择其他的损失函数和优化器。 5. 训练模型: ```python num_epochs = 10 for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): # 前向传播 outputs = model(images.view(-1, sequence_dim, input_dim)) loss = criterion(outputs, labels) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() if (i+1) % 100 == 0: print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, total_step, loss.item())) ``` 在这个例子中,我们进行了 10 轮训练,每轮训练中,我们使用数据加载器从训练集中获取一批数据,进行前向传播和反向传播,并使用优化器更新模型参数。在每个 epoch 中,我们打印出当前的损失值。 6. 在测试集上评估模型: ```python with torch.no_grad(): correct = 0 total = 0 for images, labels in test_loader: outputs = model(images.view(-1, sequence_dim, input_dim)) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Test Accuracy of the model on the 10000 test images: {} %'.format(100 * correct / total)) ``` 在这个例子中,我们使用测试数据集对模型进行评估,并计算准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值