从零开始用 Python 构建循环神经网络_pycharm 循环神经网络从零开始(1)

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 循环神经网络简介

https://www.analyticsvidhya.com/blog/2017/12/introduction-to-recurrent-neural-networks/

目录

一、快速回顾:循环神经网络概念回顾

二、使用循环神经网络进行序列预测

三、使用Python构建循环神经网络模型

一、快速回顾:循环神经网络概念回顾

让我们快速回顾一下循环神经网络的核心概念。我们将以一家公司的股票的序列数据为例。一个简单的机器学习模型或人工神经网络可以根据一些特征预测股票价格,比如股票的数量,开盘价值等。除此之外,该股票在之前的几天和几个星期的表现也影响着股票价格。对交易者来说,这些历史数据实际上是进行预判的主要决定因素。

在传统的前馈神经网络中,所有测试用例都被认为是独立的。 在预测股价时,你能看出那不是一个合适的选择吗? 神经网络模型不会考虑之前的股票价格 – 这不是一个好想法!

面对时间敏感数据时,我们可以利用另一个概念 — 循环神经网络(RNN)

典型的循环神经网络如下所示:

img

这刚开始看起来可能很吓人。 但是如果我们展开来讲,事情就开始变得更简单:

img

现在,我们更容易想象出这些循环神经网络如何预测股票价格的走势。这有助于我们预测当天的价格。这里,有关时间t(h_t)的每个预测都需要依赖先前所有的预测和从它们那学习到的信息。相当直截了当吧?

循环神经网络可以在很大程度上帮助我们解决序列处理问题。

文本是序列数据的另一个好例子。一旦给定文本之后,循环神经网络就可以预测出接下来将会出现的单词或短语,这可将是非常有用的资产。我们希望我们的循环神经网络可以写出莎士比亚的十四行诗!

现在,循环神经网络在涉及短或小的环境时非常棒。 但是为了能够构建一个故事并记住它,我们的循环神经网络模型应该能理解序列背后的背景,就像人脑一样。

二、使用循环神经网络进行序列预测

在本文中,我们将使用循环神经网络处理序列预测问题。对此最简单的例子之一是正弦波预测。序列包含可见趋势,使用启发式方式很容易解决。下面就是正弦波的样子:

img

我们首先从零开始设计一个循环神经网络解决这个问题。 我们的循环神经网络模型也应该得到很好地推广,以便我们可以将其应用于其他序列问题。 我们将像这样制定我们的问题:给定一个属于正弦波的50个数字的序列,预测系列中的第51个数字。 是时候打开你的Jupyter notebook(一个交互式笔记本,支持运行 40 多种编程语言)或你选择的IDE(Integrated Development Environment,是一种编程软件)!

三、使用Python编码循环神经网络

第0步:数据准备

在做任何其他事情之前,数据准备是任何数据科学项目中不可避免的第一步。我们的网络模型期望数据是什么样的? 它将输入长度为50的单个序列。所以输入数据的形状将是:

(number_of_records x length_of_sequence x types_of_sequences)

这里,types_of_sequence是1,因为我们只有一种类型的序列—正弦波。

另一方面,每次记录的输出只有一个值。那就是输入序列中的第51个值。 所以它的形状将是:

(number_of_records x types_of_sequences) #where types_of_sequences is 1

让我们深入研究这个代码。首先,导入必要的库:

%pylab inline

import math

创建像数据一样的正弦波,我们将使用Python数学库中的正弦函数:

sin_wave = np.array([math.sin(x) for x in np.arange(200)])

将刚刚生成的正弦波可视化:

plt.plot(sin_wave[:50])

img

我们现在将在下面的代码块中创建数据:

X = []

Y = []

seq_len = 50

num_records = len(sin_wave) - seq_len

for i in range(num_records - 50):

    X.append(sin_wave[i:i+seq_len])

    Y.append(sin_wave[i+seq_len])

   X = np.array(X)

X = np.expand_dims(X, axis=2)

Y = np.array(Y)

Y = np.expand_dims(Y, axis=1)

打印数据的形状:

X.shape, Y.shape

((100, 50, 1), (100, 1))

请注意,我们循环(num_records - 50),是因为我们想要留出50条记录作为验证数据。现在我们可以创建这个验证数据:

X_val = []

Y_val = []

for i in range(num_records - 50, num_records):

    X_val.append(sin_wave[i:i+seq_len])

    Y_val.append(sin_wave[i+seq_len])

    X_val = np.array(X_val)

X_val = np.expand_dims(X_val, axis=2)

Y_val = np.array(Y_val)

Y_val = np.expand_dims(Y_val, axis=1)

第1步:为我们的循环神经网络模型创建架构

