RNN入门简例:mnist 分类

Notes

  • RNN 的 4 种模式:
    1. one-to-one:单输入,单输出
    2. one-to-many:单输入,多输出
    3. many-to-one:多输入,单输出
    4. 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

# -*- coding: utf-8 -*-
import keras
from keras.models import Sequential
from keras.layers import SimpleRNN, Dense
from keras.datasets import mnist
from keras.utils import to_categorical

# data
(trX, trY), (teX, teY) = mnist.load_data()
# trX = trX / 225.
# teX = teX / 225.
trY = to_categorical(trY)
teY = to_categorical(teY)

# model
m = Sequential([
    SimpleRNN(50,
              input_shape=trX.shape[1:]),
    Dense(10, activation='softmax')
])
m.summary()

m.compile('adam',
          loss='categorical_crossentropy',
          metrics=['acc'])

# training
m.fit(trX, trY,
      batch_size=64,
      epochs=20,
      verbose=1,
      validation_data=(teX, teY))

# evaluation
loss, acc = m.evaluate(teX, teY, verbose=0)
print('loss:', loss)
print('acc:', acc)

References

  1. 豆豆的AI小屋
  2. keras/examples/mnist_irnn.py
  3. Docs » Layers » 循环层 Recurrent
  4. Keras 快速搭建神经网络 (莫烦 Python 教程) P14
  5. Many to one and many to many LSTM examples in Keras

你可能感兴趣的:(机器学习/数据挖掘,人工智能)