用纯Python实现循环神经网络RNN向前传播过程(吴恩达DeepLearning.ai作业)

简介:

用纯Python实现循环神经网络RNN向前传播过程(吴恩达DeepLearning.ai作业)
Google TensorFlow程序员点赞的文章!

 

前言

目录:

  • 向量表示以及它的维度
  • rnn cell
  • rnn 向前传播

重点关注:

  • 如何把数据向量化的,它们的维度是怎么来的
  • 一共其实就是两步: 单个单元的rnn计算,拉通来的rnn计算

​

在看本文前,可以先看看这篇文章回忆一下:

吴恩达deepLearning.ai循环神经网络RNN学习笔记(理论篇)

我们将实现以下结构的RNN,在这个例子中 Tx = Ty。

向量表示以及它的维度

Input with  nx  number of units
对单个输入样本,x(i) 是一维输入向量。
用语言来举个例子,将具有5k个单词词汇量的语言用one-hot编码成具有5k个单位的向量,所以 x(i) 的维度是(5000,)。
我们将用符号 nx 表示单个训练样本的单位数。
Batches of size m
如果我们取小批量(mini-batches),每个批次有20个训练样本。
为了受益于向量化,我们将20个样本 x(i) 变成一个2维数组(矩阵)。
比如一个维度是(5000,20)的向量。
我们用m来表示训练样本的数量。
所以小批量训练数据的维度是 (nx, m)。
Time steps of size Tx
循环神经网络有多个时间步骤,我们用t来表示。
我们将看到训练样本 x(i) 将经历多个时间步骤 Tx, 比如如果有10个时间步骤,那么 Tx = 10。
3D Tensor of shape (nx, m, Tx)
输入x就是用维度是 (nx, m, Tx) 的三维张量来表示。
Taking a 2D slice for each time step:

每一个时间步骤,我们用小批量训练样本(不是单个的训练样本)。
所以针对每个时间步骤t,我们用维度是 (nx, m)的2维切片。
我们把它表示成xt。
隐藏状态a的维度
a的定义: 从一个时间步骤到另一个时间步骤的激活值 at, 我们把它叫做隐藏状态。
同输入张量 x 一样,对于单个训练样本的隐藏状态,它的向量长度是na。
如果我们是包含了m个训练样本的小批量数据,那么小批量维度是 (na, m)。
如果我们把时间步加进去,那么隐藏状态的维度就是 (na, m, Tx)。
我们将用索引t来遍历时间步,每次操作是从3维张量切片成的2维向量。
我们用at来表示2维的切片,它的维度是 (na, m)。
预测值y^的维度
同输入x和隐藏状态一样,y^是一个维度是 (ny, m, Ty) 的3维张量。
ny: 代表预测值的单位数。
m: 小批次训练的样本数量。
Ty: 预测的时间数。
比如单个时间步 t,2维的切片 y^ 的维度是 (ny, m)。
 

RNN cell

 

我们的第一个任务就是执行单个时间步骤的计算,计算如下图。

输入是a^, xt,输出是at, yt^。以下的代码其实就是把上面的公式代码化,总的步骤分成4步:

取出参数。
计算at。
计算yt^。
返回输出的at, yt^,还要存储一些值缓存起来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
​import numpy as np
​
def rnn_cell_forward(xt, a_prev, parameters):
    """
    Implements a single forward step of the RNN-cell as described in Figure (2)
​
    Arguments:
    xt -- your input data at timestep "t", numpy array of shape (n_x, m).
    a_prev -- Hidden state at timestep "t-1", numpy array of shape (n_a, m)
    parameters -- python dictionary containing:
                        Wax -- Weight matrix multiplying the input, numpy array of shape (n_a, n_x)                        Waa -- Weight matrix multiplying the hidden state, numpy array of shape (n_a, n_a)
                        Wya -- Weight matrix relating the hidden-state to the output, numpy array of shape (n_y, n_a)
                        ba --  Bias, numpy array of shape (n_a, 1)
                        by -- Bias relating the hidden-state to the output, numpy array of shape (n_y, 1)
    Returns:
    a_next -- next hidden state, of shape (n_a, m)
    yt_pred -- prediction at timestep "t", numpy array of shape (n_y, m)
    cache -- tuple of values needed for the backward pass, contains (a_next, a_prev, xt, parameters)
    """
    # 取计算的参数
    Wax = parameters["Wax"]
    Waa = parameters["Waa"]
    Wya = parameters["Wya"]
    ba = parameters["ba"]
    by = parameters["by"]
