作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 .jl
文件中编写了一个简单的函数,我可以使用 forward
成功区分它。但是我是 Julia 的新手,我不明白如何查看为微分函数生成的源代码。我已经尝试了各种各样的东西,比如 @code_lowered Zygote.forward(maxPool, [1.0, 2.0])
和 @code_lowered Zygote.forward(maxPool)
但它们只是显示我转发自己的电话。
如何查看 Zygote 为正向和反向传递生成的代码?
using Pkg
using Zygote, ForwardDiff
function size1d(v)
return size(v)[1]
end
function max(a, b)
if a > b
a
else
b
end
end
function maxPool(v)
return [max(v[2 * i - 1], v[2 * i])
for i in 1:div(size1d(v), 2)]
end
v = [1.0, 2.0, 3.0, 4.0]
df = [20.0, 30.0]
println("maxPool(v):")
println(maxPool(v))
println()
println("maxAdjoint:")
maxAdjoint = Zygote.forward(max, 3.0, 4.0)[2]
println(maxAdjoint(1.0))
println()
println("maxPoolAdjoint:")
maxPoolAdjoint = Zygote.forward(maxPool, v)[2]
println(maxPoolAdjoint(df))
最佳答案
Zygote 有自己的宏 Zygote.@code_adjoint
用于显示降低的 adjoint 代码,即在反向模式下生成函数梯度的代码。不过我不确定转发模式。
这是一个反向模式的简单例子:
julia> using Zygote
julia> f(x) = 2x + 1
f (generic function with 1 method)
julia> @code_lowered f(1)
CodeInfo(
1 ─ %1 = 2 * x
│ %2 = %1 + 1
└── return %2
)
julia> Zygote.@code_adjoint f(1)
Zygote.Adjoint(1: (%3, %4 :: Zygote.Context, %1, %2)
%5 = Zygote._forward(%4, Main.:*, 2, %2)
%6 = Base.getindex(%5, 1)
%7 = Base.getindex(%5, 2)
%8 = Zygote._forward(%4, Main.:+, %6, 1)
%9 = Base.getindex(%8, 1)
%10 = Base.getindex(%8, 2)
return %9
, 1: (%1)
%2 = (@10)(%1)
%3 = Zygote.gradindex(%2, 2)
%4 = (@7)(%3)
%5 = Zygote.gradindex(%4, 3)
%6 = Zygote.tuple(nothing, %5)
return %6
)
我们可能会担心这个降低的伴随代码的长度和明显的复杂性,梯度很慢,但我们可以检查 LLVM 代码以确保所有内容最终都被删除:
julia> @code_llvm f'(1)
; @ /Users/mason/.julia/packages/Zygote/SAZMM/src/compiler/interface.jl:50 within `#34'
define i64 @"julia_#34_18250"(i64) {
top:
ret i64 2
}
关于julia - 如何看Zygote差异化功能实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57926621/
我创建了一个导航栏,效果很好。唯一的问题是,我创建了一个链接,但看不到链接的一半。 谁能帮帮我??? HTML:
我有一个 Device 对象数组,它是使用 $resource 从 REST 服务器定期获取的。每当发生这种情况时,UI 就会“重新加载”,这意味着该设备数组的 ng-repeat 会再次执行。 DO
我是一名优秀的程序员,十分优秀!