赞
踩
需要全部代码请点赞关注收藏后评论区留言私信~~~
循环神经网络(Recurrent Neural Network,RNN)是用于对序列的非线性特征进行学习的深度神经网络。循环神经网络的输入是有前后关联关系的序列。
循环神经网络可以用来解决与序列有关的问题,如序列回归、序列分类和序列标注等任务。序列的回归问题,如气温、股票价格的预测问题,它的输入是前几个气温、股票价格的值,输出的是连续的预测值。序列的分类问题,如影评的正负面分类、垃圾邮件的检测,它的输入是影评和邮件的文本,输出的是预定的有限的离散的标签值。序列的标注问题,如自然语言处理中的中文分词和词性标注,循环神经网络可处理传统机器学习中的隐马尔可夫模型、条件随机场等模型胜任的标注任务。
类似隐马尔可夫链,把循环神经网络基本结构的中间部分称为隐层,向量s标记了隐层的状态。隐层的输出有两个,一个是y,另一个反馈到自身。到自身的反馈将与下一步的输入共同改变隐层的状态s。因此,隐层的输入也有两个,分别是当前输入x和来自自身的反馈(首步没有来自自身的反馈)。
输入样本的观测序列有两个分量x^(1),x^(2),即每次输入的步长数为2。观测序列的分量是3维的向量。隐状态是一个2维的向量s。输出是1维的标量,分别是y^(1),y^(2)。
TensorFlow2中Keras的SimpleRNN的类原型
- tf.keras.layers.SimpleRNNCell(
- units, activation='tanh', use_bias=True,
- kernel_initializer='glorot_uniform',
- recurrent_initializer='orthogonal',
- bias_initializer='zeros', kernel_regularizer=None,
- recurrent_regularizer=None, bias_regularizer=None, kernel_constraint=None,
- recurrent_constraint=None, bias_constraint=None, dropout=0.0,
- recurrent_dropout=0.0, **kwargs
- )
参数units设定该单元的状态向量s的维数。参数use_bias设定是否使用阈值参数θ。
用SimpleRnnCell来模拟循环神经网络前向传播
- import tensorflow as tf
-
- # (批大小, 步长数, 序列分量维数)
- batch_size = 1
- time_step = 2
- step_dim = 3
- hidden_dim = 2 # 隐状态维度
-
- s0 = tf.constant([[0.0, 0.0]]) # 第1步输入的隐状态
- x1 = tf.constant([[0.1, 0.2, 0.3]]) # 第1步输入的序列分量
- simpleRnnCell = tf.keras.layers.SimpleRNNCell(hidden_dim , use_bias=False)
- out1,s1 = simpleRnnCell(x1, [s0]) # 将当前步的x和上一步的隐状态输入到单元中,产生第1步的输出和隐状态
- print("out1:", out1)
- print("s1:", s1)
- >>> out1: tf.Tensor([[-0.05700448 0.2253606 ]], shape=(1, 2), dtype=float32)
- s1: [<tf.Tensor: id=53, shape=(1, 2), dtype=float32, numpy=array([[-0.05700448, 0.2253606 ]], dtype=float32)>]
- x2 = tf.constant([[0.2, 0.3, 0.4]]) # 第2步输入的序列分量
- out2,s2 = simpleRnnCell(x2, [s1[0]]) # 将当前步的x和上一步的隐状态输入到单元中,产生第2步的输出和隐状态
- print("out2:", out2)
- print("s2:", s2)
- >>> out2: tf.Tensor([[-0.198356 0.54249984]], shape=(1, 2), dtype=float32)
- s2: [<tf.Tensor: id=62, shape=(1, 2), dtype=float32, numpy=array([[-0.198356 , 0.54249984]], dtype=float32)>]
one to many结构是单输入多输出的结构,可用于输入图片给出文字说明。many to one结构是多输入单输出的结构,可用于文本分类任务,如影评情感分类、垃圾邮件分类等。many to many delay结构也是多输入多输出的结构,但它是有延迟的输出,该结构常用于机器翻译,机器问答等。
该示例是对三角函数的值进行预测,先对sin三角函数值顺序采点,然后用一段值序列来预测紧接的第1个值。
基本结构采用了TensorFlow中Keras的SimpleRNN,它实现了RNN基本单元。它的输入有两个重要的参数:units和input_shape。units是设定该单元的状态向量s的维数,它的大小决定了W矩阵的维度。input_shape设定了输入的序列的长度和每个序列元素的特征数,每个序列元素的特征数和units共同决定了U矩阵的维度。
输入序列的长度决定了SimpleRNN的循环步数,在最后一步,将状态向量s输出到一个全连接层,该连接层输出为1维的预测值,因此V矩阵的维度是units×1。
预测结果如下
部分代码如下
- import numpy as np
- np.random.seed(0)
-
- def myfun(x):
- '''目标函float):自变量
- output:函数值'''
- return np.sin(x)
-
- x = np.linspace(0,15, 150)
- y = myfun(x) + 1 + np.random.random(size=len(x)) * 0.3 - 0.15
-
- input_len = 10
-
- train_x = []
- train_y = []
- for i in range(len(y)-input_len):
- train_data = []
- for j in range(input_len):
- train_data.append([y[i+j]])
- train_x.append(train_data)
- train_y.append((y[i+input_len]))
- import tensorflow as tf
-
- model = tf.keras.Sequential()
- model.add(tf.keras.layers.SimpleRNN(100, return_sequences=False,
- activation='relu',
- input_shape=(input_len, 1)))
- model.add(tf.keras.layers.Dense(1))
- model.add(tf.keras.layers.Activation("relu"))
- model.compile(lopochs=10, batch_size=10, verbose=1)
-
- import matplotlib.pyplot as plt
- plt.rcParams['axes.unicode_minus']=False
- plt.rc('font', family='SimHei', size=13)
- #plt.scatter(x, y, color="black", linewidth=1)
- y0 = myfun(x) + 1
- plt.plot(x, y0, color="red", linewidth=1)
- y1 = model.predict(train_x)
- plt.plot(x[input_len:], y1, "b--", linewidth=1)
- plt.show()
创作不易 觉得有帮助请点赞关注收藏~~~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。