#

1、连续性感知器

2、非线性数据

3、非线性模型

4、神经网络架构

现在可以将这些构建基石组合到一起了,并构建出色的神经网络!(或者你愿意,也可以叫做多层级感知器。)

第一个视频将演示如何将两个感知器组合成第三个更复杂的感知器。

修正

视频 00:43 处,视频右侧的 -8 应对应 8。

视频 00:49 处,视频右侧的 1 应对应 -1。

视频 1:12 处 \begin{matrix} x_1\end{matrix}x1 应该对应 7;\begin{matrix} x_2\end{matrix}x2 应该对应 -2 。

多层级

并非所有神经网络都看起像上面的那样。可能会复杂的多!尤其是,我们可以执行以下操作:

  • 向输入、隐藏和输出层添加更多节点。
  • 添加更多层级。

我们将在下个视频中看看这些变化的效果。

5、前向反馈

前向反馈是神经网络用来将输入变成输出的流程。我们仔细研究下这一概念,然后详细了解如何训练网络。

修正:3:37的字幕运算公式为\hat y = \sigma(w2\sigma(w1x))y^=σ(w2σ(w1∗x*))

关于矩阵乘法部分,W1是一个 3x2 的矩阵,x是 3x1 矩阵,无法直接相乘。w1.T*x. 这里.T表示转置。

误差函数

和之前一样,神经网络将产生误差函数,最终我们需要最小化该误差函数。下面的视频演示了神经网络的误差函数。

6、反向传播

现在,我们准备好训练神经网络了。为此,我们将使用一种方法,叫做反向传播。简而言之,反向传播将包括:

  • 进行前向反馈运算。
  • 将模型的输出与期望的输出进行比较。
  • 计算误差。
  • 向后运行前向反馈运算(反向传播),将误差分散到每个权重上。
  • 更新权重,并获得更好的模型。
  • 继续此流程,直到获得很好的模型。

听起来比较复杂,实际上要简单些。我们看看后续几个视频。第一个视频将从概念上解释什么是反向传播。

反向传播数学 后面的几个视频将深入讲解数学知识。如果不想听也没有关系,现有的很多代码库和深度学习框架比如 Keras,能够很好并且很简单地完成这个任务。如果你想立即开始训练网络,请转到下个部分。但是如果你喜欢计算各种导数,那么我们深入了解下吧!

链式法则 我们需要复习下链式法则,以便计算导数。

7、keras

幸运的是,每次我们需要使用神经网络时,都不需要编写激活函数、梯度下降等。有很多包可以帮助我们,建议你了解这些包,包括以下包:

在这门课程中,我们将学习 Keras。Keras 使神经网络的编写过程更简单。为了展示有多简单,你将用几行代码构建一个完全连接的简单网络。

我们会将在前几课学习的概念与 Keras 提供的方法关联起来。

该示例的一般流程是首先加载数据,然后定义网络,最后训练网络。

用 Keras 构建神经网络

要使用 Keras,你需要知道以下几个核心概念。

序列模型

    from keras.models import Sequential

    #Create the Sequential model
    model = Sequential()

keras.models.Sequential 类是神经网络模型的封装容器。它会提供常见的函数,例如 fit()evaluate()compile()。我们将介绍这些函数(在碰到这些函数的时候)。我们开始研究模型的层吧。

Keras 层就像神经网络层。有全连接层、最大池化层和激活层。你可以使用模型的 add() 函数添加层。例如,简单的模型可以如下所示:

    from keras.models import Sequential
    from keras.layers.core import Dense, Activation, Flatten

    #创建序列模型
    model = Sequential()

    #第一层 - 添加有128个节点的全连接层以及32个节点的输入层
    model.add(Dense(128, input_dim=32))

    #第二层 - 添加 softmax 激活层
    model.add(Activation('softmax'))

    #第三层 - 添加全连接层
    model.add(Dense(10))

    #第四层 - 添加 Sigmoid 激活层
    model.add(Activation('sigmoid'))

Keras 将根据第一层自动推断后续所有层的形状。这意味着,你只需为第一层设置输入维度。

上面的第一层 model.add(Dense(input_dim=32)) 将维度设为 32(表示数据来自 32 维空间)。第二层级获取第一层级的输出,并将输出维度设为 128 个节点。这种将输出传递给下一层级的链继续下去,直到最后一个层级(即模型的输出)。可以看出输出维度是 10。

