Julia Flux:确定层的类型

Val*_*ria 3 julia flux.jl

我是 Julia 的新手,无法确定Flux模型中层的类型。举例来说,假设我的模型只有一个神经元:

using Flux
m = Chain(Dense(1, 1, sigmoid))
Run Code Online (Sandbox Code Playgroud)

我想迭代我的,Chain并根据层的类型,进行不同的操作(具体来说,我想为Dense层添加正则化)。

我从 Python 来到 Julia,我的第一个猜测是将层的类型与Dense. 与我的直觉相反,这给了我false

for layer in m
    println(typeof(layer) == typeof(Dense))
end
Run Code Online (Sandbox Code Playgroud)
  1. 为什么这在 Julia 中不起作用?
  2. 使它工作的 Julia 的正确方法是什么?当然,我可以检查的特定领域structin/ out/sigmoid在以下情况下Dense)存在给定层,但就没有保证,这不是一些其他层为类似的领域。

Bog*_*ski 5

使用替代layers属性m并检查值是否属于给定类型使用isa。总之,这应该有效:

for layer in m.layers
    if layer isa Dense
        # do something with dense layer
    else
        # do something else
    end
end
Run Code Online (Sandbox Code Playgroud)

编辑:确实m支持迭代和索引,我不知道,所以@darsnack建议这已经足够了:

for layer in m
    if layer isa Dense
        # do something with dense layer
    else
        # do something else
    end
end
Run Code Online (Sandbox Code Playgroud)

现在澄清类型检查:

  • 如果你有一个值,并且你想检查它的类型是否是给定类型的子类型,isa就像我上面那样
  • 如果你有两种类型想要比较子类型使用<:,那么你可以写typeof(layer) <: Dense; 对于==不建议进行类型检查,请参阅Julia 手册中的此警告

您可以查看Julia 手册的这一部分以了解更多信息