Julia 既然合子不支持突变,那么复发是如何避免的呢?
来自Flux.jl的源代码: 它看起来像是用于每个递归层的Julia 既然合子不支持突变,那么复发是如何避免的呢?,julia,Julia,来自Flux.jl的源代码: 它看起来像是用于每个递归层的Recurstruct,在向前传递中对其state字段进行变异。但是Zygote.jl不支持突变,所以为什么不抛出类似于错误的东西:不支持突变在这种情况下通常是这样的吗 关于出现这种情况的上下文:我正在实现我的自定义有状态层。最初,我只是将MyCustomRecurrentCell定义为RNNCell,并依赖recurrentcell处理MyCustomRecurrentCell的状态突变,就像RNNCell一样。但是后来我发现,因为Re
Recur
struct,在向前传递中对其state
字段进行变异。但是Zygote.jl不支持突变,所以为什么不抛出类似于错误的东西:不支持突变代码>在这种情况下通常是这样的吗
关于出现这种情况的上下文:我正在实现我的自定义有状态层。最初,我只是将MyCustomRecurrentCell
定义为RNNCell
,并依赖recurrentcell
处理MyCustomRecurrentCell
的状态突变,就像RNNCell
一样。但是后来我发现,因为Recur
的字段没有类型注释,所以我得到了我的状态的Any
类型输出,它正在传播到所有其他层,因此我到处都得到Any
。然后我归档并决定使用带有类型注释的字段重新实现Recur
。当我这样做的时候,我现在得到了类似于ArgumentError:type没有确定数量的字段error。所以我想知道,Recur
是如何摆脱变异状态的
mutable struct Recur{T}
cell::T
init
state
end
Recur(m, h = hidden(m)) = Recur(m, h, h)
function (m::Recur)(xs...)
h, y = m.cell(m.state, xs...)
m.state = h
return y
end