朱莉娅函数调用的歧义
ambuigity on function call in julia
我有这个错误
ERROR: MethodError: vcat(::Array{Real,2}, ::TrackedArray{…,Array{Float32,2}}) is ambiguous. Candidates:
vcat(364::AbstractArray, x::Union{TrackedArray, TrackedReal}, xs::Union{Number, AbstractArray}...) in Tracker at C:\Users\Henri\.julia\packages\TrackerwcYJ\src\lib\array.jl:167
vcat(A::Union{AbstractArray{T,2}, AbstractArray{T,1}} where T...) in Base at abstractarray.jl:1296
Possible fix, define
vcat(::Union{AbstractArray{T,2}, AbstractArray{T,1}} where T, ::Union{TrackedArray{T,1,A} where A<:AbstractArray{T,1} where T, TrackedArray{T,2,A} where A<:AbstractArray{T,2} where T}, ::Vararg{Union{AbstractArray{T,2}, AbstractArray{T,1}} where T,N} where N)
告诉我两个 vcat()
函数不明确。我想使用 Base.vcat()
函数,但明确使用它会引发相同的错误。这是为什么 ?错误抛出的这个 "possible fix" 是什么?
此外,当我手动调用 REPL 中的每一行时,没有抛出任何错误。我不明白这种行为。只有当 vcat() 在另一个函数内部调用的函数中时才会发生这种情况。就像我下面的例子。
这是重现错误的代码:
using Flux
function loss(a, b, net, net2)
net2(vcat(net(a),a))
end
function test()
opt = ADAM()
net = Chain(Dense(3,3))
net2 = Chain(Dense(6,1))
L(a, b) = loss(a, b, net, net2)
data = tuple(rand(3,1), rand(3,1))
xs = Flux.params(net)
gs = Tracker.gradient(() -> L(data...), xs)
Tracker.update!(opt, xs, gs)
end
正如在 Henri.D 的评论中提到的,我们已经设法通过小心处理 a
的类型来修复它,它是 Float64
的 Array
, rand
返回的默认类型,而 net(a)
返回 Float32
的 TrackedArray
并且无法使用 a
.
vcat
I've managed to fix vcat
by changing your loss function with this: net2(vcat(net(a),Float32.(a)))
because vcat
couldn't concatenate as net(a)
was a Float32 Array
and a
a Float64
one. Then L(data...)
is a TrackedArray
of 1 element whereas I think you need a Float32
that's why I finally replace loss function
by net2(vcat(net(a),Float32.(a)))[1]
我有这个错误
ERROR: MethodError: vcat(::Array{Real,2}, ::TrackedArray{…,Array{Float32,2}}) is ambiguous. Candidates:
vcat(364::AbstractArray, x::Union{TrackedArray, TrackedReal}, xs::Union{Number, AbstractArray}...) in Tracker at C:\Users\Henri\.julia\packages\TrackerwcYJ\src\lib\array.jl:167
vcat(A::Union{AbstractArray{T,2}, AbstractArray{T,1}} where T...) in Base at abstractarray.jl:1296
Possible fix, define
vcat(::Union{AbstractArray{T,2}, AbstractArray{T,1}} where T, ::Union{TrackedArray{T,1,A} where A<:AbstractArray{T,1} where T, TrackedArray{T,2,A} where A<:AbstractArray{T,2} where T}, ::Vararg{Union{AbstractArray{T,2}, AbstractArray{T,1}} where T,N} where N)
告诉我两个 vcat()
函数不明确。我想使用 Base.vcat()
函数,但明确使用它会引发相同的错误。这是为什么 ?错误抛出的这个 "possible fix" 是什么?
此外,当我手动调用 REPL 中的每一行时,没有抛出任何错误。我不明白这种行为。只有当 vcat() 在另一个函数内部调用的函数中时才会发生这种情况。就像我下面的例子。
这是重现错误的代码:
using Flux
function loss(a, b, net, net2)
net2(vcat(net(a),a))
end
function test()
opt = ADAM()
net = Chain(Dense(3,3))
net2 = Chain(Dense(6,1))
L(a, b) = loss(a, b, net, net2)
data = tuple(rand(3,1), rand(3,1))
xs = Flux.params(net)
gs = Tracker.gradient(() -> L(data...), xs)
Tracker.update!(opt, xs, gs)
end
正如在 Henri.D 的评论中提到的,我们已经设法通过小心处理 a
的类型来修复它,它是 Float64
的 Array
, rand
返回的默认类型,而 net(a)
返回 Float32
的 TrackedArray
并且无法使用 a
.
vcat
I've managed to fix
vcat
by changing your loss function with this:net2(vcat(net(a),Float32.(a)))
becausevcat
couldn't concatenate asnet(a)
was aFloat32 Array
anda
aFloat64
one. ThenL(data...)
is aTrackedArray
of 1 element whereas I think you need aFloat32
that's why I finally replaceloss function
bynet2(vcat(net(a),Float32.(a)))[1]