用纯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的构建循环神经网络的向前传播过程。
在现代深度学习框架中,您仅需实现前向传递,而框架将处理后向传递,因此大多数深度学习工程师无需理会后向传递的细节。我就不写向后传播了。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
物联网如何改变航空业?
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 图片来源:https://pixabay.com/images/id-1684500/ 物联网(IoT)已经颠覆了它所涉及的每个行业,值得庆幸的是,这些颠覆几乎总是会让这些行业变得更好。对于专注于海量数据的行业而言,物联网是一种福音,而在我们的这个现代时代,物联网已变得越来越必要。 航空业也不例外,一架飞机在12小时内产生的数据量超过了Facebook一天产生的数据量。物联网的整合颠覆了航空业,并且也永远改变了这个行业。 缩短地面时间 在飞行的各个方面都具有更好的可预测性,这意味着可以以更加有效的方式使飞机随时可用。随着潜在问题的发现,维护得到了改善,并且时间也大大减少了。这种维护速度的提高来自于物联网——它可以向地勤人员发送发动机性能的实时数据。 物联网还使工程师能够改变他们制造材料的方式——基于同样的数据——因此设备总体上需要较少的维护。随着时间推移,这些更好、更快的维护实例也可能意味着以更低的成本提供服务。由于诊断问题所花的时间很少甚至没有,因此在此过程中,设备和人工上的花费将会更...
- 下一篇
阿里云学生机(云翼计划)完全入手及课程学习指南
云翼计划是阿里云校园扶持计划,24岁以下或拥有学信网认证信息即可享优惠产品、创业扶持等多项权益哦!包括:专属云服务器产品优惠、校园产品使用攻略等。 专属云服务器产品优惠,指的就是可以用平均9.9元/月的低价拥有一台云服务器ECS或轻量应用服务器,二选一。 首先,当然是要注册阿里云账号,注册成功后必须进行实名认证,选择个人认证,成功后,年龄小于24岁就自动获得了学生身份了。获得学生身份后才能解锁最优惠的价格,进入云翼计划的页面,你就可以按年(114元/年)购买服务器了。 云服务器ECS配置如图: 轻量应用服务器配置如图: 在这里简单做一些说明,区别主要有两点: 1、云服务器ECS带宽是1M,而轻量应用服务器带宽是5M峰值,每月限1000G流量,超出后按照0.8元/G收费。如果光从这一点来说,绝对是选择轻量应用服务器了,因为同等硬件配置下,更高的带宽,意味着访问网站更快,能支持的并发数也更多。而每月1000G的流量,绝大多数的同学们都用不完的。所以不必担心超出的问题。 2、云服务器ECS可以配合阿里云的云数据库RDS使用,也可以使用阿里云的负载均衡。而轻量应用服务器不支持使用这些产品。换句...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS关闭SELinux安全模块
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7,8上快速安装Gitea,搭建Git服务器