[Day11] 以神经网络进行时间序列预测 — RNN

本篇详细介绍 RNN 并使用它进行时间序列预测

本日大纲

  • RNN 介绍
    • 激活函数
    • RNN 的分类
  • 时间序列预测实作
    • 资料集介绍/目标
    • 套件导入
    • 资料前处理
    • RNN 架构

RNN(递归神经网络)介绍

传统神经网络(DNN)无法对时间序列建模,上层神经元的输出只能传递给下层神经元。
而在递归神经网络(RNN)中,神经元的输出在下一时刻是可以传递给自身的,同时还输出一个隐藏层状态,给当前层在处理下个样本时使用,可以看成是自循环反馈的全连接神经网络。当任务的时序信息很重要(样本中前後输入的信息是有关联的),就很适用使用 RNN 家族的模型

激活函数

激活函数为神经元引入非线性因素,使神经网络可以逼近任意非线性函数,这样神经网络就可以应用到众多的非线性模型中。

常见的激活函数有 sigmoid、tanh、relu、softmax:

  1. sigmoid
    将取值为(−∞,+∞)的数据映射到(0,1)之间,
    取 −∞ 的时候映射为 0,取 +∞ 的时候映射为 1,取 0 的时候映射为 0.5。
    一阶导数取值范围为 0~0.25,
    数据越趋近 0,导数越趋於 0.25,数据越趋近 ∞,导数越趋於 0。
    sigmoid_formula

  2. tanh
    相比於 sigmoid 函数,tanh 函数是关於 0 中心对称的。
    将取值为(−∞,+∞)的数据映射到(-1,1)之间,
    取 −∞ 的时候映射为 -1,取 +∞ 的时候映射为 1,取 0 的时候映射为 0。
    一阶导数取值范围为 0~1,
    数据越趋近 0,导数越趋於 1,数据越趋近 ∞,导数越趋於 0。
    tanh_formula

  3. relu
    relu 函数则是为了解决神经网络中梯度消失的问题,是深度学习中使用最广泛的激活函数。
    relu_formula

    • 优点:
      • 分段函数(本身是非线性函数,由两个线性分段函数组成)
      • 解决 sigmoid、tanh 的梯度消失问题(当输入为正,梯度恒为 1;当输入为负,梯度恒为 0)
      • 相比於 sigmoid、tanh,relu 函数计算因为是线性的,运算速度增快很多
    • 缺点:
      • 当输入为负的时候,神经元不会被激活,会造成梯度消失问题;因此也出现其他改进版,如 Leaky Relu
  4. softmax
    归一化指数函式,将一个含任意实数的 K 维向量「压缩」到另一个 K 维实向量中,使得每一个元素的范围都在 (0, 1) 之间
    softmax_formula

RNN 的分类

  1. 单层 RNN:从输入到输出,只有一层隐藏层,是最基本的 RNN 模型
  2. 多层 RNN:透过增加隐藏层的数量,增加递归神经网络的深度
  3. 双向 RNN:由两层递归神经网络组成,输入相同但信息传递的方向不同,来捕捉序列前後的资讯

RNN 实作

资料集介绍

使用公共自行车某个站点可借车辆数量的数据,颗粒度为每分钟一笔。

目标

透过神经网络训练捕捉时序特徵,预测下个时间点会有多少可借车辆数量

引入相关套件
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(98)
import time
import csv
import tensorflow as tf
from tf.keras import Sequential
from tf.keras.layers import Dense, Activation, Dropout, RNN
载入资料集
with open(path_to_dataset) as f:
    data = csv.reader(f, delimiter=';')
    bike = []
    for line in data:
        try:
            bike.append(float(line[0]))
        except ValueError:
            pass
数据格式转换
RNN 架构示范
def model():
    model = Sequential()
    model.add(RNN(128))
    model.add(Dropout(0.2))
    model.add(Dense(10))
    model.summary()

(还在更新中)


<<:  饼乾的危险性:函式库 Library

>>:  [Day 12] 开关 Switch

Day20 跟着官方文件学习Laravel-Breeze

前面我们自己写了登入登出及注册,但其实laravel有提供我们身份验证的套件,这些工具包会自动提供我...

Day 7 - Array Cardio Day 2

前言 JS 30 是由加拿大的全端工程师 Wes Bos 免费提供的 JavaScript 简单应用...

从 IT 技术面细说 Search Console 的 27 组数字 KPI (2) 流量 (1)

Search Console 中数百数千个数字中,若只拿一个数字给老版看的话,该看那一个,答案很简单...

[面试][资料库]关联式资料库要如何设计避免超卖?

库存只剩 1 件,但却有 10 个人买到? 网路商城特卖会常常会推出特定商品限量 1 组的抢购活动...

[前端暴龙机,Vue2.x 进化 Vue3 ] Day19.组件练习 ref -分页(二)

今天我们会利用上一篇的 分页组件 范例来做更改,不过差别在於,这次我们父子组件的沟通不是透过 pro...