LSTM模型
一:简介:
LSTM模型,是循环神经网络的一种变体,可以很有效的解决简单循环神经网络的梯度爆炸或消失问题。
二:优缺点:
优点:改善了RNN中存在的长期依赖问题;LSTM的表现通常比时间递归神经网络及隐马尔科夫模型(HMM)更好;作为非线性模型,LSTM可作为复杂的非线性单元用于构造更大型深度神经网络。
缺点:一个缺点是RNN的梯度问题在LSTM及其变种里面得到了一定程度的解决,但还是不够。它可以处理100个量级的序列,而对于1000个量级,或者更长的序列则依然会显得很棘手;另一个缺点是每一个LSTM的cell里面都意味着有4个全连接层(MLP),如果LSTM的时间跨度很大,并且网络又很深,这个计算量会很大,很耗时。
三:代码实现
from keras.datasets import mnist
#加载数据
(x_train, y_train), (x_test, y_test) = mnist.load_data()
print('x_train.shape:',x_train.shape)
print('x_test.shape:',x_test.shape)
输出:
('x_train.shape:', (60000, 28, 28))
('x_test.shape:', (10000, 28, 28))
#时间序列数量
n_step = 28
#每次输入的维度
n_input = 28
#分类类别数
n_classes = 10
#将数据转为28*28的数据(n_samples,height,width)
x_train = x_train.reshape(-1, n_step, n_input)
x_test = x_test.reshape(-1, n_step, n_input)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
#标准化数据,因为像素值在0-255之间,所以除以255后数值在0-1之间
x_train /= 255
x_test /= 255
#y_train,y_test 进行 one-hot-encoding,label为0-9的数字,所以一共10类
y_train = keras.utils.to_categorical(y_train, n_classes)
y_test = keras.utils.to_categorical(y_test, n_classes)
#时间序列数量
n_step = 28
#每次输入的维度
n_input = 28
#分类类别数
n_classes = 10
#将数据转为28*28的数据(n_samples,height,width)
x_train = x_train.reshape(-1, n_step, n_input)
x_test = x_test.reshape(-1, n_step, n_input)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
#标准化数据,因为像素值在0-255之间,所以除以255后数值在0-1之间
x_train /= 255
x_test /= 255
#y_train,y_test 进行 one-hot-encoding,label为0-9的数字,所以一共10类
y_train = keras.utils.to_categorical(y_train, n_classes)
y_test = keras.utils.to_categorical(y_test, n_classes)
from keras import Sequential
from keras.layers import LSTM,Dense, Activation
from keras import optimizers
#使用Sequential,简单搭建lstm模型
model = Sequential()
#这个网络中,我们采用LSTM+Dense 层+激活层,优化函数采用Adam,
#损失函数采用交叉熵,评估采用正确率。
#学习率
learning_rate = 0.001
#每次处理的数量
batch_size = 28
#循环次数
epochs = 20
#神经元的数量
n_lstm_out = 128
#LSTM层
model.add(LSTM(
units = n_lstm_out,
input_shape = (n_step, n_input)))
#全连接层
model.add(Dense(units = n_classes))
#激活层
model.add(Activation('softmax'))
#查看各层的基本信息
model.summary()
# 编译
model.compile(
optimizer = optimizers.Adam(lr = learning_rate),
loss = 'categorical_crossentropy',
metrics = ['accuracy'])
#训练
model.fit(x_train, y_train,
epochs = epochs,
batch_size= batch_size,
verbose = 1,
validation_data = (x_test,y_test))
#评估
score = model.evaluate(x_test, y_test,
batch_size = batch_size,
verbose = 1)
print('loss:',score[0])
print('acc:',score[1])