返回介绍

RNN Classifier 循环神经网络

发布于 2025-05-02 13:36:26 字数 2688 浏览 0 评论 0 收藏

作者: Mark JingNB 编辑: Morvan

这次我们用循环神经网络(RNN, Recurrent Neural Networks) 进行分类(classification),采用 MNIST 数据集,主要用到 SimpleRNN 层。

from keras.layers import SimpleRNN, Activation, Dense

MNIST 里面的图像分辨率是 28×28,为了使用 RNN,我们将图像理解为序列化数据。 每一行作为一个输入单元,所以输入数据大小 INPUT_SIZE = 28 ; 先是第 1 行输入,再是第 2 行,第 3 行,第 4 行,…,第 28 行输入, 这就是一张图片也就是一个序列,所以步长 TIME_STEPS = 28

训练数据要进行归一化处理,因为原始数据是 8bit 灰度图像所以需要除以 255。

X_train = X_train.reshape(-1, 28, 28) / 255.      # normalize
X_test = X_test.reshape(-1, 28, 28) / 255.        # normalize

首先添加 RNN 层,输入为训练数据,输出数据大小由 CELL_SIZE 定义。

model.add(SimpleRNN(
    # for batch_input_shape, if using tensorflow as the backend, we have to put None for the batch_size.
    # Otherwise, model.evaluate() will get error.
    batch_input_shape=(None, TIME_STEPS, INPUT_SIZE),       
    output_dim=CELL_SIZE,
    unroll=True,
))

然后添加输出层,激励函数选择 softmax

model.add(Dense(OUTPUT_SIZE))
model.add(Activation('softmax'))

设置优化方法, loss 函数和 metrics 方法之后就可以开始训练了。 每次训练的时候并不是取所有的数据,只是取 BATCH_SIZE 个序列,或者称为 BATCH_SIZE 张图片,这样可以大大降低运算时间,提高训练效率。

for step in range(4001):
    # data shape = (batch_num, steps, inputs/outputs)
    X_batch = X_train[BATCH_INDEX: BATCH_INDEX+BATCH_SIZE, :, :]
    Y_batch = y_train[BATCH_INDEX: BATCH_INDEX+BATCH_SIZE, :]
    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

输出 test 上的 lossaccuracy 结果

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)

有兴趣的话可以修改 BATCH_SIZECELL_SIZE 的值,试试这两个参数对训练时间和精度的影响。

如果你觉得这篇文章或视频对你的学习很有帮助,请你也分享它,让它能再次帮助到更多的需要学习的人。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。