RNN入门简例:mnist 分类

本文介绍RNN的四种运行模式,并通过Keras实现了一个针对MNIST数据集的RNN分类器示例。该示例采用many-to-one模式,利用SimpleRNN层处理28x28像素的图像数据,最终通过全连接层进行分类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值