首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我在Julia中编写的softmax函数不能更改输入数据?

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

Stack Overflow用户
提问于 2021-01-15 00:56:35
回答 1查看 39关注 0票数 2

我已经在Julia中编写了softmax函数。它逐行对矩阵执行softmax并更改矩阵。但是,当我调用REPL中的函数时,它对矩阵没有影响。我不明白为什么会发生这种情况,我真的希望得到一个解释。

代码语言:javascript
复制
"""
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中的一个示例调用:

代码语言:javascript
复制
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中函数内部的内容,我会得到预期的效果。

代码语言:javascript
复制
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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-15 00:58:12

您需要用X .= exp.(X)替换X = exp.(X)。Julia是通过共享传递的,所以当您从这一点开始说X = exp.(X)时,函数中的X和您传递的X引用不同的内存。

还要注意的是,这种方法的效率相当低,因为julia使用列主要矩阵。如果你调换了你的问题并写下,

代码语言:javascript
复制
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倍左右

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65723373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档