[Stove AI] Глубокое обучение 004-Рекуррентная нейронная сеть Элмана
(Библиотеки Python и номера версий, используемые в этой статье: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2)
Нейронная сеть Элмана — самая ранняя рекуррентная нейронная сеть, предложенная Элманом в 1990 году, также известная как SRN (простая рекуррентная сеть). SRN учитывает информацию о времени, и вывод текущего момента связан не только с вводом текущего момента, но также связан с вводом всех предыдущих моментов. SRN — это простейший тип структуры RNN, который по сравнению с традиционной двухуровневой полносвязной сетью с прямой связью добавляет только последовательные обратные связи к полносвязному слою.
Чтобы понять это просто, расчет предыдущей глубокой нейронной сети можно просто понять как: yt=f(Xt), в то время как SRN принимает результат предыдущего момента в качестве входных данных в модель, что эквивалентно yt=f (Xt,yt-1), благодаря этой рекурсии каждый результат yt связан не только со своим собственным вектором Xt, но и с выходным результатом yt-1 предыдущего момента, поэтому рекурсивным считается, что yt и все предыдущие Xt, Xt-1, Xt-2... связаны между собой, тогда yt эквивалентно «запоминанию» всех входных переменных X в предыдущие N моментов.
Так как же SRN сделал это? SRN обычно делится на четыре слоя: входной слой, скрытый слой, слой-преемник и выходной слой, В отличие от простой нейронной сети, упомянутой выше, слой-преемник играет роль временной переменной Var, которая получается в момент времени t-1. После результата yt-1 вывод yt-1 также сохраняется в Var, а затем вычисляется результат в момент времени t, Var также рассматривается как входная переменная, поэтому Var эквивалентен оператору задержки, достигающему памяти Цель состоит в том, чтобы вся структура сети могла адаптироваться к временным рядам. Как показано ниже:
Уровень петли на рисунке на самом деле является уровнем продолжения с другим именем.Нелегко увидеть временные характеристики этой сетевой структуры, поэтому он расширен как:
Изображение изРекуррентная нейронная сеть.
Для более сложных рекуррентных структур нейронной сети вы можете обратиться к сообщению в блогеВведение в рекуррентные нейронные сети (RNN, рекуррентные нейронные сети)
Итак, как построить и обучить модель SRN?
1. Создайте и обучите рекуррентную нейронную сеть Элмана.
1.1 Подготовьте набор данных
На этот раз мы автоматически генерируем ряд данных, ряд данных содержит четыре части данных, ниже приведена функция генерации данных.
# 准备数据集
# 用np生成一些序列数据,这个序列数据有四段
def waveform_dataset(points_num):
'''建立波形数据集,这个数据集含有四段,每一段的数据点数为points_num'''
stage1=1*np.cos(np.arange(points_num))
stage2=2*np.cos(np.arange(points_num))
stage3=3*np.cos(np.arange(points_num))
stage4=4*np.cos(np.arange(points_num))
dataset_X=np.array([stage1,stage2,stage3,stage4])# 4行points_num列
dataset_X=dataset_X.reshape(points_num*4,1) # 转变为:4*points_num行,一列,即为整个序列
amp1 = np.ones(points_num) # 每一段数据的幅度不同 分别是1,4,2,0.5
amp2 = 4 + np.zeros(points_num)
amp3 = 2 * np.ones(points_num)
amp4 = 0.5 + np.zeros(points_num)
dataset_y=np.array([amp1,amp2,amp3,amp4]).reshape(points_num*4,1)
return dataset_X,dataset_y
Вы можете посмотреть на распределение набора данных:
1.2 Построить и обучить модель
Переходя непосредственно к коду, здесь мы используем существующую функцию newelm() в модуле neurolab для построения модели SRN, включая двухслойную нейронную сеть.
# 构建并训练模型
import neurolab as nl
net = nl.net.newelm([[-2, 2]], [10, 1], [nl.trans.TanSig(), nl.trans.PureLin()])
# 创建两层的神经网络
net.layers[0].initf = nl.init.InitRand([-0.1, 0.1], 'wb')
net.layers[1].initf= nl.init.InitRand([-0.1, 0.1], 'wb')
net.init()
# 网络的初始化
error = net.train(dataset_X, dataset_y, epochs=3000, show=300, goal=0.01)
------------------------------------- потерять-- ------------------------------
Epoch: 300; Error: 0.08632353521527447; Epoch: 600; Error: 0.07758197978278435; Epoch: 900; Error: 0.047083147244329486; Epoch: 1200; Error: 0.03948011155907889; Epoch: 1500; Error: 0.03808612642771739; Epoch: 1800; Error: 0.03600983543384789; Epoch: 2100; Error: 0.04108011778013388; Epoch: 2400; Error: 0.0388262030539809; Epoch: 2700; Error: 0.033576743782171244; Epoch: 3000; Error: 0.03329548827926802; The maximum number of train epochs is reached
--------------------------------------------Заканчивать----- --------------------------------
1.3 Используйте обученную модель для прогнозирования новых выборок
Предположим здесь, что набор данных_X, используемый в обучающем наборе, является новой выборкой, затем посмотрите на разницу между полученными результатами и предсказанными значениями.
# 用训练好的模型预测新样本
predict_y=net.sim(dataset_X)
plt.plot(dataset_y,label='dataset')
plt.plot(predict_y,label='predicted')
plt.legend()
plt.title('Comparison of Truth and Predicted')
Конечно, мы также можем использовать функцию waveform_dataset() для генерации новых данных, а затем попытаться сделать прогноз с помощью обученной модели.
# 生成新的数据集
newset_X,newset_y=waveform_dataset(100)
predict_y=net.sim(newset_X)
plt.plot(newset_y,label='dataset')
plt.plot(predict_y,label='predicted')
plt.legend()
plt.title('Comparison of Truth and Predicted')
Можно обнаружить, что модель также может приблизительно предсказать вновь сгенерированные данные последовательности.
########################резюме########################## ######
1. Некоторые простые функции нейронной сети были интегрированы в нейролабораторию, например, простейшая модель рекуррентной нейронной сети — рекуррентная нейронная сеть Элмана.Для сложных или самоопределяемых рекуррентных нейронных сетей требуются другие, более сложные глубины.Среда обучения.
1. Модель циклической нейронной сети Элмана представляет собой простейшую структуру циклической нейронной сети, которая может решать только некоторые относительно простые задачи с последовательностью данных.
#################################################################
Примечание. Эта часть кода была загружена в (мой гитхаб), добро пожаловать на скачивание.
Использованная литература:
1. Классические примеры машинного обучения Python, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.