Skip to content

Convolutions error using Measurements.jl #405

@adrhill

Description

@adrhill

Passing an Array of Measurements to a Conv layer throws the error ERROR: UndefRefError: access to undefined reference:

julia> using Flux, Measurements

(@v1.7) pkg> status Flux
      Status `~/.julia/environments/v1.7/Project.toml`
  [587475ba] Flux v0.12.10

(@v1.7) pkg> status Measurements
      Status `~/.julia/environments/v1.7/Project.toml`
  [eff96d63] Measurements v2.7.1

julia> x = rand(Float32, 5, 5, 3, 1);

julia> m = measurement.(x, 0.02f0)
5×5×3×1 Array{Measurement{Float32}, 4}:
[:, :, 1, 1] =
 0.843±0.02   0.78±0.02  0.164±0.02  0.313±0.02   0.578±0.02
 0.188±0.02  0.119±0.02  0.573±0.02  0.342±0.02  0.0012±0.02
 0.434±0.02   0.99±0.02  0.901±0.02  0.881±0.02   0.569±0.02
 0.149±0.02  0.184±0.02  0.553±0.02  0.827±0.02   0.328±0.02
 0.544±0.02  0.659±0.02  0.159±0.02  0.426±0.02   0.789±0.02

[:, :, 2, 1] =
 0.903±0.02  0.801±0.02  0.904±0.02  0.101±0.02   0.11±0.02
 0.879±0.02  0.764±0.02   0.11±0.02  0.426±0.02  0.461±0.02
  0.03±0.02  0.911±0.02  0.819±0.02   0.15±0.02  0.922±0.02
  0.91±0.02  0.392±0.02  0.838±0.02  0.356±0.02  0.277±0.02
 0.632±0.02  0.391±0.02   0.94±0.02  0.969±0.02  0.154±0.02

[:, :, 3, 1] =
 0.084±0.02  0.947±0.02  0.891±0.02  0.997±0.02  0.172±0.02
 0.815±0.02  0.285±0.02  0.243±0.02  0.427±0.02  0.639±0.02
 0.663±0.02  0.055±0.02  0.807±0.02  0.782±0.02  0.439±0.02
 0.882±0.02  0.958±0.02  0.869±0.02  0.471±0.02  0.204±0.02
 0.235±0.02  0.544±0.02  0.946±0.02  0.735±0.02  0.302±0.02

julia> c = Conv((3, 3), 3 => 1)
Conv((3, 3), 3 => 1)  # 28 parameters

julia> c(x)
3×3×1×1 Array{Float32, 4}:
[:, :, 1, 1] =
 0.127281    0.635378   -0.00389463
 0.0390705   0.0806748   0.285093
 0.0103112  -0.182715    0.127719

