Hi, I just wrote a function that computes chain rule using Finite Difference derivatives and ran into a weird issue.
The function that calculates the derivative is defined as
function chain_deriv(chain:: Vector{<:Function}, x:: CuArray)
n = size(chain)[1]
df_dinp = 1
for i in 1:n
df_dinp = df_dinp .* fd_deriv(chain[i], x)
x = chain[i](x)
end
return df_dinp
end
and when I execute this
x = CuArray(-3:3)
chain1 = Vector([square, sigmoid])
y1 = chain_deriv(chain1, x)
I get an error
scalar getindex is disallowed
Stacktrace:
[1] error(::String) at ./error.jl:33
[2] assertscalar(::String) at /home/tushar/.julia/packages/GPUArrays/WV76E/src/host/indexing.jl:41
[3] getindex at /home/tushar/.julia/packages/GPUArrays/WV76E/src/host/indexing.jl:96 [inlined]
[4] _broadcast_getindex at ./broadcast.jl:614 [inlined]
[5] _getindex at ./broadcast.jl:645 [inlined]
[6] _broadcast_getindex at ./broadcast.jl:620 [inlined]
[7] _getindex at ./broadcast.jl:645 [inlined]
[8] _getindex at ./broadcast.jl:644 [inlined]
[9] _broadcast_getindex at ./broadcast.jl:620 [inlined]
[10] _getindex at ./broadcast.jl:645 [inlined]
[11] _getindex at ./broadcast.jl:644 [inlined]
[12] _broadcast_getindex at ./broadcast.jl:620 [inlined]
[13] getindex at ./broadcast.jl:575 [inlined]
[14] copy at ./broadcast.jl:876 [inlined]
[15] materialize at ./broadcast.jl:837 [inlined]
[16] sigmoid(::CuArray{Int64,1}) at ./In[6]:6
[17] chain_deriv(::Array{Function,1}, ::CuArray{Int64,1}) at ./In[11]:6
[18] top-level scope at In[17]:5
[19] include_string(::Function, ::Module, ::String, ::String) at ./loading.jl:1091
Here’s how I defined the FD derivative and sigmoid
#=
Apply sigmoid function to each element
of the input CUDA Array
=#
function sigmoid(x:: CuArray)
return 1 ./ (1 .+ exp.(-x))
end
#=
Evaluates the derivative of a function "func"
at every element in the CUDA Array "x"
=#
function fd_deriv(func:: Function, x:: CuArray)
delta = .001
return (func(x .+ delta) .- func(x .- delta)) / (2 * delta)
end
I don’t understand how I’m getting a scalar value here, because I’m trying to compute derivatives for elements in the CuArray.