Notes
- RNN 的 4 种模式:
- one-to-one:单输入,单输出
- one-to-many:单输入,多输出
- many-to-one:多输入,单输出
- many-to-many:多输入,多输出。seq2seq 那种吧
- RNN 层只有
1
个 hidden unit,只是它有自环,逻辑上可以展开成任意多个(这任意多个 hidden unit 共享参数,即只有一个) - keras 的
SimpleRNN
的第一个参数units
是指输出向量的维度(这个名字曾让我以为是 RNN 层有多个 hidden units?或是 many-to-many 那种模式里输出的向量个数?) - 默认只返回最后一个输出(对应最后一个 time step 的输入),如果要返回多个向量,将参数
return_sequences
设成True
,就返回对应每个 time step 的输出,然后自己截取需要的输出(见 参考 5) - RNN 的输入形状是
(batch_size, timesteps, input_dim)
,先 time step 后 向量维度 - 本例 MNIST 分类对应 many-to-one,将
28 x 28
的图片每行看成一个 time step,每个 time step 输入一个长 28 的向量,只取最后一个输出,输出维度是 50,再套个全连接层
Code
import keras
from keras.models import Sequential
from keras.layers import SimpleRNN, Dense
from keras.datasets import mnist
from keras.utils import to_categorical
(trX, trY), (teX, teY) = mnist.load_data()
trY = to_categorical(trY)
teY = to_categorical(teY)
m = Sequential([
SimpleRNN(50,
input_shape=trX.shape[1:]),
Dense(10, activation='softmax')
])
m.summary()
m.compile('adam',
loss='categorical_crossentropy',
metrics=['acc'])
m.fit(trX, trY,
batch_size=64,
epochs=20,
verbose=1,
validation_data=(teX, teY))
loss, acc = m.evaluate(teX, teY, verbose=0)
print('loss:', loss)
print('acc:', acc)
References
- 豆豆的AI小屋
- keras/examples/mnist_irnn.py
- Docs » Layers » 循环层 Recurrent
- Keras 快速搭建神经网络 (莫烦 Python 教程) P14
- Many to one and many to many LSTM examples in Keras