Как создать нейронную сеть с несколькими выходными слоями (Julia, Flux) - PullRequest
0 голосов
/ 16 апреля 2019

Скажите, у меня есть следующая нейронная сеть

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

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

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

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

1 Ответ

0 голосов
/ 16 апреля 2019

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

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

...