Как создать нейронную сеть с несколькими выходными слоями (Julia, Flux)

#machine-learning #deep-learning #julia #flux.jl

#машинное обучение #глубокое обучение #джулия #flux.jl

Вопрос:

Допустим, у меня есть следующая нейронная сеть

 net = Chain(Dense(3,5,sigma), Dense(5,2, ???))
 

Я хотел бы знать, что поставить вместо ??? того, чтобы мой первый выходной нейрон проходил через функцию активации RELU, а второй — сигмовидную функцию. Выходные данные этой сети представляют собой пару действий для выполнения, первое — положительное реальное значение, а другое — двоичный выбор.

Я не могу определить пользовательскую функцию «relu_sigma», которая делала бы выбор, потому что она работает так, что функции активации принимают одно значение, а не массив. Поэтому я не могу создать функцию, которая знает, принимает ли она первый или второй Wx b аргумент в качестве аргумента.

В более общем плане я хотел бы знать, как создать такую сеть с любым количеством функций на любом количестве нейронов (например, 5 relu, 2 sigmoid и softmax на последних 4)

Ответ №1:

Я определил пользовательский тип слоя следующим образом. Оно не такое общее, оно применяет relu только к первой половине нейронов, а sigma — ко второй половине. Но это то, что я хотел для своих приложений, обобщение не должно быть слишком сложным для понимания.

 struct reluSigma
    W
    b
end
reluSigma(in::Integer, out::Integer) =  reluSigma(param(randn(out, in)), param(randn(out)))

function (m::reluSigma)(x)
    l = Int(length(m.b)/2)
    r1 = 1:l
    r2 = l 1:length(m.b)
    vcat(relu(m.W[r1,:] * x .  m.b[r1,:]), σ(m.W[r2,:] * x .  m.b[r2,:]))
end