Neural network 为什么我在Julia中编写的这个softmax函数不能更改输入数据?
我已经用Julia编写了softmax函数。它逐行对矩阵执行softmax并更改矩阵。但是,当我在REPL中调用函数时,它对矩阵没有影响。我不明白为什么会发生这种情况,我真的想得到一个解释Neural network 为什么我在Julia中编写的这个softmax函数不能更改输入数据?,neural-network,julia,Neural Network,Julia,我已经用Julia编写了softmax函数。它逐行对矩阵执行softmax并更改矩阵。但是,当我在REPL中调用函数时,它对矩阵没有影响。我不明白为什么会发生这种情况,我真的想得到一个解释 """ the following function performs softmax on a design matrix row by row inputs: X:mxn matrix output: none """ function soft
"""
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
我知道有些事情我不明白,但我不知道那可能是什么。任何帮助都将不胜感激:)您需要将
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倍左右,非常感谢!请注意,
X[:,j].*1/rowsum
表示X[:,j].=X[:,j].*1/rowsum
,因此是RHS上的一个切片。将其放入@视图中将有所帮助。比循环更简单的可能是X./=sum(X,dims=1)
,这将为您确定迭代顺序。谢谢您的性能提示!