构建好模型后,我们就可以用以下命令对其进行编译。我们将损失函数指定为我们一直处理的 categorical_crossentropy。我们还可以指定优化程序,稍后我们将了解这一概念,暂时将使用 adam。最后,我们可以指定评估模型用到的指标。我们将使用准确率。

model.compile(loss="categorical_crossentropy", optimizer="adam", metrics = ['accuracy'])

我们可以使用以下命令来查看模型架构:

model.summary()

然后使用以下命令对其进行拟合,指定 epoch 次数和我们希望在屏幕上显示的信息详细程度。

然后使用fit命令训练模型并通过 epoch 参数来指定训练轮数(周期),每 epoch 完成对整数据集的一次遍历。 verbose 参数可以指定显示训练过程信息类型,这里定义为 0 表示不显示信息。

model.fit(X, y, nb_epoch=1000, verbose=0)

注意:在 Keras 1 中,nb_epoch 会设置 epoch 次数,但是在 Keras 2 中,变成了 epochs

最后,我们可以使用以下命令来评估模型:

model.evaluate()

很简单,对吧?我们实践操作下。

练习

我们从最简单的示例开始。在此测验中,你将构建一个简单的多层前向反馈神经网络以解决 XOR 问题。

  1. 将第一层设为 Dense() 层,并将节点数设为8,且 input_dim 设为 2。
  2. 在第二层之后使用 softmax 激活函数。
  3. 将输出层节点设为 2,因为输出只有 2 个类别。
  4. 在输出层之后使用 softmax 激活函数。
  5. 对模型运行 10 个 epoch。

准确度应该为 50%。可以接受,当然肯定不是太理想!在 4 个点中,只有 2 个点分类正确?我们试着修改某些参数,以改变这一状况。例如,你可以增加 epoch 次数以及改变激活函数的类型。如果准确率达到 75%,你将通过这道测验。能尝试达到 100% 吗?

首先,查看关于模型和层级的 Keras 文档。 Keras 多层感知器网络示例和你要构建的类似。请将该示例当做指南,但是注意有很多不同之处。

该 编程练习 不再允许访问。因为该纳米学位学期已结束,不过你仍然可以下载代码与所有文件。

import numpy as np
from keras.utils import np_utils
import tensorflow as tf
tf.python.control_flow_ops = tf

# Set random seed
np.random.seed(42)

# Our data
X = np.array([[0,0],[0,1],[1,0],[1,1]]).astype('float32')
y = np.array([[0],[1],[1],[0]]).astype('float32')

# Initial Setup for Keras
from keras.models import Sequential
from keras.layers.core import Dense, Activation, Flatten

# One-hot encoding the output
y = np_utils.to_categorical(y)

# Building the model
xor = Sequential()
xor.add(Dense(32, input_dim=2))
xor.add(Activation("tanh"))
xor.add(Dense(2))
xor.add(Activation("sigmoid"))

xor.compile(loss="categorical_crossentropy", optimizer="adam", metrics = ['accuracy'])

# Uncomment this line to print the model architecture
# xor.summary()

# Fitting the model
history = xor.fit(X, y, nb_epoch=1000, verbose=0)

# Scoring the model
score = xor.evaluate(X, y)
print("\nAccuracy: ", score[-1])

# Checking the predictions
print("\nPredictions:")
print(xor.predict_proba(X))

新技巧

我们的准确率达到了 75%,甚至会达到 100%,但是并不轻松!

这也暗示了在现实生活中,神经网络训练起来有点难。解决有 4 个数据点的简单 XOR 问题就需要一个庞大的架构!并且我们知道(理论上)具有 2 个隐藏节点的 2 层网络可以做到。

现在我们尝试一项任务。回到测验,并执行以下步骤:

  • 将架构中第一个层,节点数改为64
  • 加一个节点数为8的全链接层
  • 第一个激活函数设为 relu(我们稍后将学习这一概念)
  • 将 epoch 次数设为 100。

现在点击测试运行。准确率是多少?像我一样达到 100% 了吗?很神奇,对吧?似乎 relu 很有用。

在下面的几个部分,我们将学习几个类似的训练优化技巧。

8、迷你项目之 Keras Lab 准备: 录取学生

现在我们准备分析 Keras 上的整个数据集。我们将分析以下加州大学洛杉矶分校的学生录取数据集: ‘http://www.ats.ucla.edu/stat/data/binary.csv’

