循环神经网络的特点
相比于普通的神经网络,在一个时间点只能输入一个输入值,同时得到一个输出值,在下一个时间点输入下一个输入值,输出下一个输出值,前一个神经网络和后一个神经网络作用之间没有任何的联系。但是在某些任务中需要能够更好的处理序列信息,即前面的输入和后面的输入之间是有相互联系的
像在我们说话的时候,接收方的理解不能只依靠于当前我们所说出来的话进行理解,需要结合之前说话的语境,才会有更加准确的理解。当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。
循环神经网络(RNN)就可以很好的解决机器学习中需要前后有关联的事件的学习
假设在t时刻我们输入值经过s(t)函数得到一个输出值,在t+1时刻,输出值所得到的结果是s(t)和s(t+1)函数共同作用与输入值的。
普通RNN的弊端和LSTM(Long Short-Term Memory:长短期记忆)技术
个人还不是很能理解该机制,参考https://zhuanlan.zhihu.com/p/24813287
循环神经网络的基本框架
基本环境的配置
import numpy as np
np.random.seed(1337)
from keras.datasets import mnist
from keras.utils import np_utils
from leras.model import Sequential
from keras.layers import SimpleRNN,Activation,Dense
from keras.optimizer import Adam
TIME_STEPS = 28 ##每一次读取28行
INPUT_SIZE = 28 ##每一行读取28个像素
BATCH_SIZE = 50 ##每一批训练的图片的个数
BATCH_INDEX = 0 ##
OUTPUT_SIZE = 10 ##第三维度为10个数,用于拓展维度
CELL_SIZE = 50 ##定义RNN中存放的神经元的个数
LR = 0.001
(x_train,y_train),(x_test,y_test) = mnist.load_data()
x_train = x_train.reshape(-1,28,28)/255
x_test = x_test.reshape(-1,28,28)/255
y_train = np_utils.to_categorical(y_train,num_classes=10)
y_test = np_utils.to_categorical(y_test,num_classes=10)
np_utils.to_categorical函数讲解
独热编码
独热编码又称为一位有效位编码,上边代码例子中其实就是将类别向量转换为独热编码的类别矩阵。也就是如下转换:
0 1 2 3 4 5 6 7 8
0=> [1. 0. 0. 0. 0. 0. 0. 0. 0.]
1=> [0. 1. 0. 0. 0. 0. 0. 0. 0.]
2=> [0. 0. 1. 0. 0. 0. 0. 0. 0.]
3=> [0. 0. 0. 1. 0. 0. 0. 0. 0.]
4=> [0. 0. 0. 0. 1. 0. 0. 0. 0.]
5=> [0. 0. 0. 0. 0. 1. 0. 0. 0.]
6=> [0. 0. 0. 0. 0. 0. 1. 0. 0.]
7=> [0. 0. 0. 0. 0. 0. 0. 1. 0.]
8=> [0. 0. 0. 0. 0. 0. 0. 0. 1.]
模型的创建于配置
model = Sequential()
#RNN cell
model.add(SimpleRNN(batch_input_shape=(BATCH_SIZE,TIME_STEPS,INPUT_SIZE),output_dim=CELL_SIZE,))
#RNN默认的激励函数为tanh,这里不做修改
#output layer
model.add(Dense(OUTPUT_SIZE))
model.add(Activation('softmax'))
#optimizer
adam = Adam(LR)
model.compile(optimizer = adam,
loss = 'categorical_crossentropy',
metrics = ['accuracy'])#添加所需要返回的参数,accuracy准确度
模型的最终训练与运行
for step in range(4001):
x_batch = x_train[BATCH_INDEX:BATCH_SIZE+BATCH_INDEX,:,:]
y_batch = y_train[BATCH_INDEX:BATCH_SIZE+BATCH_INDEX,:]
cost = model.train_on_batch(x_batch,y_batch)
BATCH_INDEX += BATCH_SIZE
BATCH_INDEX = 0 if BATCH_INDEX >= X_train.shape[0] else BATCH_INDEX #数据循环
if step % 500 == 0:
cost,accuracy = model.evaluate(x_test,y_test,batch_size=y_test.shape[0],verbose = False)
print('test cost:',cost,'test accuracy:',accuracy)