I’m trying to write the sigmoid function as below, but did not work:
function sigmoid(z::Array)
return 1.0 ./ (1.0 + exp(-z))
end;
Knowing that the below is working fine, but I’m looking for a short way to write it:
function sigmoid(z::Array)
sig = []
for (index, value) in enumerate(z)
push!(sig, 1 / (1 + value))
end
return sig
end
It is already implemented as StatsFuns.logistic
. Don’t define elementwise functions for arrays: use broadcasting.
You could do worse than to copy this one:
https://github.com/FluxML/NNlib.jl/blob/master/src/activation.jl#L10
Edit: and apply it to an array by writing σ.(z)
.
Did not understand your reply
Instead of defining sigmoid(z::Array)
define sigmoid(z::Real)
and then use broadcasting to apply it to the elements of an array: sigmoid.(z)
(note the dot, which indicates broadcasting)
This is also the problem you’re facing in your OP. If you were to define sigmoid(z::Array)
, which (again) you shouldn’t, you’ll need dots everywhere:
function sigmoid(z::Array)
return 1.0 ./ (1.0 .+ exp.(-z))
end
However, it is much better to write
sigmoid(z::Real) = 1.0 / (1.0 + exp(-z))
Even better you can make this function type generic like so:
sigmoid(z::Real) = one(z) / (one(z) + exp(-z))
This way it would also work for number types that are not Float64
: It will use the appropriate one element (the identity under multiplication) of that particular element type.
5 Likes
Thanks alot
I wrote it now as:
sigmoid(x::Real, derive::Bool=false) =
(derive==true) ? x*(one(x)-x) : one(x)/(one(x) + exp(-x))
1 Like