1

У меня очень большой набор поездов, чтобы Matlab. И мне нужно делать крупномасштабную подготовку.Как тренировать нейронную сеть постепенно в Matlab? и итеративно объединить их

Возможно ли разбить набор тренировок на части и итеративно обучить сеть и на каждой итерации обновить «сеть», а не переписывать ее?

В приведенном ниже коде представлена ​​идея, и она не будет работать. На каждой итерации он обновляет сеть в зависимости от только подготовленного набора данных.

TF1 = 'tansig';TF2 = 'tansig'; TF3 = 'tansig';% layers of the transfer function , TF3 transfer function for the output layers 

net = newff(trainSamples.P,trainSamples.T,[NodeNum1,NodeNum2,NodeOutput],{TF1 TF2 TF3},'traingdx');% Network created 

net.trainfcn = 'traingdm' ; %'traingdm'; 
net.trainParam.epochs = 1000; 
net.trainParam.min_grad = 0; 
net.trainParam.max_fail = 2000; %large value for infinity 

while(1) // iteratively takes 10 data point at a time. 
p %=> get updated with following 10 new data points 
t %=> get updated with following 10 new data points 

[net,tr]    = train(net, p, t,[], []); 

end 
+0

Как сделать y ou знает, что это перезапись вместо обновления? Можете ли вы показать пример данных, так как я не совсем понимаю, что вы подразумеваете под «В каждой итерации он обновляет сеть в зависимости от только подготовленного набора данных»? Спасибо – lennon310

+0

Я использую нейронную сеть во временных рядах, чтобы предсказать несколько точек (90). Если я использую train(), на каждой итерации он перезаписывается в уже подготовленную часть. Я наблюдаю это за счет сравнения моих предсказанных значений и фактических значений. Со временем улучшения не было, и мои прогнозы были основаны только на обученной небольшой части данных. Вместо того, чтобы тренировать 1 000 000 точек данных, более эффективно тренировать его итерационно, я думаю. В настоящее время я пытаюсь функция adapt(), но я не вижу улучшения в моих прогнозах. Это был мой вопрос // это возможно с помощью adapt(). Спасибо. – Alper

+0

Прогнозы основаны только на обученных данных. В каждой моей итеративной тренировке я не смогу увидеть образец или поведение ранее подготовленных данных. – Alper

ответ

1

Вот пример того, как обучать NN итеративно (мини-партии) в MATLAB:

просто создать игрушку DataSet

[ x,t] = building_dataset; 

размер minibatch и номер

M = 420 
imax = 10; 

позволяет проверить прямой тренинг против обучения в мини-баре

net = feedforwardnet(70,'trainscg'); 
dnet = feedforwardnet(70,'trainscg'); 

стандарт обучения здесь: 1 один вызов с целыми данными

dnet.trainParam.epochs=100; 
[ dnet tr y ] = train(dnet, x, t ,'useGPU','only','showResources','no'); 

мера ошибки: MEA, легко измерить MSE или любой другой вы хотите

dperf = mean(mean(abs(t-dnet(x)))) 

это итерационный часть: 1 эпоха на вызов

net.trainParam.epochs=1; 
e=1; 

, пока мы не достигнем предыдущей ошибки методы, для сравнения эпохи

while perf(end)>dperf 

очень важно рандомизировать данные в каждую эпоху !!

idx = randperm(size(x,2)); 

поезд итеративно со всеми кусками данных

for i=1:imax 
     k = idx(1+M*(i-1) : M*i); 
     [ net tr ] = train(net, x(: , k), t(: , k)); 
    end 

вычислить производительность в каждой эпохе

perf(e) = mean(mean(abs(t-net(x)))) 
    e=e+1; 
end 

проверить производительность, мы хотим хороший квазигладкой и ехр (-х), как кривая

plot(perf) 
+0

Добро пожаловать в Stack Overflow, и спасибо за ваше представление! Чтобы помочь нам предоставить хороший ресурс для наибольшего числа программистов, не могли бы вы обновить свой ответ с некоторым объяснением, почему это хорошее решение вопроса? – gariepy

2

Я не получить шанс взглянуть на adapt функцию, но я подозреваю, что это обновление, а не перезаписывать. Чтобы проверить это утверждение, вам может потребоваться выбрать подмножество вашего первого фрагмента данных в качестве второго фрагмента в процессе обучения. Если он переписывается, когда вы используете обученную сеть с подмножеством для проверки вашего первого блока данных, предполагается, что он плохо прогнозирует данные, которые не относятся к подмножеству.

Я проверил его с помощью очень простой программы: тренируйте кривую y=x^2. Во время первого тренировочного процесса, я узнал набор данных [1,3,5,7,9]:.

