在Julia中使用ForwardDiff自动区分



我在Julia中正确使用ForwardDiff包时遇到了一些问题。我已经设法在以下代码块中隔离了我的问题。

简而言之,我定义了函数:

using ForwardDiff
function likelihood(mu,X)
  N = size(X,2)
  # Calculate likelihood
  aux = zeros(N)
  for nn=1:N
    aux[nn] = exp(-0.5 * (X[:,nn]-mu)' *  (X[:,nn]-mu))[1]
  end
  # return log-likelihood
  return sum(log(aux))
end

然后我检查该功能是否有效:

# Check if function works at all
X = randn(2,3) # some random data
mu = [1.0;2.0] # arbitrary mean
@show likelihood(mu,X) # works fine for me

然后,我尝试使用以下方法获取梯度:

ForwardDiff.gradient( ARG -> likelihood(ARG, X), mu)

不幸的是,这失败了,我在屏幕上看到:

错误: 方法

错误: convert没有方法匹配 convert(::Type{Float64}, ::ForwardDiff.Dual{2,Float64}) 这可能有 源于对构造函数 Float64(...) 的调用,因为类型 构造函数回退到转换方法。最接近的候选人是:
call{T<:AbstractFloat}(::Type{T<:AbstractFloat}, ::Real, ::RoundingMode{T}) call{T}(::Type{T}, ::Any)
convert(::Type{Float64}, ::Int8) ... 在无:10 in 的可能性 匿名 无:1

我做错了什么?谢谢,提前。

我只是被告知这是我这边的一个粗心的错误,尽管未经训练的眼睛很难发现。

错误出现在调用零时:

aux = zeros(N)

将其更改为

aux = zeros(eltype(mu),N)

解决了问题。希望这对其他人有用。

相关内容

  • 没有找到相关文章

最新更新