Julia Flux: определяем тип слоя

Я новичок в Джулии, и у меня возникают проблемы с определением типа слоя в Fluxмодель. В качестве примера представьте, что моя модель - это всего лишь один нейрон:

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

Я хочу повторить свой Chain и, в зависимости от типа слоя, выполнять разные действия (в частности, я хочу добавить регуляризацию для Dense слои).

Я пришел к Джулии из Python, и моей первой догадкой было сравнить тип слоя с типом Dense. Вопреки моей интуиции это дает мнеfalse:

for layer in m
    println(typeof(layer) == typeof(Dense))
end
  1. Почему это не работает в Юлии?
  2. Как правильно заставить Юлию работать? Конечно, я могу проверить, есть ли в конкретных поляхstruct (in/out/sigmoid в случае Dense) существуют для данного слоя, но нет гарантии, что это не какой-то другой слой с аналогичными полями.

2 ответа

Решение

Использовать 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, чтобы узнать о нем больше.

Итерация с 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
Другие вопросы по тегам