我们接来下的任务是将我们在循环神经网络模型中使用的所有必要变量和函数进行定义。我们的循环神经网络模型将接受输入序列,通过100个单位的隐藏层处理它,并产生单值输出:

learning_rate = 0.0001    

nepoch = 25               

T = 50                   # length of sequence

hidden_dim = 100         

output_dim = 1

bptt_truncate = 5

min_clip_value = -10

max_clip_value = 10

然后我们将定义网络的权重:

U = np.random.uniform(0, 1, (hidden_dim, T))

W = np.random.uniform(0, 1, (hidden_dim, hidden_dim))

V = np.random.uniform(0, 1, (output_dim, hidden_dim))

其中:

  • U是输入和隐藏图层之间权重的权重矩阵
  • V是隐藏层和输出层之间权重的权重矩阵
  • W是循环神经网络层(隐藏层)中共享权重的权重矩阵

最后,我们将定义在隐藏层中使用S型函数:

def sigmoid(x):

    return 1 / (1 + np.exp(-x))

第2步:训练模型

既然我们已经定义了模型,最后我们就可以继续训练我们的序列数据了。我们可以将训练过程细分为更小的步骤,即:

**步骤2.1:**检查训练数据是否丢失

​ 步骤2.1.1:前馈传递

​ 步骤2.1.2:计算误差

**步骤2.2:**检查验证数据是否丢失

​ 步骤2.2.1前馈传递

​ 步骤2.2.2:计算误差

**步骤2.3:**开始实际训练

​ 步骤2.3.1:正推法

​ 步骤2.3.2:反向传递误差

​ 步骤2.3.3:更新权重

我们需要重复这些步骤直到数据收敛。 如果模型开始过拟合,请停止! 或者只是预先定义epoch的数量。

  • **步骤2.1:**检查训练数据是否丢失

我们将通过我们的循环神经网络模型进行正推法,并计算所有记录的预测的平方误差,以获得损失值。

for epoch in range(nepoch):

    # check loss on train

    loss = 0.0

       # do a forward pass to get prediction

    for i in range(Y.shape[0]):

        x, y = X[i], Y[i]                    # get input, output values of each record

        prev_s = np.zeros((hidden_dim, 1))   # here, prev-s is the value of the previous activation of hidden layer; which is initialized as all zeroes

        for t in range(T):

            new_input = np.zeros(x.shape)    # we then do a forward pass for every timestep in the sequence

            new_input[t] = x[t]              # for this, we define a single input for that timestep

            mulu = np.dot(U, new_input)

            mulw = np.dot(W, prev_s)

            add = mulw + mulu

            s = sigmoid(add)

            mulv = np.dot(V, s)

            prev_s = s

    # calculate error

        loss_per_record = (y - mulv)**2 / 2

        loss += loss_per_record

    loss = loss / float(y.shape[0])

  • **步骤2.2:**检查验证数据是否丢失

我们将对计算验证数据的损失做同样的事情(在同一循环中):

# check loss on val

    val_loss = 0.0

    for i in range(Y_val.shape[0]):

        x, y = X_val[i], Y_val[i]

        prev_s = np.zeros((hidden_dim, 1))

        for t in range(T):

            new_input = np.zeros(x.shape)

            new_input[t] = x[t]

            mulu = np.dot(U, new_input)

            mulw = np.dot(W, prev_s)

            add = mulw + mulu

            s = sigmoid(add)

            mulv = np.dot(V, s)

            prev_s = s

        loss_per_record = (y - mulv)**2 / 2

        val_loss += loss_per_record

    val_loss = val_loss / float(y.shape[0])

 

    print('Epoch: ', epoch + 1, ', Loss: ', loss, ', Val Loss: ', val_loss)

你应该会得到以下输出:

Epoch: 1 , Loss: [[101185.61756671]] , Val Loss: [[50591.0340148]]

  • **步骤2.3:**开始实际训练

现在我们开始对网络进行实际训练。在这里,我们首先进行正推法计算误差,然后使用逆推法来计算梯度并更新它们。让我逐步向您展示这些内容,以便您可以直观地了解它的工作原理。

  • **步骤2.3.1:**正推法

正推法步骤如下:

  1. 我们首先将输入与输入和隐藏层之间的权重相乘;
  2. 在循环神经网络层中添加权重乘以此项,这是因为我们希望获取前一个时间步的内容;
  3. 通过sigmoid 激活函数将其与隐藏层和输出层之间的权重相乘;
  4. 在输出层,我们对数值进行线性激活,因此我们不会通过激活层传递数值;
  5. 在字典中保存当前图层的状态以及上一个时间步的状态。

这是执行正推法的代码(请注意,它是上述循环的继续):

