Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Julia 如何看待受精卵分化功能的实现?_Julia - Fatal编程技术网

Julia 如何看待受精卵分化功能的实现?

Julia 如何看待受精卵分化功能的实现?,julia,Julia,我已经在.jl文件中编写了一个简单的函数,我可以使用forward成功区分它。但是,我对Julia是新手,我不知道如何查看生成的差分函数源代码。我尝试过各种各样的方法,比如@code\u lowered-Zygote.forward(maxPool[1.0,2.0])和@code\u lowered-Zygote.forward(maxPool),但它们只是向我显示了转发本身的调用 我怎样才能看到合子为正向和反向传递生成的代码 using Pkg using Zygote, ForwardDif

我已经在
.jl
文件中编写了一个简单的函数,我可以使用
forward
成功区分它。但是,我对Julia是新手,我不知道如何查看生成的差分函数源代码。我尝试过各种各样的方法,比如
@code\u lowered-Zygote.forward(maxPool[1.0,2.0])
@code\u lowered-Zygote.forward(maxPool)
,但它们只是向我显示了转发本身的调用

我怎样才能看到合子为正向和反向传递生成的代码

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))


合子有自己的宏
合子。@show_adjunct
用于显示降低的伴随代码,即在反向模式下生成函数梯度的代码。但我不确定前进模式

以下是反向模式下的一个简单示例:

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
}

考虑加入朱丽亚懈怠并在“通量”或“帮助”通道中进行询问。