循环神经网络的特点

相比于普通的神经网络,在一个时间点只能输入一个输入值,同时得到一个输出值,在下一个时间点输入下一个输入值,输出下一个输出值,前一个神经网络和后一个神经网络作用之间没有任何的联系。但是在某些任务中需要能够更好的处理序列信息,即前面的输入和后面的输入之间是有相互联系的

像在我们说话的时候,接收方的理解不能只依靠于当前我们所说出来的话进行理解,需要结合之前说话的语境,才会有更加准确的理解。当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。

循环神经网络(RNN)就可以很好的解决机器学习中需要前后有关联的事件的学习
假设在t时刻我们输入值经过s(t)函数得到一个输出值,在t+1时刻,输出值所得到的结果是s(t)和s(t+1)函数共同作用与输入值的。

普通RNN的弊端和LSTM(Long Short-Term Memory:长短期记忆)技术

个人还不是很能理解该机制,参考https://zhuanlan.zhihu.com/p/24813287

循环神经网络的基本框架

基本环境的配置

  1. import numpy as np
  2. np.random.seed(1337)
  3. from keras.datasets import mnist
  4. from keras.utils import np_utils
  5. from leras.model import Sequential
  6. from keras.layers import SimpleRNN,Activation,Dense
  7. from keras.optimizer import Adam
  8. TIME_STEPS = 28 ##每一次读取28行
  9. INPUT_SIZE = 28 ##每一行读取28个像素
  10. BATCH_SIZE = 50 ##每一批训练的图片的个数
  11. BATCH_INDEX = 0 ##
  12. OUTPUT_SIZE = 10 ##第三维度为10个数,用于拓展维度
  13. CELL_SIZE = 50 ##定义RNN中存放的神经元的个数
  14. LR = 0.001
  15. (x_train,y_train),(x_test,y_test) = mnist.load_data()
  16. x_train = x_train.reshape(-12828)/255
  17. x_test = x_test.reshape(-12828)/255
  18. y_train = np_utils.to_categorical(y_train,num_classes=10)
  19. y_test = np_utils.to_categorical(y_test,num_classes=10)

np_utils.to_categorical函数讲解

该函数的作用是将类别向量转化为独热编码形式

独热编码

独热编码又称为一位有效位编码,上边代码例子中其实就是将类别向量转换为独热编码的类别矩阵。也就是如下转换:

  1. 0 1 2 3 4 5 6 7 8
  2. 0=> [1. 0. 0. 0. 0. 0. 0. 0. 0.]
  3. 1=> [0. 1. 0. 0. 0. 0. 0. 0. 0.]
  4. 2=> [0. 0. 1. 0. 0. 0. 0. 0. 0.]
  5. 3=> [0. 0. 0. 1. 0. 0. 0. 0. 0.]
  6. 4=> [0. 0. 0. 0. 1. 0. 0. 0. 0.]
  7. 5=> [0. 0. 0. 0. 0. 1. 0. 0. 0.]
  8. 6=> [0. 0. 0. 0. 0. 0. 1. 0. 0.]
  9. 7=> [0. 0. 0. 0. 0. 0. 0. 1. 0.]
  10. 8=> [0. 0. 0. 0. 0. 0. 0. 0. 1.]

模型的创建于配置

  1. model = Sequential()
  2. #RNN cell
  3. model.add(SimpleRNN(batch_input_shape=(BATCH_SIZE,TIME_STEPS,INPUT_SIZE),output_dim=CELL_SIZE,))
  4. #RNN默认的激励函数为tanh,这里不做修改
  5. #output layer
  6. model.add(Dense(OUTPUT_SIZE))
  7. model.add(Activation('softmax'))
  8. #optimizer
  9. adam = Adam(LR)
  10. model.compile(optimizer = adam,
  11. loss = 'categorical_crossentropy',
  12. metrics = ['accuracy'])#添加所需要返回的参数,accuracy准确度

模型的最终训练与运行

  1. for step in range(4001):
  2. x_batch = x_train[BATCH_INDEX:BATCH_SIZE+BATCH_INDEX,:,:]
  3. y_batch = y_train[BATCH_INDEX:BATCH_SIZE+BATCH_INDEX,:]
  4. cost = model.train_on_batch(x_batch,y_batch)
  5. BATCH_INDEX += BATCH_SIZE
  6. BATCH_INDEX = 0 if BATCH_INDEX >= X_train.shape[0] else BATCH_INDEX #数据循环
  7. if step % 500 == 0:
  8. cost,accuracy = model.evaluate(x_test,y_test,batch_size=y_test.shape[0],verbose = False)
  9. print('test cost:',cost,'test accuracy:',accuracy)

结果展示

image.png