# train model

    for i in range(Y.shape[0]):

        x, y = X[i], Y[i]

           layers = []

        prev_s = np.zeros((hidden_dim, 1))

        dU = np.zeros(U.shape)

        dV = np.zeros(V.shape)

        dW = np.zeros(W.shape)

        dU_t = np.zeros(U.shape)

        dV_t = np.zeros(V.shape)

        dW_t = np.zeros(W.shape)

        dU_i = np.zeros(U.shape)

        dW_i = np.zeros(W.shape)

          # forward pass

          for t in range(T):

            new_input = np.zeros(x.shape)

            new_input[t] = x[t]

            mulu = np.dot(U, new_input)

            mulw = np.dot(W, prev_s)

            add = mulw + mulu

            s = sigmoid(add)

            mulv = np.dot(V, s)

            layers.append({'s':s, 'prev_s':prev_s})

            prev_s = s

  • **步骤2.3.2:**反向传播误差

在前向传播步骤之后,我们计算每一层的梯度,并反向传播误差。 我们将使用截断反向传播时间(TBPTT),而不是vanilla backprop(反向传播的非直观效应的一个例子)。这可能听起来很复杂但实际上非常直接。

BPTT与backprop的核心差异在于,循环神经网络层中的所有时间步骤,都进行了反向传播步骤。 因此,如果我们的序列长度为50,我们将反向传播当前时间步之前的所有时间步长。

如果你猜对了,那么BPTT在计算上看起来非常昂贵。 因此,我们不是反向传播所有先前的时间步,而是反向传播直到x时间步以节省计算能力。考虑这在概念上类似于随机梯度下降,我们包括一批数据点而不是所有数据点。

以下是反向传播误差的代码:

# derivative of pred

        dmulv = (mulv - y)

         # backward pass

        for t in range(T):


文末有福利领取哦~
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

👉**一、Python所有方向的学习路线**

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。![img](https://img-blog.csdnimg.cn/c67c0f87cf9343879a1278dfb067f802.png)

👉**二、Python必备开发工具**

![img](https://img-blog.csdnimg.cn/757ca3f717df4825b7d90a11cad93bc7.png)  
👉**三、Python视频合集**

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。  
![img](https://img-blog.csdnimg.cn/31066dd7f1d245159f21623d9efafa68.png)

👉 **四、实战案例**

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。**(文末领读者福利)**  
![img](https://img-blog.csdnimg.cn/e78afb3dcb8e4da3bae5b6ffb9c07ec7.png)

👉**五、Python练习题**

检查学习结果。  
![img](https://img-blog.csdnimg.cn/280da06969e54cf180f4904270636b8e.png)

👉**六、面试资料**

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。  
![img](https://img-blog.csdnimg.cn/a9d7c35e6919437a988883d84dcc5e58.png)

![img](https://img-blog.csdnimg.cn/5db8141418d544d3a8e9da4805b1a3f9.png)

👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

/img-blog.csdnimg.cn/280da06969e54cf180f4904270636b8e.png)

👉**六、面试资料**

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。  
![img](https://img-blog.csdnimg.cn/a9d7c35e6919437a988883d84dcc5e58.png)

![img](https://img-blog.csdnimg.cn/5db8141418d544d3a8e9da4805b1a3f9.png)

👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 23
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【为什么要学习这门课程】深度学习框架如TensorFlow和Pytorch掩盖了深度学习底层实现方法,那能否能用Python代码从零实现来学习深度学习原理呢?本课程就为大家提供了这个可能,有助于深刻理解深度学习原理。左手原理、右手代码,双管齐下!本课程详细讲解深度学习原理并进行Python代码实现深度学习网络。课程内容涵盖感知机、多层感知机、卷积神经网络循环神经网络,并使用Python 3及Numpy、Matplotlib从零实现上述神经网络。本课程还讲述了神经网络的训练方法与实践技巧,且开展了代码实践演示。课程对于核心内容讲解深入细致,如基于计算图理解反向传播算法,并用数学公式推导反向传播算法;另外还讲述了卷积加速方法im2col。【课程收获】本课程力求使学员通过深度学习原理、算法公式及Python代码的对照学习,摆脱框架而掌握深度学习底层实现原理与方法。本课程将给学员分享深度学习Python实现代码。课程代码通过Jupyter Notebook演示,可在Windows、ubuntu等系统上运行,且不需GPU支持。【优惠说明】 课程正在优惠中!  备注:购课后可加入白勇老师课程学习交流QQ群:957519975【相关课程】学习本课程的前提是会使用Python语言以及Numpy和Matplotlib库。相关课程链接如下:《Python编程的术与道:Python语言入门》https://edu.csdn.net/course/detail/27845《玩转Numpy计算库》https://edu.csdn.net/lecturer/board/28656《玩转Matplotlib数据绘图库》https://edu.csdn.net/lecturer/board/28720【课程内容导图及特色】

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值