了解Pytorch中的模型培训和评估

发布于 2025-02-12 20:19:23 字数 2246 浏览 2 评论 0原文

我正在遵循有关深度学习的Pytorch代码。在训练时期内,我看到模型评估正在进行!

q) torch.no_grad and Model.eval()是否应该超出训练时期的回路?

q)以及如何确定,在后传播过程中,优化器正在优化哪个参数(权重)?

...

for l in range(1):
    model = GTN(num_edge=A.shape[-1],
                        num_channels=num_channels,w_in = node_features.shape[1],w_out = node_dim,
                        num_class=num_classes,num_layers=num_layers,norm=norm)
    
    if adaptive_lr == 'false':
        optimizer = torch.optim.Adam(model.parameters(), lr=0.005, weight_decay=0.001)
    else:
        optimizer = torch.optim.Adam([{'params':model.weight},{'params':model.linear1.parameters()},{'params':model.linear2.parameters()},
                                    {"params":model.layers.parameters(), "lr":0.5}], lr=0.005, weight_decay=0.001)
    
    loss = nn.CrossEntropyLoss()
    
    # Train & Valid & Test
    best_val_loss = 10000
    best_train_loss = 10000
    best_train_f1 = 0
    best_val_f1 = 0
    
    for i in range(epochs):
        print('Epoch:  ',i+1)
        model.zero_grad()
        model.train()
        loss,y_train,Ws = model(A, node_features, train_node, train_target)
        train_f1 = torch.mean(f1_score(torch.argmax(y_train.detach(),dim=1), train_target, num_classes=num_classes)).cpu().numpy()
        print('Train - Loss: {}, Macro_F1: {}'.format(loss.detach().cpu().numpy(), train_f1))
        
        loss.backward()
        optimizer.step()
        model.eval()
        # Valid

        with torch.no_grad():
            val_loss, y_valid,_ = model.forward(A, node_features, valid_node, valid_target)
            val_f1 = torch.mean(f1_score(torch.argmax(y_valid,dim=1), valid_target, num_classes=num_classes)).cpu().numpy()

        if val_f1 > best_val_f1:
            best_val_loss = val_loss.detach().cpu().numpy()
            best_train_loss = loss.detach().cpu().numpy()
            best_train_f1 = train_f1
            best_val_f1 = val_f1

    print('---------------Best Results--------------------')
    print('Train - Loss: {}, Macro_F1: {}'.format(best_train_loss, best_train_f1))
    print('Valid - Loss: {}, Macro_F1: {}'.format(best_val_loss, best_val_f1))
    final_f1 += best_test_f1

I am following a Pytorch code on deep learning. Where I saw model evaluation taking place within the training epoch!

Q) Should the torch.no_grad and model.eval() be out of the training epoch loop?

Q) And how to determine that, which parameter (weight) are getting optimised by the optimiser during the back-propagation?

...

for l in range(1):
    model = GTN(num_edge=A.shape[-1],
                        num_channels=num_channels,w_in = node_features.shape[1],w_out = node_dim,
                        num_class=num_classes,num_layers=num_layers,norm=norm)
    
    if adaptive_lr == 'false':
        optimizer = torch.optim.Adam(model.parameters(), lr=0.005, weight_decay=0.001)
    else:
        optimizer = torch.optim.Adam([{'params':model.weight},{'params':model.linear1.parameters()},{'params':model.linear2.parameters()},
                                    {"params":model.layers.parameters(), "lr":0.5}], lr=0.005, weight_decay=0.001)
    
    loss = nn.CrossEntropyLoss()
    
    # Train & Valid & Test
    best_val_loss = 10000
    best_train_loss = 10000
    best_train_f1 = 0
    best_val_f1 = 0
    
    for i in range(epochs):
        print('Epoch:  ',i+1)
        model.zero_grad()
        model.train()
        loss,y_train,Ws = model(A, node_features, train_node, train_target)
        train_f1 = torch.mean(f1_score(torch.argmax(y_train.detach(),dim=1), train_target, num_classes=num_classes)).cpu().numpy()
        print('Train - Loss: {}, Macro_F1: {}'.format(loss.detach().cpu().numpy(), train_f1))
        
        loss.backward()
        optimizer.step()
        model.eval()
        # Valid

        with torch.no_grad():
            val_loss, y_valid,_ = model.forward(A, node_features, valid_node, valid_target)
            val_f1 = torch.mean(f1_score(torch.argmax(y_valid,dim=1), valid_target, num_classes=num_classes)).cpu().numpy()

        if val_f1 > best_val_f1:
            best_val_loss = val_loss.detach().cpu().numpy()
            best_train_loss = loss.detach().cpu().numpy()
            best_train_f1 = train_f1
            best_val_f1 = val_f1

    print('---------------Best Results--------------------')
    print('Train - Loss: {}, Macro_F1: {}'.format(best_train_loss, best_train_f1))
    print('Valid - Loss: {}, Macro_F1: {}'.format(best_val_loss, best_val_f1))
    final_f1 += best_test_f1

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

病女 2025-02-19 20:19:23
  1. 对于每个时期,您都在进行火车,然后进行验证/测试。
    对于验证/测试,您将模型移至评估模型
    使用model.eval(),然后与
    torch.no_grad()是正确的。再次,您正在向后移动
    使用model.train()在开始时返回火车模型
    火车。代码没有问题,您正在使用模型
    正确的模式。

  2. 在您的代码中,如果autaptive_lr如果false,则您正在优化model.parameters()时给出的参数Adaptive_lr
    是真的,然后您正在优化:

    • 模型
    • model.linear1.parameters()
    • model.linear2.parameters()
    • model.layers.parameters()


  1. For each epoch, you are doing train, followed by validation/test.
    For validation/test you are moving the model to evaluation model
    using model.eval() and then doing forward propagation with
    torch.no_grad() which is correct. Again, you are moving back the
    model back to train model using model.train() at the start of
    train. There is no issue with the code and you are using the model
    modes correctly.

  2. In your code, if adaptive_lr if False then you are optimizing the parameters given by model.parameters() and when adaptive_lr
    is True then you are optimizing:

    • model.weight
    • model.linear1.parameters()
    • model.linear2.parameters()
    • model.layers.parameters()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文