我已经在Julia中编写了softmax函数。它逐行对矩阵执行softmax并更改矩阵。但是,当我调用REPL中的函数时,它对矩阵没有影响。我不明白为什么会发生这种情况,我真的希望得到一个解释。
"""
the following function performs softmax on a design matrix row by row
inputs: X:mxn matrix
output: none
"""
function softmax!(X::Array{Float64,2})
X = exp.(X)
for i = 1:size(X,1)
rowsum = sum(X[i,:])
X[i,:] /= rowsum
end
end下面是REPL中的一个示例调用:
julia> a = rand(2,5)
2×5 Array{Float64,2}:
0.069014 0.265159 0.489641 0.455672 0.0489479
0.274386 0.935308 0.41976 0.509558 0.234294
julia> softmax!(a)
julia> a
2×5 Array{Float64,2}:
0.069014 0.265159 0.489641 0.455672 0.0489479
0.274386 0.935308 0.41976 0.509558 0.234294如您所见,矩阵中没有任何变化。非常奇怪的是,如果我硬编码REPL中函数内部的内容,我会得到预期的效果。
julia> a = exp.(a)
2×5 Array{Float64,2}:
1.07145 1.30364 1.63173 1.57723 1.05017
1.31572 2.548 1.5216 1.66456 1.26402
julia> for i = 1:size(a,1)
rowsum = sum(a[i,:])
a[i,:] /= rowsum
end
julia> a
2×5 Array{Float64,2}:
0.161504 0.196502 0.245957 0.237742 0.158295
0.158256 0.306475 0.183019 0.200214 0.152037我知道有些事情我不明白,但我不知道那是什么。任何帮助都将不胜感激:)
发布于 2021-01-15 00:58:12
您需要用X .= exp.(X)替换X = exp.(X)。Julia是通过共享传递的,所以当您从这一点开始说X = exp.(X)时,函数中的X和您传递的X引用不同的内存。
还要注意的是,这种方法的效率相当低,因为julia使用列主要矩阵。如果你调换了你的问题并写下,
function softmax!(X::Array{Float64,2})
X .= exp.(X)
for j = 1:size(X,2)
@views rowsum = sum(X[:,j])
X[:,j] .*= 1/rowsum
end
end它将会快2倍左右
https://stackoverflow.com/questions/65723373
复制相似问题