Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neural network 为什么我在Julia中编写的这个softmax函数不能更改输入数据?_Neural Network_Julia - Fatal编程技术网

Neural network 为什么我在Julia中编写的这个softmax函数不能更改输入数据?

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

我已经用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

我知道有些事情我不明白,但我不知道那可能是什么。任何帮助都将不胜感激:)

您需要将
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)
,这将为您确定迭代顺序。谢谢您的性能提示!