Julia Flux:确定层的类型

Julia Flux: determine type of layer

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

using Flux
m = Chain(Dense(1, 1, sigmoid))

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

我从 Python 来到 Julia,我的第一个猜测是比较层的类型和 Dense 的类型。与我的直觉相反,这给了我 false:

for layer in m
    println(typeof(layer) == typeof(Dense))
end
  1. 为什么这在 Julia 中不起作用?
  2. 让 Julia 工作的正确方法是什么?当然,我可以检查给定层是否存在 structin/out/sigmoid(在 Dense 的情况下)的特定字段,但不能保证它不是具有类似字段的其他层。

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

for layer in m.layers
    if layer isa Dense
        # do something with dense layer
    else
        # do something else
    end
end

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

for layer in m
    if layer isa Dense
        # do something with dense layer
    else
        # do something else
    end
end

现在澄清类型检查:

  • 如果你有一个值,并且你想检查它的类型是否是给定类型的子类型,请使用我上面的 isa
  • 如果您有两种类型要比较子类型使用 <:,那么您可以写成 typeof(layer) <: Dense;对于类型 == 不推荐检查,请参阅 Julia 手册中的 this warning

您可以查看 Julia 手册的 this section 以了解更多相关信息

迭代 for layer in m 应该没问题。你得到 false 的原因是因为 typeof(Dense) == UnionAll。您应该将代码更改为:

for layer in m
    println(typeof(layer) == Dense))
end

一种更 Julian 的方法是像这样在层类型上分派:

function processlayer(layer::Dense)
    # do special thing for dense
end

function processlayer(layer)
    # do other thing for anything else
end

for layer in m
    processlayer(layer)
end