Итак. Прежде всего, я новичок в нейронной сети (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
, и т. Д. 1053 * ...), функция потерь будет увеличиваться. См. Изображение ниже:
Where: y1: Nₜᵣ=10, y2: Nₜᵣ=15, y3: Nₜᵣ=25.
So, my main question:
- Why is this happening?. I can not see an explanation for this behavior. Is this somehow expected?
Remarks: Note that
- All elements from the training data set (input and output) are normalized to [-1,1].
- I have not tryed changing the activ. functions
- I have not tryed changing the optimization method
Соображения: мне нужен набор обучающих данных из почти 10000 входных векторов, поэтому я ожидаю еще худшего сценария ...
Некоторые личные мысли:
- Правильно ли я размещаю свой тренировочный набор данных ?. Скажем, если каждый вектор данных состоит из 63 чисел, правильно ли сгруппировать их в массив? а затем сложите их в ´´´Array {Array {Float64,1}, 1} ´´´ ?. У меня нет опыта использования NN и flux . Как я могу по-другому создать набор данных из 10000 векторов ввода-вывода? Может в этом проблема ?. (Я очень к этому склоняюсь)
- Может ли такое поведение быть связано с выбранными функциями act. ? (Я не склонен к этому)
- Может ли такое поведение быть связано с алгоритмом opt. ? (Я не склонен к этому)
- Я неправильно тренирую свою модель ?. Является ли итерация l oop на самом деле итераций или это эпох . Я изо всех сил пытаюсь применить (различить) эту концепцию «эпох» и «итераций» на практике.