m=6; 
    P=[1 3 5 7 9]; 
    T=P.^2; 
    [Pn,minP,maxP,Tn,minT,maxT] = premnmx(P,T); 
    clear net 
    net.IW{1,1}=zeros(m,1); 
    net.LW{2,1}=zeros(1,m); 
    net.b{1,1}=zeros(m,1); 
    net.b{2,1}=zeros(1,1); 
    net=newff(minmax(Pn),[m,1],{'logsig','purelin'},'trainlm'); 
    net.trainParam.show =100; 
    net.trainParam.lr = 0.09; 
    net.trainParam.epochs =1000; 
    net.trainParam.goal = 1e-3; 
    [net,tr]=train(net,Pn,Tn); 
    Tn_predicted= sim(net,Pn) 
    Tn 

Результата (обратите внимание, что выход масштабируется с той же ссылкой Если вы делаете стандартную нормализацию, убедитесь, что вы всегда наносите среднее и значение станд с 1-го обучающего набора для всех остальных):

Tn_predicted = 

    -1.0000 -0.8000 -0.4000 0.1995 1.0000 


Tn = 

    -1.0000 -0.8000 -0.4000 0.2000 1.0000 

Сейчас мы реализуем второй процесс обучения, с учебными данными [1,9]:

Pt=[1 9]; 
    Tt=Pt.^2; 
    n=length(Pt); 
    Ptn = tramnmx(Pt,minP,maxP); 
    Ttn = tramnmx(Tt,minT,maxT); 


    [net,tr]=train(net,Ptn,Ttn); 
    Tn_predicted= sim(net,Pn) 
    Tn 

Результат:

Tn_predicted = 

    -1.0000 -0.8000 -0.4000 0.1995 1.0000 


Tn = 

    -1.0000 -0.8000 -0.4000 0.2000 1.0000 

Обратите внимание, что данные с x=[3,5,7]; до сих пор точно предсказаны.

Однако, если мы тренируем только x=[1,9]; с самого начала:

clear net 
    net.IW{1,1}=zeros(m,1); 
    net.LW{2,1}=zeros(1,m); 
    net.b{1,1}=zeros(m,1); 
    net.b{2,1}=zeros(1,1); 
    net=newff(minmax(Ptn),[m,1],{'logsig','purelin'},'trainlm'); 
    net.trainParam.show =100; 
    net.trainParam.lr = 0.09; 
    net.trainParam.epochs =1000; 
    net.trainParam.goal = 1e-3; 
    [net,tr]=train(net,Ptn,Ttn); 
    Tn_predicted= sim(net,Pn) 
    Tn 

Смотреть результат:

Tn_predicted = 

    -1.0071 -0.6413 0.5281 0.6467 0.9922 


Tn = 

    -1.0000 -0.8000 -0.4000 0.2000 1.0000 

Примечания тренированной сетка не работает хорошо на x=[3,5,7];

Тест выше означает, что обучение основано на предыдущей сети вместо перезапуска. Причина, по которой вы ухудшаете производительность, - это реализовать только один раз для каждого блока данных (стохастический градиентный спуск, а не спуск градиента партии), поэтому общая кривая ошибок может еще не сходиться. Предположим, что у вас есть только два блока данных, вам может потребоваться переучивать кусок 1 после завершения учебного куска 2, затем переучивать кусок 2, затем кусок 1, так далее и т. Д. До тех пор, пока не будут выполнены некоторые условия. Если у вас гораздо больше кусков, вам может не понадобиться беспокоиться о 2-м по сравнению с 1-м эффектом тренировки. Онлайн-обучение просто выкидывает предыдущий набор данных независимо от того, компрометируют ли их обновленные веса.

+0

Благодарим за отзыв. В моем случае у меня очень большой набор данных, и моя цель - предсказать на 90 пунктов вперед. В этом случае у меня есть входные значения и точка вывода. Например, когда я тренирую первые 1000 данных, пока не дойдет до минимальной ошибки, которая имеет точность> 95%. После того, как он был обучен, когда я сделал то же самое для второй 1000 частей данных, он перезаписывает вес, а предиктор в основном ведет себя как последняя часть данных поезда. Я не смогу придумать решение этой проблемы. В итеративном обучении я должен держать курс обучения небольшим, а #ofepochs - небольшим. Спасибо. – Alper

+0

Для каждой итеративной тренировочной части данных я всегда стараюсь сохранить ее, пока данные тренировки не достигнут> 90% точности. – Alper

+0

Вместо первого обучения я делал adapt(). Я попробовал ваше предложение, но, к сожалению, я не видел никаких улучшений. В качестве доказательства на первом поезде данные поезда прекрасно вписываются, но после того, как я тренирую следующую 1000 частей данных, внезапно ранее подгоняемые данные не будут меняться. Поведение предсказания по-прежнему сосредоточено на последней обученной части данных на итерации и полностью игнорирует уже обученная часть данных. Какая должна быть оптимальная альфа (скорость обучения) для функции adapt()/В то время как для trainSamples.P, trainSamples.T должен быть только блок учебных образцов? – Alper