在本课的学习过程中,我们鼓励你在页面末尾参考 Jupyter Notebook。我们将为你提供一个解决方案,但请尝试创建自己的深度学习模型!这种体验的价值很大程度上在于,用你自己的方式玩转代码。

克隆 repo 并打开 Notebook(可选)

Notebook 将在教室内打开。但是,如果你想单独打开它,可以通过在终端中执行以下命令,从GitHub存储库中克隆这些资料:

git clone https://github.com/udacity/aind2-dl.git.

按照仓库中的说明设置 Conda 环境并安装必要的依赖项。 (注:如果配置后,打开jupyter notebook运行ipy文件时,kernel启动不起来,并出现以下错误 KernelRestarter: restarting kernel (2/5) /Users/LeiWang/.pyenv/versions/anaconda3-5.0.1/envs/aind-dl/bin/python: No module named ipykernel_launcher

如果出现这个错误:terminal中再输入ipython3 kernel install 方可正常运行)

在本实验中,导航到主分支,然后打开 Student_Admissions.ipynb

研究数据

数据集包含以下列:

  • 学生 GPA(成绩)
  • GRE 考试成绩(考试)
  • 级别(1-4)

首先,我们来看看数据。为此,我们将在 pandas 中使用 read_csv 函数。

import pandas as pd
data = pd.read_csv('http://www.ats.ucla.edu/stat/data/binary.csv')
print(data)

img

在这里我们可以看到第一列是标签 y,它对应于接受/拒绝。 即标签 1 表示学生被录取,标签 0 表示学生不被录取。

当我们绘制数据时,会得到如下图表,不幸的是,数据并不像我们希望的那么整洁得一目了然:

img

接下来,我们可以做的一件事就是为每等级制作一张图,共四张图。 在这种情况下,我们得到这个:

img

预处理数据

从这里,我们看到更多的希望。 因为看起来的情况是学生的考试成绩越好,他们越有可能被录取。 等级与此有关。 所以我们要做的是,对排名等级进行一次性编码,我们的6个输入变量是:

  • 考试 (GPA)
  • 成绩 (GRE)
  • 等级 1
  • 等级 2
  • 等级 3
  • 等级 4.

最后4个输入将是二进制变量,如果学生具有该等级,则其值为1,否则为0。

首先要注意的是,考试分数的范围是800,而成绩范围是4,这是一个巨大的差异,这会影响我们的训练。 通常情况下,最好的办法是将分数归一化,使其在0和1之间。我们可以这样做:

 data["gre"] = data["gre"]/800
 data["gpa"] = data["gpa"]/4

现在,我们将数据输入分成 X和标签 y,并对输出进行 one-hot 编码,因此它显示为两类(录取和不录取)。

 X = np.array(data)[:,1:]
 y = np_utils.to_categorical(np.array(data["admit"]))

构建模型架构

