python – PyTorch模块如何做后备道具
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – PyTorch模块如何做后备道具,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1948字,纯文字阅读大概需要3分钟。
内容图文
按照extending PyTorch – adding a module上的说明,我注意到在延长Module时,我们实际上不必实现向后功能.我们唯一需要的是在forward函数中应用Function实例,PyTorch在执行后向prop时可以自动调用Function实例中的后向实例.这对我来说似乎很神奇,因为我们甚至没有注册我们使用的Function实例.我查看了源代码,但没有发现任何相关内容.有人可以指出我所有实际发生过的地方吗?
解决方法:
不必实现backward()是PyTorch或任何其他DL框架如此有价值的原因.事实上,实现backward()只应该在非常特殊的情况下进行,你需要弄乱网络的渐变(或者当你创建一个无法用PyTorch的内置函数表达的自定义函数时).
PyTorch使用计算图计算后向梯度,计算图跟踪正向传递期间已完成的操作.对Variable执行的任何操作都隐式地在此处注册.然后,这是从调用它的变量向后遍历图形,并应用衍生链规则来计算梯度的问题.
PyTorch的About页面具有良好的图形可视化以及它通常如何工作.如果您需要更多详细信息,我还建议您在Google上查找计算图和自动编排机制.
编辑:所有这些发生的源代码将在PyTorch的代码库的C部分,其中实现了实际的图形.经过一番挖掘后,我找到了this:
/// Evaluates the function on the given inputs and returns the result of the
/// function call.
variable_list operator()(const variable_list& inputs) {
profiler::RecordFunction rec(this);
if (jit::tracer::isTracingVar(inputs)) {
return traced_apply(inputs);
}
return apply(inputs);
}
因此,在每个Function中,PyTorch首先检查其输入是否需要跟踪,并执行here实现的trace_apply().您可以看到正在创建的节点并将其附加到图中:
// Insert a CppOp in the trace.
auto& graph = state->graph;
std::vector<VariableFlags> var_flags;
for(auto & input: inputs) {
var_flags.push_back(VariableFlags::of(input));
}
auto* this_node = graph->createCppOp(get_shared_ptr(), std::move(var_flags));
// ...
for (auto& input: inputs) {
this_node->addInput(tracer::getValueTrace(state, input));
}
graph->appendNode(this_node);
我最好的猜测是每个Function对象在执行时注册自己及其输入(如果需要).每个非函数调用(例如,variable.dot())只是按照相应的函数,所以这仍然适用.
注意:我不参与PyTorch的开发,也不是其架构方面的专家.任何更正或补充都将受到欢迎.
内容总结
以上是互联网集市为您收集整理的python – PyTorch模块如何做后备道具全部内容,希望文章能够帮你解决python – PyTorch模块如何做后备道具所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。