2

我是 Julia 的新手,我无法确定Flux's 模型中图层的类型。出于示例的目的,假设我的模型只是一个神经元:

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

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

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

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

2 回答 2

5

使用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 手册中的此警告

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

于 2020-06-19T21:54:52.023 回答
2

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

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

一种更儒略的方法是像这样在层类型上调度:

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
于 2020-06-20T00:26:10.847 回答