最后,我们定义模型架构。 我们可以使用不同的架构,不过这里有一个例子:

 model = Sequential()
 model.add(Dense(128, input_dim=6))
 model.add(Activation('sigmoid'))
 model.add(Dense(32))
 model.add(Activation('sigmoid'))
 model.add(Dense(2))
 model.add(Activation('sigmoid'))
 model.compile(loss = 'categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
 model.summary()

categorical_crossentropy 会给出错误函数,我们一直在使用,但还有其他选项。 有几个优化器可供你选择,以改善你的训练。 在这里我们会使用adam,但像rmsprop也很有用。 它们使用了我们在下面的课程中即将介绍的各种技巧。

模型总结将告诉我们以下内容:

img

训练模型

现在,我们用 1000 个 epho 训练模型。 不用担心遇到batch_size,我们很快就会学到它。

 model.fit(X_train,y_train,epochs = 1000,batch_size = 100,verbose = 0)

评估模型

最后,我们可以评估我们的模型。

  score = model.evaluate(X_train,y_train)

结果可能会有所不同,但你应该可以获得超过70%的准确度。

现在,你已经训练了你的第一个神经网络来分析一个数据集。 在接下来的节点中,你将学习许多技巧来改进训练过程。

9、keras lab 录取学生

keras lab

10、训练优化

11 、早期停止

12 、正则化

13 、正则化2

14、Dropout

15、局部最低点

16、梯度消失

17、其他激活函数

18、批次与随机梯度下降

19、学习速率衰退

20、随机重新开始

21、动量

22、Keras 中的优化程序

Keras 中有很多优化程序,建议你访问此链接或这篇精彩博文(此链接来自外网,国内网络可能打不开),详细了解这些优化程序。这些优化程序结合使用了上述技巧,以及其他一些技巧。最常见的包括:

SGD 这是随机梯度下降。它使用了以下参数:

  • 学习速率。
  • 动量(获取前几步的加权平均值,以便获得动量而不至于陷在局部最低点)。
  • Nesterov 动量(当最接近解决方案时,它会减缓梯度)。 Adam Adam (Adaptive Moment Estimation) 使用更复杂的指数衰减,不仅仅会考虑平均值(第一个动量),并且会考虑前几步的方差(第二个动量)。

RMSProp RMSProp (RMS 表示均方根误差)通过除以按指数衰减的平方梯度均值来减小学习速率。

23、世界各地的误差函数

24、神经网络回归

25、神经网络回归

神经网络基础知识的视觉和互动指南

img

我们的内容开发者之一 Jay Alammar 创建了这个神奇的神经网络 “游乐场”,在这里你可以看到很棒的可视化效果,并可以使用参数来解决线性回归问题,然后尝试一些神经网络回归。 预祝学习愉快!

https://jalammar.github.io/visual-interactive-guide-basics-neural-networks/

26、迷你项目简介

27、 迷你项目:使用 Keras 分析 IMDB 电影数据

现在,你已经准备就绪了! 在这一项目中,我们将分析一个来自 IMDB 的数据集,并用它来预测评论的情感分析。

工作区

你可以在教室中打 Notebook,然后转到下一个节点。 但是如果你想单独打开它,你可以从GitHub仓库克隆材料,在其中打开 IMDB_in_Keras.ipynb

数据集

本实验使用一个包含 25,000 条 IMDB评论的数据集。 每个评论都附带一个标签。 负面评论的标签为 0,正面评论的标签为 1。 这个实验的目标是创建一个模型,根据它的话来预测评论的情感。 你可以在Keras网站上看到关于这个数据集的更多信息。

现在,输入已经帮助我们很方便地进行预处理。 每个评论被编码为一系列索引,对应于评论中的单词。 词按频率排序,所以整数 1 对应于最频繁的词(“the”),整数 2 对应于第二频繁的词。按照惯例,整数0对应于未知词。

然后,你通过简单地连接这些整数,将句子变成一个向量。 比如,如果句子是“是或不是”。 这些词的索引如下:

  • “to”: 5
  • “be”: 8
  • “or”: 21
  • “not”: 3

那么,这个句子就会被编码为矢量[5,8,21,3,5,8]

加载数据

在 Keras中数据得到预先加载,这意味着我们不需要手动打开或读取任何文件。 加载它的命令如下,实际上可以将单词分成训练、测试集和标签:

from keras.datasets import imdb
(x_train, y_train), (x_test, y_test) = imdb.load_data(path="imdb.npz",
                                                     num_words=None,
                                                     skip_top=0,
                                                     maxlen=None,
                                                     seed=113,
                                                     start_char=1,
                                                     oov_char=2,
                                                     index_from=3)

所有这些参数说明可以在这里查看。总而言之,最重要的是:

  • num_words :要考虑的最常见的单词。如果你不想考虑一些很晦涩的词汇,比如“Ultracrepidarian”,这会很有用。
  • skip_top :忽略的热门词汇。如果你不想考虑最常见的词,这会很有用。比如,单词“the”将不会在评论中添加任何信息,所以我们可以通过将skip_top 设置为 2 或更高来跳过它。

预处理数据

在 notebook中,我们首先将数据编码为 (0,1) - 向量,编码如下:例如,如果我们的词汇量为10个词,向量为(4,1,8) ,我们将它变成矢量 (1,0,0,1,0,0,0,1,0,0)。

建立模型

现在轮到你使用所有你学到的东西了!你可以使用 Keras 建立一个神经网络,对它进行训练并评估!你需要使用诸如丢弃或正则化的方法,并且使用好的 Keras 优化器来实现这一点。准确度可以达到 85%。你的模型能实现这个吗?

如果你需要帮助,你可以在 IMDB_in_Keras_Solutions notebook中查看我们的解决方案。有许多解决方案都有用,可以随时创造性地发挥作用!

28、IMDB数据

IMDB数据

29、总结

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!


hetaodie

Mobile development

简单,深入的研究移动客户端开发技术"