首页 > 解决方案 > 如何取消引用 GlobalRef?

问题描述

存在一个变量p,它是由一个外部包创建的。我认为它是一个指向 的指针W1,它是由我在全局范围内创建的。

typeof(p) # output: GlobalRef
p # output: :(Main.W1)
p.name # output: :W1
p.mod # output: Main

如何检索 W1,它是背后的值p?换句话说,是否有f针对 which的功能W1 === f(p)

loss感兴趣的一些上下文:我正在尝试使用 vanilla Zygote优化神经网络和损失(一起由 function 表示):

for s in 1:100
    l = 0.
    gs = gradient(Zygote.Params(optimizable_params)) do 
        l = loss(X[s, :], y[s])
    end
    push!(losses, l)
        
        
    for (p, g) in pairs(gs.grads)
        p += η * g #  Here the p is coming from
    end
end

标签: julia

解决方案


这个特定的用例似乎是一个错误。但是,通常您可以像这样获得被引用的对象:

julia> module X
       x = 5
       end
Main.X

julia> g = GlobalRef(X, :x)
:(Main.X.x)

julia> getfield(g.mod, g.name)
5

推荐阅读