gpt4 book ai didi

neural-network - 使用 Flux.jl 理解损失函数行为的问题。在 Julia

转载 作者:行者123 更新时间:2023-12-04 09:14:49 29 4
gpt4 key购买 nike

所以。首先,我是神经网络(NN)的新手。
作为博士学位的一部分,我正在尝试通过神经网络解决一些问题。
为此,我创建了一个程序来创建一些数据集
输入向量的集合(每个向量有 63 个元素)及其对应的
输出向量(每个向量有 6 个元素)。
所以,我的程序是这样的:

Nₜᵣ            = 25;   # number of inputs in the data set
xtrain, ytrain = dataset_generator(Nₜᵣ); # generates In/Out vectors: xtrain/ytrain
datatrain = zip(xtrain,ytrain); # ensamble my data
现在,两个 xtrainytrain属于 Array{Array{Float64,1},1} 类型, 意思是
如果(说) Nₜᵣ = 2 , 他们看着像是:
julia> xtrain    #same for ytrain
2-element Array{Array{Float64,1},1}:
[1.0, -0.062, -0.015, -1.0, 0.076, 0.19, -0.74, 0.057, 0.275, ....]
[0.39, -1.0, 0.12, -0.048, 0.476, 0.05, -0.086, 0.85, 0.292, ....]
每个向量的前3个元素被归一化为unity(代表x,y,z坐标),后面的60个数字也被归一化为unity,对应一些可测量的属性。
该计划继续如下:
layer1 = Dense(length(xtrain[1]),46,tanh); # setting 6 layers
layer2 = Dense(46,36,tanh) ;
layer3 = Dense(36,26,tanh) ;
layer4 = Dense(26,16,tanh) ;
layer5 = Dense(16,6,tanh) ;
layer6 = Dense(6,length(ytrain[1])) ;

m = Chain(layer1,layer2,layer3,layer4,layer5,layer6); # composing the layers

squaredCost(ym,y) = (1/2)*norm(y - ym).^2;
loss(x,y) = squaredCost(m(x),y); # define loss function

ps = Flux.params(m); # initializing mod.param.
opt = ADAM(0.01, (0.9, 0.8)); #

最后:
trainmode!(m,true)
itermax = 700; # set max number of iterations
losses = [];
for iter in 1:itermax
Flux.train!(loss,ps,datatrain,opt);
push!(losses, sum(loss.(xtrain,ytrain)));
end
它运行得很好,但是,我注意到当我用增加的数据集( Nₜᵣ = 10,15,25 等)训练我的模型时,损失函数接缝增加。见下图:
y1: 10, y2=15, y3=25
其中:y1:Nₜᵣ=10,y2:Nₜᵣ=15,y3:Nₜᵣ=25。
所以,我的主要问题是:
  • 为什么会这样? .我看不到这种行为的解释。这是以某种方式预期的吗?

  • 备注:注意
  • 训练数据集中的所有元素(输入和输出)都归一化为 [-1,1]。
  • 我还没有尝试改变事件。功能
  • 我还没有尝试改变优化方法
  • 注意事项:我需要一个包含近 10000 个输入向量的训练数据集,所以我期待更糟糕的情况......
  • 一些个人想法:
  • 我是否正确安排了我的训练数据集?比如说,如果每个数据向量都由 63 个数字组成,那么将它们分组在一个数组中是否正确?然后将它们堆成一个´´´Array{Array{Float64,1},1}´´´?。我没有使用 NN 和 的经验助焊剂 .如何以不同的方式制作 10000 个 I/O 向量的数据集?这可能是问题吗?。 (我很倾向于这个)
  • 这种行为是否与所选择的行为有关。职能? (我不倾向于这个)
  • 这种行为是否与 opt.算法? (我不倾向于这个)
  • 我训练我的模型错了吗?迭代循环是真正的迭代还是时代。我正在努力将(区分)这个“时代”和“迭代”的概念付诸实践。
  • 最佳答案

    loss(x,y)         = squaredCost(m(x),y); # define loss function
    您的损失未标准化,因此添加更多数据只会增加此成本函数。然而,每条数据的成本似乎并没有增加。为了摆脱这种影响,您可能希望通过使用均方成本之类的方法来使用归一化成本函数。

    关于neural-network - 使用 Flux.jl 理解损失函数行为的问题。在 Julia ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63273996/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com