Machine learning 通量模型参数崩溃为零

Machine learning 通量模型参数崩溃为零,machine-learning,julia,Machine Learning,Julia,我一直在使用Flux.jl库,希望创建一个简单的概念验证自动编码器。在引用了之后,我创建了以下玩具模型,它沿着y=x^2曲线进行输入 在R^2中,并在将其发送到一维代码层表示后尝试重建: using Flux using Flux: @epochs, onehotbatch, mse, throttle#, params using Base.Iterators: partition using Distributions ##creating simple 2-1-2 AE function

我一直在使用Flux.jl库,希望创建一个简单的概念验证自动编码器。在引用了之后,我创建了以下玩具模型,它沿着y=x^2曲线进行输入 在R^2中,并在将其发送到一维代码层表示后尝试重建:

using Flux
using Flux: @epochs, onehotbatch, mse, throttle#, params
using Base.Iterators: partition
using Distributions
##creating simple 2-1-2 AE
function build_train_data()
    function gen()
        x=rand(Uniform(0,1),1,10)
        y=x.^2
        xy = vcat(x,y)
        return xy
    end
    
    train_data=[gen() for i in 1:10]
    return train_data
end

function train()
    train_data=build_train_data()
    encoder=Dense(2,1,relu)
    decoder=Dense(1,2,relu)
    model = Chain(
        encoder,
        decoder
    )

    @info("Training model.....")
    loss(x) = mse(model(x),x)
    lr=1e-3
    opt = ADAM(lr)
    evalcb = throttle(() -> @show(loss(train_data[1])), 1)
    @epochs 100 Flux.train!(loss, Flux.params(model), zip(train_data), opt, cb = evalcb)
    return model
end

m =train()
td=build_train_data()
现在,我不指望这个模型会有月亮。尽管如此,我并未预期会产生以下结果:

x=[0.9860286863631649 0.9209976855681348 0.6793548732252492 0.909752849042454 0.6926766153752839 0.9622926489586887 0.9639670701324241 0.8053711974593387 0.19502650255217913 0.38968830975794666; 0.9722525703310686 0.8482367368218608 0.46152304377489445 0.8276502463408622 0.479800893487759 0.9260071422399301 0.9292325122996898 0.6486227656970891 0.03803533669773513 0.15185697876200538]
m(x)=Float32[0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.96854496 0.84631497 0.46364155 0.8260073 0.4818032 0.92298573 0.9261639 0.6491447 0.0359351 0.15342757]
Flux.params(m)=Params([Float32[0.058760125 1.4413338], Float32[-0.0049902047], Float32[-1.0241822; 0.6694982], Float32[0.0, -0.005099244]])
一轮培训和

x=[0.4789886773906975 0.8739656341280784 0.8535570077535617 0.6553854355816602 0.5611963054162175 0.22277653137378484 0.8716704866290759 0.30803815544599367 0.6973631796646094 0.07522895316317268; 0.22943015306848968 0.7638159296368942 0.7285595654852137 0.4295300691725624 0.31494129321281245 0.04962938293093494 0.7598094372601699 0.09488750521057016 0.48631540435193427 0.00565939539402683]
m(x)=Float32[0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0]
Flux.params(m)=Params([Float32[-0.071433514 -0.4906463], Float32[0.0], Float32[-0.14397836; 0.5831637], Float32[0.0, 0.0]])
另一方面


如您所见,在前一种情况下,对于“x^2”行输入,重建似乎工作得足够好,这使我相信模型至少部分工作。这个问题的根源一直没有找到我通常使用的一套调试技术,这让我相信问题的根源可能在于打字,(缺乏)GPU利用率,或者其他更为特殊的东西julian。

奇怪的是,将激活函数从“relu”改为“leakyrelu”似乎可以解决这个问题。我觉得你的符号很混乱。什么是
x
m(x)
。我也不明白“输出”是如何“输出”的。而且它们在同一行上,因此很难读取。@小戴x是输入,m(x)是输入x的模型输出。我相信这是标准,尽管我可能错了。我不知道你所说的输出是什么意思,但我相信m(x)是x的重构。另外,你能详细解释一下“他们”在同一条线上是什么意思吗?谢谢你的代码,它叫
model
not
m
。不管怎样,读了你的文章后,我还是不明白问题出在哪里。奇怪的是,将激活函数从“relu”改为“leakyrelu”似乎可以解决问题。我发现你的符号非常混乱。什么是
x
m(x)
。我也不明白“输出”是如何“输出”的。而且它们在同一行上,因此很难读取。@小戴x是输入,m(x)是输入x的模型输出。我相信这是标准,尽管我可能错了。我不知道你所说的输出是什么意思,但我相信m(x)是x的重构。另外,你能详细解释一下“他们”在同一条线上是什么意思吗?谢谢你的代码,它叫
model
not
m
。无论如何,读了你的文章后,我还是不明白问题出在哪里。