#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