2015-07-13 9 views
1

Я обучил нейронную сеть, используя pybrain. Но когда я тестирую свою сеть, используя тот же ввод, что и тот, который используется для обучения, я получаю совершенно другой результат. Вот мой кодПочему сеть с синтезированным пирамином дает разные результаты даже при использовании ввода для обучения

from pybrain.structure import FeedForwardNetwork 
from pybrain.structure import LinearLayer, SigmoidLayer 
from pybrain.structure import FullConnection 
import numpy as np 
from pybrain.datasets import SupervisedDataSet 
from pybrain.supervised import BackpropTrainer 
from pybrain.tools.xml.networkreader import NetworkReader 
from pybrain.tools.xml.networkwriter import NetworkWriter 
from pybrain.utilities import percentError 

n = FeedForwardNetwork() 

inLayer = LinearLayer(2) 
hiddenLayer = SigmoidLayer(3) 
outLayer = LinearLayer(1) 

n.addInputModule(inLayer) 
n.addModule(hiddenLayer) 
n.addOutputModule(outLayer) 

in_to_hidden = FullConnection(inLayer, hiddenLayer) 
hidden_to_out = FullConnection(hiddenLayer, outLayer) 

n.addConnection(in_to_hidden) 
n.addConnection(hidden_to_out) 
n.sortModules() 

X = np.array(([3,5], [5,1], [10,2]),dtype=float) 
Y = np.array(([75], [82], [93]),dtype=float) 
X/=np.amax(X, axis=0) 
Y/=100 

print(n.activate([ 1, 2])) 
print(in_to_hidden.params) 
ds = SupervisedDataSet(2,1) 
for i in range(len(X)): 
    ds.addSample(X[i],Y[i]) 

trainer=BackpropTrainer(n,ds, learningrate=0.5, momentum=0.05,verbose=True) 
trainer.trainUntilConvergence(ds) 
trainer.testOnData(ds, verbose=True) 

Теперь, когда я хочу, чтобы проверить на входе с использованием кода print("Testing",n.activate([3,5])) я получаю ('Testing', array([ 1.17809308])). Я должен был иметь 0.75 для этого ввода n.activate([3,5]). Поэтому я не понимаю, почему этот странный результат

ответ

2

Если я правильно вас понимаю, это всего лишь один из аспектов проверки модели, который вы всегда должны предпринять. Сеть обычно стремится минимизировать свою ошибку по отношению ко всем данным обучения, но она не получит точно каждого результата. Вероятно, вы можете улучшить точность предсказания, запустив больше эпох с более скрытыми нейронами. Однако это в конечном итоге приведет к чрезмерной гибкости благодаря чрезмерной гибкости. Это немного балансирующий акт.

В качестве аналогии возьмите регресс. В линейном примере ниже модель не соответствует ни одной из обучающих (синих) данных, но обычно фиксирует тренд для синих и красных (внешних тестовых) данных. Использование линейного уравнения всегда давало бы мне неправильный ответ для всех данных, но это приличный аппроксиматор. Затем скажите, что я подхожу к полиномиальной линии тренда к данным. Теперь он обладает большей гибкостью, ударяя все синие точки, но ошибка в данных тестирования увеличилась.

regression

После того, как вы в вашей сети построены, необходимо перезапустить все ваши данные обратно через него. Затем вы можете проверить на absolute average deviation, MSE, MASE и т. Д. В дополнение к таким вещам, как проверка креста на k-fold. Ваш перенос ошибки основан на вашем приложении: при разработке я всегда мог бы быть в пределах 5% ошибки, и все, что превышает этот порог (что произойдет на втором графике), может иметь фатальные последствия. При обработке языка я мог бы переносить один или два реальных беспорядка и попытаться поймать их другим способом, если большинство предсказаний очень близки, поэтому я мог бы взять второй график.

Игра со скоростью обучения и импульсом может помочь сблизить лучшее решение.

EDIT: На основе комментариев

Комментарий «должен был быть в состоянии признать это» означает для меня что-то иное, чем основе нейронной сети. В сети нет даже неопределенной концепции памяти, она просто использует данные обучения для разработки сложного набора правил, чтобы попытаться минимизировать его ошибку во всех точках данных. Как только сеть обучается, у нее нет никакого воспоминания о какой-либо из данных обучения, ее просто оставляют спагетти шагов умножения, которые она будет выполнять на входных данных. Таким образом, независимо от того, насколько хороша ваша сеть, вы никогда не сможете перевернуть свои входы обучения точно так же, как правильно.

Идея «конвергенции» не может означать, что у вас хорошая сеть. Сеть может просто найти ошибку local minima и отказаться от обучения. Вот почему вы должны всегда проверяйте свои модели. Если вас не устраивает результат проверки, попробуйте улучшить модель:
- Просто заново запустите его снова. Случайная инициализация сети теперь может избежать локальных минимумов.
- Изменение количества нейронов.Это ослабляет или подтягивает гибкость модели
- Изменение скорости обучения и импульса
- Измените правило обучения, например. обмен от Levenberg-Marquardt на байесовскую регуляризацию

+0

мой вопрос, почему это дает совершенно другой результат, хотя моя сеть была обучена, пока она не сходится? он должен был иметь значение, близкое к фактическому. я должен указать, что значение, которое я использовал для тестирования, является значением, которое я использовал для обучения. поэтому моя сеть должна была ее распознать. – user3841581

+0

@ user3841581 Вот что я попытался проиллюстрировать графиком регрессии. Вы можете думать о линейной модели как о своей обученной сети. Вы можете видеть, что линия пересекает ни одну из данных обучения, например. прося ответа на пример обучения, даст другой результат, чем вы ожидаете. Я не могу сказать, является ли 1.178 - 0.75 большим расхождением, это зависит от ваших данных (если он колеблется от 1 до 1 мили, ошибка крошечная). Кроме того, сколько примеров данных вы тренируетесь в своей реальной модели? Если это всего 3 очка, то у вас никогда не будет отличной модели. – roganjosh

+0

Я понимаю, нам нужно больше примеров обучения. но моя модель не предполагает получить хороший результат для примера, используемого для его обучения? – user3841581

0

Я не вижу ничего странного в результате. Просто потому, что у вас есть учебный экземпляр с вводом [3,5] и вывод [0.75], это не означает, что сеть всегда должна выдавать тот же результат. Модель не просто запомнить учебных экземпляров.

+0

Я получил его сейчас. Я думал, что модель должна сохранить пример, который он использовал для обучения – user3841581