【问题标题】:How are neural networks, loss and optimizer connected in PyTorch?PyTorch 中的神经网络、损失和优化器是如何连接的?
【发布时间】:2020-06-03 09:40:57
【问题描述】:

我已经看到this question 的答案,但我还是完全不明白。据我所知,这是最基本的设置:

net = CustomClassInheritingFromModuleWithDefinedInitAndForward()
criterion = nn.SomeLossClass()
optimizer = optim.SomeOptimizer(net.parameters(), ...)
for _, data in enumerate(trainloader, 0):
    inputs, labels = data
    optimizer.zero_grad()
    outputs = net(inputs)
    loss = criterion(outputs, labels)
    loss.backward()
    optimizer.step()

我不明白的是:

优化器使用 net.parameters() 进行初始化,我认为这是网络的内部权重。

Loss 不会访问这些参数,也不会访问网络本身。它只能访问网络的输出和输入标签。

优化器也不访问损失。

那么如果损失只对输出起作用,而优化器只对 net.parameters 起作用,那么它们如何连接?

【问题讨论】:

    标签: python neural-network pytorch gradient-descent backpropagation


    【解决方案1】:

    优化器使用 net.parameters() 进行初始化,我认为这是网络的内部权重。

    这是因为优化器会在训练期间修改您网络的参数。

    Loss 不会访问这些参数,也不会访问网络本身。它只能访问网络的输出和输入标签。

    损失只计算预测和事实之间的误差。

    优化器也不访问损失。

    它访问在loss.backward 期间计算的张量

    【讨论】:

    • 按照我的理解,张量损失可以访问的是输出和标签,而张量优化器可以访问的是 net.parameters。优化器和损失都可以访问的“在 loss.backward 期间计算的张量”是什么?
    • 损失只是你的预测和你的基本事实之间的误差(可以是标签,是的)。当您执行 loss.backward 时,您正在执行反向传播,这是计算模型的每个参数如何对错误负责。优化器使用此反向传播来更新网络的参数。我建议您遵循 PyTorch 的教程pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html,它解释得很好。
    • 我确实尝试过遵循本教程。恐怕我不明白那部分。损失如何访问我的模型?在任何时候,我都不会像优化器那样将netnet.parameters 作为参数。那么loss.backward()如果不知道我的模型是什么,如何计算我模型的每个参数是如何导致错误的呢?
    • 您的损失不会访问您的模型,它会访问outputs 张量中提供的值的历史
    • @momo 每次对张量执行操作(例如添加、卷积等)时,有关操作的信息都存储在结果张量实例中,包括对张量的引用结果来源于。通过这种方式,可以将结果追溯到模型的原始参数和输入。当您在最终损失张量上运行 .backward 时,连接会被跟踪回原始(叶)张量,传播梯度并最终将结果存储到 .grad 成员中。优化器使用生成的 .grad 对参数进行更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多