julia> c(m)
ERROR: UndefRefError: access to undefined reference
Stacktrace:
  [1] getindex
    @ ./array.jl:862 [inlined]
  [2] conv_direct!(y::Array{Measurement{Float32}, 5}, x::Array{Measurement{Float32}, 5}, w::Array{Float32, 5}, cdims::DenseConvDims{3, 3, 3, 6, 3}, ::Val{(3, 3, 1)}, ::Val{1}, ::Val{(0, 0, 0, 0, 0, 0)}, ::Val{(1, 1, 1)}, ::Val{(1, 1, 1)}, fk::Val{false}; alpha::Measurement{Float32}, beta::Bool)
    @ NNlib ~/.julia/packages/NNlib/TAcqa/src/impl/conv_direct.jl:111
  [3] conv_direct!(y::Array{Measurement{Float32}, 5}, x::Array{Measurement{Float32}, 5}, w::Array{Float32, 5}, cdims::DenseConvDims{3, 3, 3, 6, 3}; alpha::Measurement{Float32}, beta::Bool)
    @ NNlib ~/.julia/packages/NNlib/TAcqa/src/impl/conv_direct.jl:50
  [4] conv_direct!
    @ ~/.julia/packages/NNlib/TAcqa/src/impl/conv_direct.jl:50 [inlined]
  [5] #conv!#288
    @ ~/.julia/packages/NNlib/TAcqa/src/conv.jl:288 [inlined]
  [6] conv!
    @ ~/.julia/packages/NNlib/TAcqa/src/conv.jl:284 [inlined]
  [7] conv!(y::Array{Measurement{Float32}, 4}, x::Array{Measurement{Float32}, 4}, w::Array{Float32, 4}, cdims::DenseConvDims{2, 2, 2, 4, 2}; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ NNlib ~/.julia/packages/NNlib/TAcqa/src/conv.jl:145
  [8] conv!
    @ ~/.julia/packages/NNlib/TAcqa/src/conv.jl:145 [inlined]
  [9] conv(x::Array{Measurement{Float32}, 4}, w::Array{Float32, 4}, cdims::DenseConvDims{2, 2, 2, 4, 2}; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ NNlib ~/.julia/packages/NNlib/TAcqa/src/conv.jl:88
 [10] conv
    @ ~/.julia/packages/NNlib/TAcqa/src/conv.jl:86 [inlined]
 [11] (::Conv{2, 4, typeof(identity), Array{Float32, 4}, Vector{Float32}})(x::Array{Measurement{Float32}, 4})
    @ Flux ~/.julia/packages/Flux/7nTyc/src/layers/conv.jl:166
 [12] top-level scope
    @ REPL[8]:1
 [13] top-level scope
    @ ~/.julia/packages/CUDA/5jdFl/src/initialization.jl:52

@DhairyaLGandhi's suggestion from Slack's #machine-learning to set the weights as Measurements doesn't fix the issue:

julia> c2 = Conv(measurement.(c.weight, 0.0f0), measurement.(c.bias, 0.0f0))
Conv((3, 3), 3 => 1)  # 28 parameters

julia> typeof(c2)
Conv{2, 4, typeof(identity), Array{Measurement{Float32}, 4}, Vector{Measurement{Float32}}}

julia> c2(m)
ERROR: UndefRefError: access to undefined reference
Stacktrace:
  [1] getindex
    @ ./array.jl:862 [inlined]
  [2] conv_direct!(y::Array{Measurement{Float32}, 5}, x::Array{Measurement{Float32}, 5}, w::Array{Measurement{Float32}, 5}, cdims::DenseConvDims{3, 3, 3, 6, 3}, ::Val{(3, 3, 1)}, ::Val{1}, ::Val{(0, 0, 0, 0, 0, 0)}, ::Val{(1, 1, 1)}, ::Val{(1, 1, 1)}, fk::Val{false}; alpha::Measurement{Float32}, beta::Bool)
    @ NNlib ~/.julia/packages/NNlib/TAcqa/src/impl/conv_direct.jl:111
  [3] conv_direct!(y::Array{Measurement{Float32}, 5}, x::Array{Measurement{Float32}, 5}, w::Array{Measurement{Float32}, 5}, cdims::DenseConvDims{3, 3, 3, 6, 3}; alpha::Measurement{Float32}, beta::Bool)
    @ NNlib ~/.julia/packages/NNlib/TAcqa/src/impl/conv_direct.jl:50
  [4] conv_direct!
    @ ~/.julia/packages/NNlib/TAcqa/src/impl/conv_direct.jl:50 [inlined]
  [5] #conv!#288
    @ ~/.julia/packages/NNlib/TAcqa/src/conv.jl:288 [inlined]
  [6] conv!
    @ ~/.julia/packages/NNlib/TAcqa/src/conv.jl:284 [inlined]
  [7] conv!(y::Array{Measurement{Float32}, 4}, x::Array{Measurement{Float32}, 4}, w::Array{Measurement{Float32}, 4}, cdims::DenseConvDims{2, 2, 2, 4, 2}; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ NNlib ~/.julia/packages/NNlib/TAcqa/src/conv.jl:145
  [8] conv!
    @ ~/.julia/packages/NNlib/TAcqa/src/conv.jl:145 [inlined]
  [9] conv(x::Array{Measurement{Float32}, 4}, w::Array{Measurement{Float32}, 4}, cdims::DenseConvDims{2, 2, 2, 4, 2}; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ NNlib ~/.julia/packages/NNlib/TAcqa/src/conv.jl:88
 [10] conv
    @ ~/.julia/packages/NNlib/TAcqa/src/conv.jl:86 [inlined]
 [11] (::Conv{2, 4, typeof(identity), Array{Measurement{Float32}, 4}, Vector{Measurement{Float32}}})(x::Array{Measurement{Float32}, 4})
    @ Flux ~/.julia/packages/Flux/7nTyc/src/layers/conv.jl:166
 [12] top-level scope
    @ REPL[11]:1
 [13] top-level scope
    @ ~/.julia/packages/CUDA/5jdFl/src/initialization.jl:52

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions