使用 Flux.jl 理解损失函数行为时遇到问题。在朱莉娅
Problem understanding Loss function behavior using Flux.jl. in Julia
所以。首先,我是神经网络 (NN) 的新手。
作为我博士的一部分,我正在尝试通过 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
现在,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{Array{Float64,1},1}´´´?。我没有使用 NN 和 flux 的经验。如何以不同方式制作 10000 I/O 个向量的数据集?这可能是问题吗? (我很倾向于这个)
- 此行为是否与所选的 act. 功能有关? (我不倾向于这个)
- 此行为是否与 opt. 算法有关? (我不倾向于这个)
- 我的模型训练有误吗?。迭代循环真的是 iterations 还是 epochs。我正在努力将“epochs”和“iterations”这个概念付诸实践。
loss(x,y) = squaredCost(m(x),y); # define loss function
您的损失未标准化,因此添加更多数据只会增加此成本函数。但是,每个数据的成本似乎并没有增加。要消除这种影响,您可能希望通过使用均方成本之类的操作来使用归一化成本函数。
所以。首先,我是神经网络 (NN) 的新手。 作为我博士的一部分,我正在尝试通过 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
现在,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{Array{Float64,1},1}´´´?。我没有使用 NN 和 flux 的经验。如何以不同方式制作 10000 I/O 个向量的数据集?这可能是问题吗? (我很倾向于这个)
- 此行为是否与所选的 act. 功能有关? (我不倾向于这个)
- 此行为是否与 opt. 算法有关? (我不倾向于这个)
- 我的模型训练有误吗?。迭代循环真的是 iterations 还是 epochs。我正在努力将“epochs”和“iterations”这个概念付诸实践。
loss(x,y) = squaredCost(m(x),y); # define loss function
您的损失未标准化,因此添加更多数据只会增加此成本函数。但是,每个数据的成本似乎并没有增加。要消除这种影响,您可能希望通过使用均方成本之类的操作来使用归一化成本函数。