2016-01-16 2 views
0

создать нейронную сеть, как это:PyBrain: переполнение встречается в квадрате, недопустимое значение встречается в многосвязной

n = FeedForwardNetwork() 

inLayer = LinearLayer(43) 
bias = BiasUnit() 
hiddenLayer = SigmoidLayer(100) 
outLayer = LinearLayer(1) 

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

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

n.addConnection(in_to_hidden) 
n.addConnection(bias_to_hidden) 
n.addConnection(hidden_to_out) 

n.sortModules() 

Я тренирую его следующим образом (я упрощая, это проходит обучение в нескольких итераций):

self.trainer = BackpropTrainer(self.neural_net, learningrate=0.8) 
(...) 
ds = SupervisedDataSet(self.net_input_size, 1) 
ds.addSample([...], np.float64(learned_value)) 
(...) 
self.trainer.trainOnDataset(ds) 

Иногда я получаю следующие предупреждения:

(...)/Lib/python3.5/сайт-пакеты/PyBrain-0.3.1-py3.5.egg/pybr ain/supervised/trainers/backprop.py: 99: RuntimeWarning: переполнение встречается в квадрате ошибка + = 0,5 * сумма (outerr ** 2)

(...)/lib/python3.5/site-packages /PyBrain-0.3.1-py3.5.egg/pybrain/structure/modules/sigmoidlayer.py:14: RuntimeWarning: недопустимое значение, возникающее при умножении inerr [:] = outbuf * (1 - outbuf) * outerr

А потом, когда я проверяю сохраненный чистый файл, я вижу, что все веса nan:

(...) 
<FullConnection class="pybrain.structure.connections.full.FullConnection" name="FullConnection-8"> 
    <inmod val="BiasUnit-5"/> 
    <outmod val="SigmoidLayer-11"/> 
    <Parameters>[nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]</Parameters> 
</FullConnection> 
(...) 
+1

Вы скорость обучения слишком высок. Нормальные ставки (основанные на проблеме) составляют примерно 0,01 или 0,001, например. Если вы изучаете скорость настолько высоко, и особенно, если вы тренируете огромное количество эпох, ваши веса могут стать слишком высокими, следовательно, расходятся с значениями NaN. – daniel451

+0

@ascenator Но проблема возникает только в начале (скажем, первые 20 или 30 эпох) - никогда позже. – Luke

+0

@ascenator Возможно, вы правы. Я провел пару тестов с частотой обучения в 0,1 и не видел никаких предупреждений. – Luke

ответ

1

Как было предложено, здесь приходит ответ:

Наличие обучения скорость 0,8 неэффективен, так как он может привести к ошибкам, как ваша и препятствовать эффективному обучению сети.

С такой высокой скоростью обучения, на основе вашей функции затрат, сеть может легко изменить веса очень больших количествах, поэтому вес может переполнить в значения NaN.

Вообще (даже если ваш вес не переполнение в значения NaN) высокая скорость обучения не является хорошей идеей, с точки зрения обучения, тоже. Вы решаете конкретные проблемы, учась в большом наборе данных обучения. Если вы изучаете скорость очень высоко, например 0,8, сеть очень быстро адаптирует к данным текущей эпохи. Большая часть информации/изученных особенностей прежней эпохи будет полностью потеряна, потому что сеть сильно настроена на частоту ошибок текущей эпохи.

Для большинства проблем, типичные скорости обучения являются что-то вроде 0,01 или 0,001 или даже меньше, потому что вы хотите сделать небольшой вывод из одной эпохи и достаточно изучить инвариантные черты нескольких эпох.

Смежные вопросы