Neural network 使用Flux.jl理解损失函数行为的问题。在朱莉娅
所以。首先,我是神经网络(NN)的新手。 作为我博士学位的一部分,我试图通过NN解决一些问题。 为此,我创建了一个程序,创建了一些由 输入向量的集合(每个有63个元素)及其对应的 输出向量(每个有6个元素) 因此,我的程序如下所示:Neural network 使用Flux.jl理解损失函数行为的问题。在朱莉娅,neural-network,julia,Neural Network,Julia,所以。首先,我是神经网络(NN)的新手。 作为我博士学位的一部分,我试图通过NN解决一些问题。 为此,我创建了一个程序,创建了一些由 输入向量的集合(每个有63个元素)及其对应的 输出向量(每个有6个元素) 因此,我的程序如下所示: Nₜᵣ = 25; # number of inputs in the data set xtrain, ytrain = dataset_generator(Nₜᵣ); # generates In/Out vectors: xtrain
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
现在,xtrain
和ytrain
都属于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个元素被归一化为单位(表示x、y、z坐标),接下来的60个数字也被归一化为单位,并对应于一些可测量的属性
该计划继续如下:
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:Nₜᵣ=10,y2:Nₜᵣ=15,y3:Nₜᵣ=25
所以,我的主要问题是:
为什么会发生这种情况?。我无法解释这种行为。这是意料之中的事吗
备注:请注意
- 训练数据集中的所有元素(输入和输出)都被标准化为[-1,1]
- 我没有试着改变这个动作。功能
- 我没有尝试改变优化方法
注意事项:我需要一个近10000个输入向量的训练数据集,因此我预计会出现更糟糕的情况
一些个人想法:
- 我是否正确安排了培训数据集?。比如说,如果每个数据向量由63个数字组成,那么将它们分组到一个数组中是否正确?然后将它们堆成一个´´´数组{Array{Float64,1},1}´´´´?。我没有使用NN和通量的经验。如何以不同的方式创建10000个I/O向量的数据集?这就是问题所在吗?。(我非常倾向于此)
- 这种行为是否与所选择的行为有关。功能?(我不倾向于此)
- 此行为是否与opt相关。算法?(我不倾向于此)
- 我的模特训练错了吗?。迭代循环是真正的迭代还是时代。我正在努力将“时代”和“迭代”的概念付诸实践
您的损失没有正常化,因此添加更多数据只能增加此成本函数。然而,每个数据的成本似乎没有增加。为了消除这种影响,您可能希望通过使用均方成本之类的方法来使用标准化成本函数。谢谢您的回复。这是有道理的!。现在(这给我带来了问题),我从各种通量示例中看到(并复制)了这部分代码(进行训练的部分),我看不出在每次迭代中对函数loss(x,y)
的值进行求和有什么用。这个函数不是loss(x,y)
返回一个值吗?。在每次迭代中添加了什么?。再次感谢您的回复!顺便说一句:我在《我忘了@you》上发了一篇类似的帖子。我希望在其他地方发布同样的问题不会有问题。我只是觉得这个网站可能是针对一个更具体的流量观众
loss(x,y) = squaredCost(m(x),y); # define loss function