​
    # 用公式计算下一个单元的激活值
    a_next = np.tanh(np.dot(Waa, a_prev) + np.dot(Wax, xt) + ba)
    # 计算当前cell的输出
    yt_pred = softmax(np.dot(Wya, a_next) + by)
    
    # 用于向后传播的缓存值
    cache = (a_next, a_prev, xt, parameters)
​
    return a_next, yt_pred, cache

RNN向前传播

一个循环神经网络就是不断的重复你上面创建的rnn 单元。
如果你的输入数据序列是10个时间步,那么你就要重复你的rnn cell 10次。
在每个时间步中,每个单元将用2个输入:
a: 前一个单元的隐藏状态。
xt: 当前时间步的输入数据。
每个时间步有两个输出:
一个隐藏状态at
一个测值y^⟨t⟩
权重和偏差 (Waa,ba,Wax,bx) 将在每个时间步中循环使用,它们保存在"parameters"的变量中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
def rnn_forward(x, a0, parameters):
    """
    Implement the forward propagation of the recurrent neural network described in Figure (3).
​
    Arguments:
    x -- Input data for every time-step, of shape (n_x, m, T_x).
    a0 -- Initial hidden state, of shape (n_a, m)
    parameters -- python dictionary containing:
                        Waa -- Weight matrix multiplying the hidden state, numpy array of shape (n_a, n_a)
                        Wax -- Weight matrix multiplying the input, numpy array of shape (n_a, n_x)
                        Wya -- Weight matrix relating the hidden-state to the output, numpy array of shape (n_y, n_a)
                        ba --  Bias numpy array of shape (n_a, 1)
                        by -- Bias relating the hidden-state to the output, numpy array of shape (n_y, 1)
​
    Returns:
    a -- Hidden states for every time-step, numpy array of shape (n_a, m, T_x)
    y_pred -- Predictions for every time-step, numpy array of shape (n_y, m, T_x)
    caches -- tuple of values needed for the backward pass, contains (list of caches, x)
    """
​
    # 用于存储所有cache的列表,初始化它
    caches = []
​
    # 取一些纬度值,用于后面初始化变量
    n_x, m, T_x = x.shape
    n_y, n_a = parameters["Wya"].shape
​
​
    # 初始化 a 和 y_pred
    a = np.zeros((n_a, m, T_x))
    y_pred = np.zeros((n_y, m, T_x))
​
    # 初始化 a_next
    a_next = a0
​
    # loop over all time-steps of the input 'x'
    for t in range(T_x):
        # Update next hidden state, compute the prediction, get the cache
        xt = x[:,:,t] # 通过切片的方式从输入变量x中取出当前t时间步的输入xt
        a_next, yt_pred, cache = rnn_cell_forward(xt, a_next, parameters)
        # 保存当前单元计算的a_next值
​
        a[:,:,t] = a_next
        # 保存当前单元的预测值y
​
        y_pred[:,:,t] = yt_pred
        # 添加每个单元的缓存值
        caches.append(cache)
​
​
    # store values needed for backward propagation in cache
    caches = (caches, x)
​
    return a, y_pred, caches

恭喜你(^▽^),到这里你已经能够从0到1的构建循环神经网络的向前传播过程。

在现代深度学习框架中,您仅需实现前向传递,而框架将处理后向传递,因此大多数深度学习工程师无需理会后向传递的细节。我就不写向后传播了。

