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
- Почему это не работает в Юлии?
- Как правильно заставить Юлию работать? Конечно, я могу проверить, есть ли в конкретных полях
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