循环神经网络是有一个状态和输入序列结合拟合出结果,然后状态会继续带入下一个序列
import numpy as np
X = [1,2] # 输入序列
state = [0.0,0.0] # 状态向量
# 分开定义不同输入部分的权重
w_cell_state = np.asarray([[0.1,0.2],[0.3,0.4]])
w_cell_input = np.asarray([0.5,0.6])
b_cell = np.asarray([0.1,-0.1])
#定义用于输出的全连接层参数
w_output = np.asarray([[1.0],[2.0]])
b_output = 0.1
# 按照时间顺序执行循环神经网络的前向传播过程
for i in range(len(X)):
print(i)
berfore_activation = np.dot(state,w_cell_input)+X[i]*w_cell_input +b_cell
state = np.tanh(berfore_activation)
# 根据当前时刻的状态计算出最终的输出
final_output = np.dot(state,w_output) + b_output
# 输出每个时刻的信息
print('before activation:',berfore_activation)
print("stae:",state)
print("output:",final_output)
'''
0
before activation: [ 0.6 0.5]
stae: [ 0.53704957 0.46211716]
output: [ 1.56128388]
1
before activation: [ 1.64579508 1.64579508]
stae: [ 0.92827835 0.92827835]
output: [ 2.88483504]
'''
LSTM初探
# 以下是伪代码
import tensorflow as tf
# 在tensorflow中LSTM结构的定义是可以用一个简单的命令生成
lstm = tf.nn.rnn_cell.BasicLSTMCell(lstm_hidden_size)
# 在LSTM中状态初始化全为0的数组
# state是一个包含了两个张量的类,state.c为遗忘门,state.h为输入门
state = lstm.zero_state(batch_size,tf.float32)
loss = 0.0
for i in range(num_steps)
#在第一个时刻声明LSTM结构中使用的变量,在之后的时刻都需要复用之前定义好的变量
if i>0:
tf.get_variable_scope().reuse_variables()
# 每一步处理时间序列中的一个时刻和前一时刻的状态传入LSTM中就可以得到当前LSTM的输出
lstm_output, state = lstm(current_input,state)
final_output = fully_connected(lstm_output)
loss += calc_loss(final_output,expected_output)
完整代码示例
import numpy as np
import tensorflow as tf
import matplotlib as mpl
mpl.us