相关文章
|
12月前
|
人工智能 算法 安全
AI + 热成像技术在动火作业风险防控中的实现路径
融合AI视觉与热成像技术,构建动火作业安全管控体系。通过定制化易燃物识别、计算机视觉测距、红外温度监测与多源图像融合,实现风险目标精准识别、安全距离实时预警、高温火源智能捕捉,并结合小程序“即拍即查”与后端闭环管理平台,完成隐患从发现到整改的全流程追溯,提升工业现场安全管理智能化水平。
777 10
|
人工智能 云栖大会 调度
「2025云栖大会」“简单易用的智能云网络,加速客户AI创新”专场分论坛诚邀莅临
”简单易用的智能云网络,加速客户AI创新“专场分论坛将于9月24日13:30-17:00在云栖小镇D1-5号馆举办,本场技术分论坛将发布多项云网络创新成果,深度揭秘支撑AI时代的超低时延、自适应调度与跨域协同核心技术。同时来自领先企业的技术先锋将首次公开其在模型训练、企业出海等高复杂场景中的突破性实践,展现如何通过下一代云网络实现算力效率跃升与成本重构,定义AI时代网络新范式。
375 4
|
人工智能 安全 网络安全
2025攻防演习回顾,AI赋能下的网络安全新格局
网络安全实战攻防演习历经9年发展,已成为检验安全体系、洞察威胁趋势的重要手段。攻击呈现实战化、体系化特征,APT、0day、勒索攻击等手段升级,AI、大数据等新技术带来新风险。攻击入口多元化、工具智能化、API成重点目标,“AI+人工”协同攻击加剧威胁。面对挑战,企业需构建纵深防御体系,从被动防御转向主动对抗。瑞数信息通过动态安全技术与AI融合,实现0day防护、漏扫干扰、勒索应急等能力,打造WAAP超融合平台,助力关键基础设施构建智能、协同、前瞻的主动防御体系。
995 1
|
机器学习/深度学习 算法 安全
【PSO-LSTM】基于PSO优化LSTM网络的电力负荷预测(Python代码实现)
【PSO-LSTM】基于PSO优化LSTM网络的电力负荷预测(Python代码实现)
527 0
|
人工智能 数据安全/隐私保护 异构计算
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
1793 8
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
|
人工智能 运维 安全
从被动防御到主动免疫进化!迈格网络 “天机” AI 安全防护平台,助推全端防护性能提升
迈格网络推出“天机”新版本,以AI自学习、全端防护、主动安全三大核心能力,重构网络安全防线。融合AI引擎与DeepSeek-R1模型,实现威胁预测、零日防御、自动化响应,覆盖Web、APP、小程序全场景,助力企业从被动防御迈向主动免疫,护航数字化转型。
从被动防御到主动免疫进化!迈格网络 “天机” AI 安全防护平台,助推全端防护性能提升
|
12月前
|
机器学习/深度学习 大数据 关系型数据库
基于python大数据的青少年网络使用情况分析及预测系统
本研究基于Python大数据技术,构建青少年网络行为分析系统,旨在破解现有防沉迷模式下用户画像模糊、预警滞后等难题。通过整合多平台亿级数据,运用机器学习实现精准行为预测与实时干预,推动数字治理向“数据驱动”转型,为家庭、学校及政府提供科学决策支持,助力青少年健康上网。
|
12月前
|
传感器 人工智能 数据安全/隐私保护
学生不应依赖AI写作业,怕大脑用进废退。职场人呢?
过度依赖AI将削弱深度思考能力,创新源于主动“跨界整合”。职场人需警惕“思维外包”,善用AI为“杠杆”而非“拐杖”,保持自主思考方能突破边界。法思诺创新学院倡导:创新可训练,大脑越用越强。
401 2
|
人工智能 运维 安全
AI来了,网络安全运维还能靠“人海战术”吗?
AI来了,网络安全运维还能靠“人海战术”吗?
491 28
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
python编写AI生常用匡架及使用指令集
本文介绍Python中常用AI框架,包括TensorFlow、PyTorch、Scikit-learn、Hugging Face、spaCy、OpenCV及XGBoost等,涵盖安装指令与基础代码示例,适用于机器学习、深度学习、自然语言处理与计算机视觉等领域,助力快速入门与应用开发。(238字)
904 7

推荐镜像

更多