Подтвердить что ты не робот

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

Может ли кто-нибудь дать мне практический пример рекуррентной нейронной сети в (pybrain) python, чтобы предсказать следующее значение последовательности? (Я прочитал документацию на pybrain, и нет ясного примера для этого, я думаю.) Я также нашел это question. Но я не вижу, как это работает в более общем случае. Поэтому я спрашиваю, может ли кто-нибудь здесь выработать ясный пример того, как предсказать следующее значение последовательности в pybrain с рекуррентной нейронной сетью.

Чтобы привести пример.

Скажем, например, у нас есть последовательность чисел в диапазоне [1,7].

First run (So first example): 1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6

Second run (So second example): 1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6

Third run (So third example): 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7

and so on.

Теперь дается, например, начало новой последовательности: 1 3 5 7 2 4 6 7 1 3

что есть /- следующее значение (ы)

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


Дополнительно: как это можно сделать, если присутствует более 1 функции:

Пример:

Скажем, например, у нас есть несколько последовательностей (каждая последовательность, имеющая 2 функции) в диапазоне [1,7].

First run (So first example): feature1: 1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6
                              feature2: 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7


Second run (So second example): feature1: 1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6
                                feature2: 1 2 3 7 2 3 4 6 2 3 5 6 7 2 4 7 1 3 3 5 6    

Third run (So third example): feature1: 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7
                              feature2: 1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6

and so on.

Теперь дается, например, начало новых последовательностей:

                                            feature 1: 1 3 5 7 2 4 6 7 1 3

                                            feature 2: 1 2 3 7 2 3 4 6 2 4

что есть /- следующее значение (ы)


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

4b9b3361

Ответ 1

Исам Лараджи работал у меня, чтобы предсказать последовательность последовательностей, за исключением того, что моя версия pybrain требовала кортежа для объекта UnserpervisedDataSet:

from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.datasets import SupervisedDataSet,UnsupervisedDataSet
from pybrain.structure import LinearLayer
ds = SupervisedDataSet(21, 21)
ds.addSample(map(int,'1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6'.split()),map(int,'1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6'.split()))
ds.addSample(map(int,'1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6'.split()),map(int,'1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7'.split()))
net = buildNetwork(21, 20, 21, outclass=LinearLayer,bias=True, recurrent=True)
trainer = BackpropTrainer(net, ds)
trainer.trainEpochs(100)
ts = UnsupervisedDataSet(21,)
ts.addSample(map(int,'1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7'.split()))
[ int(round(i)) for i in net.activateOnDataset(ts)[0]]

дает:

=> [1, 2, 5, 6, 2, 4, 5, 6, 1, 2, 5, 6, 7, 1, 4, 6, 1, 2, 2, 3, 6]

Чтобы предсказать меньшие последовательности, просто подготовьте их как таковые, либо как субпоследовательности, либо как перекрывающиеся последовательности (здесь показано перекрытие):

from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.datasets import SupervisedDataSet,UnsupervisedDataSet
from pybrain.structure import LinearLayer
ds = SupervisedDataSet(10, 11)
z = map(int,'1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6 1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6 1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7'.split())
obsLen = 10
predLen = 11
for i in xrange(len(z)):
  if i+(obsLen-1)+predLen < len(z):
    ds.addSample([z[d] for d in range(i,i+obsLen)],[z[d] for d in range(i+1,i+1+predLen)])

net = buildNetwork(10, 20, 11, outclass=LinearLayer,bias=True, recurrent=True)
trainer = BackpropTrainer(net, ds)
trainer.trainEpochs(100)
ts = UnsupervisedDataSet(10,)
ts.addSample(map(int,'1 3 5 7 2 4 6 7 1 3'.split()))
[ int(round(i)) for i in net.activateOnDataset(ts)[0]]

дает:

=> [3, 5, 6, 2, 4, 5, 6, 1, 2, 5, 6]

Не слишком хорошо...

Ответ 2

Эти шаги предназначены для выполнения того, что вы просите в первой части вопроса.

1) Создайте контролируемый набор данных, который ожидает выборку и цель в своих аргументах,

 ds = SupervisedDataSet(21, 21)
 #add samples (this can be done automatically)
 ds.addSample(map(int,'1 2 4 6 2 3 4 5 1 3 5 6 7 1 4 7 1 2 3 5 6'.split()),map(int,'1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6'.split()))
 ds.addSample(map(int,'1 2 5 6 2 4 4 5 1 2 5 6 7 1 4 6 1 2 3 3 6'.split()),map(int,'1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7'.split()))

Следующий образец - это цель или метка y своего предшественника x. Мы помещаем число 21, потому что каждый образец имеет 21 числа или функции.

Обратите внимание, что для стандартных обозначений во второй половине вашего вопроса лучше вызывать feature1 и feature2 как sample1 и sample2 для последовательности, а функции обозначают числа в образце.

2) Создайте сеть, инициализируйте тренера и запустите 100 эпох

net = buildNetwork(21, 20, 21, outclass=LinearLayer,bias=True, recurrent=True)
trainer = BackpropTrainer(net, ds)
trainer.trainEpochs(100)

Обязательно установите аргумент recurrent как True

3) Создайте тестовые данные

ts = UnsupervisedDataSet(21, 21)
#add the sample to be predicted
ts.addSample(map(int,'1 3 5 7 2 4 6 7 1 3 5 6 7 1 4 6 1 2 2 3 7'.split()))

Мы создали неконтролируемый набор данных из-за предположения, что у нас нет ярлыков или целей.

4) Прогнозировать тестовый образец с помощью обученной сети

net.activateOnDataset(ts)

Это должно отображать значения ожидаемого fourth run.

Для второго случая, когда последовательность может иметь больше, чем образец, вместо создания контролируемого набора данных, создайте последовательный ds = SequentialDataSet(21,21). Затем, каждый раз, когда вы получаете новую последовательность, вызовите ds.newSequence() и добавьте образцы, которые вы вызываете в этой последовательности, используя ds.addSample().

Надеюсь, это ясно:)

Если вы хотите иметь полный код, чтобы сохранить проблемы с импортом библиотек, сообщите мне.