提交 2a113475 编写于 作者: W wizardforcel

2020-12-23 22:56:36

上级 34761518
......@@ -79,9 +79,9 @@
# 预处理电影评论文本
电影评论文本需要进行预处理,并转换为数字标记,与语料库中的不同单词相对应。 通过使用第一个`50000`常见单词,Keras 令牌生成器将这些单词转换为数字索引或令牌。 我们已限制电影评论最多包含`1000`个单词标记。 如果电影评论的单词令牌少于`1000`,则该评论的开头会填充零。 预处理之后,数据将分为训练,验证和测试集。 保存 Keras `Tokenizer`对象以在推理期间使用。
电影评论文本需要进行预处理,并转换为数字标记,与语料库中的不同单词相对应。 通过使用第一个`50000`常见单词,Keras 分词器将这些单词转换为数字索引或标记。 我们已限制电影评论最多包含`1000`个单词标记。 如果电影评论的单词标记少于`1000`,则该评论的开头会填充零。 预处理之后,数据将分为训练,验证和测试集。 保存 Keras `Tokenizer`对象以在推理期间使用。
用于预处理电影评论的详细代码(preprocess.py)如下:
用于预处理电影评论的详细代码(`preprocess.py`)如下:
```py
# -*- coding: utf-8 -*-
......@@ -422,7 +422,7 @@ python freeze_code.py --path /home/santanu/Downloads/Mobile_App/ --MODEL_NAME mo
# 创建用于推理的单字词典
在预处理过程中,我们训练了 Keras 标记器,用其数字单词索引替换单词,以便将处理后的电影评论输入 LSTM 模型进行训练。 我们还保留了具有最高单词频率的前`50000`个单词,并将查看序列设置为`1000`的最大长度。 尽管训练有素的 Keras 令牌生成器已保存用于推断,但 Android 应用程序无法直接使用它。 我们可以还原 Keras 标记器,并将前`50000`个单词及其对应的单词索引保存在文本文件中。 可以在 Android 应用中使用此文本文件,以构建**词对索引词典**,以将评论文本的词转换为其词索引。 重要的是要注意,可以通过参考`tokenizer.word_index.`从加载的 Keras 标记生成器对象中检索单词到索引的映射,执行此活动`tokenizer_2_txt.py`的详细代码如下:
在预处理过程中,我们训练了 Keras 标记器,用其数字单词索引替换单词,以便将处理后的电影评论输入 LSTM 模型进行训练。 我们还保留了具有最高单词频率的前`50000`个单词,并将查看序列设置为`1000`的最大长度。 尽管训练有素的 Keras 标记生成器已保存用于推断,但 Android 应用程序无法直接使用它。 我们可以还原 Keras 标记器,并将前`50000`个单词及其对应的单词索引保存在文本文件中。 可以在 Android 应用中使用此文本文件,以构建**词对索引词典**,以将评论文本的词转换为其词索引。 重要的是要注意,可以通过参考`tokenizer.word_index.`从加载的 Keras 标记生成器对象中检索单词到索引的映射,执行此活动`tokenizer_2_txt.py`的详细代码如下:
```py
import keras
......@@ -469,7 +469,7 @@ Using TensorFlow backend.
# 应用界面页面设计
可以使用 Android Studio 设计一个简单的移动应用程序界面,并将相关代码生成为 XML 文件。 正如您在以下屏幕截图(“图 7.3”)中所看到的那样,该应用程序包含一个简单的电影评论文本框,用户可以在其中输入他们的电影评论,并在完成后按 SUBMIT 按钮。 按下 SUBMIT 按钮后,评论将传递到核心应用逻辑,该逻辑将处理电影评论文本并将其传递给 TensorFlow 优化模型进行推理。
可以使用 Android Studio 设计一个简单的移动应用程序界面,并将相关代码生成为 XML 文件。 正如您在以下屏幕截图(“图 7.3”)中所看到的那样,该应用程序包含一个简单的电影评论文本框,用户可以在其中输入他们的电影评论,并在完成后按`SUBMIT`按钮。 按下`SUBMIT`按钮后,评论将传递到核心应用逻辑,该逻辑将处理电影评论文本并将其传递给 TensorFlow 优化模型进行推理。
作为推理的一部分,将计算情感得分,该得分将显示在移动应用上,并同时以星级评分的形式展示:
......@@ -582,7 +582,7 @@ Android 应用程序的核心逻辑是处理用户请求以及传递的数据,
2. 使用`OnClickListener`方法监视用户是否已提交电影评论以进行推断。
3. 如果已提交电影评论,则将从与 XML 关联的`Review`变量中读取评论。 该评论会通过删除标点符号等内容进行清理,然后拆分为单词。 使用`HashMap`函数`WordToInd`将这些单词中的每个单词转换为相应的索引。 这些索引构成我们 TensorFlow 模型的`InputVec`输入,以进行推断。 输入向量长度为​​`1000`; 因此,如果评论的字数少于`1000`,则矢量的开头将填充零。
4. 下一步,使用`TensorFlowInferenceInterface`功能创建`mInferenceInterface`对象,将优化的 protobuf 模型(扩展名为`.pb`)从`assets`文件夹加载到内存中。 与原始模型一样,需要定义要参考的 TensorFlow 模型的输入节点和输出节点。 对于我们的模型,它们定义为`INPUT_NODE``OUTPUT_NODE`,它们分别包含 TensorFlow 输入占位符的名称和输出情感概率 ops`mInferenceInterface` 对象的`feed`方法用于将`InputVec`值分配给的`INPUT_NODE` 模型,而`mInferenceInterface``run`方法执行`OUTPUT_NODE`。 最后,使用`mInferenceInterface``fetch`方法来填充对浮点变量`value_`的推断结果。
4. 下一步,使用`TensorFlowInferenceInterface`功能创建`mInferenceInterface`对象,将优化的 protobuf 模型(扩展名为`.pb`)从`assets`文件夹加载到内存中。 与原始模型一样,需要定义要参考的 TensorFlow 模型的输入节点和输出节点。 对于我们的模型,它们定义为`INPUT_NODE``OUTPUT_NODE`,它们分别包含 TensorFlow 输入占位符的名称和输出情感概率的操作`mInferenceInterface` 对象的`feed`方法用于将`InputVec`值分配给的`INPUT_NODE` 模型,而`mInferenceInterface``run`方法执行`OUTPUT_NODE`。 最后,使用`mInferenceInterface``fetch`方法来填充对浮点变量`value_`的推断结果。
5. 情感分数(情感为正的概率)乘以五将转换为等级。 然后通过`ratingBar` 变量将其馈送到 Android 应用程序用户界面。
Java 中的移动应用程序的核心逻辑如下:
......@@ -744,7 +744,7 @@ org.tensorflow:tensorflow-android:1.7.0
> “阿凡达》不仅是一种令人震撼的娱乐活动,而且还是一项技术突破。它具有鲜明的绿色和反战信息。它注定要发动一场邪教。它包含如此直观的细节, 像《指环王》一样,它发明了一种新的语言 Na'vi,尽管我很仁慈地怀疑这种语言可以被人类甚至青少年使用,它创造了新的电影明星。 在那些电影中,您觉得必须跟上对话的步伐。”
审阅者给电影评分为 4/5,而移动应用的评分为 4.8 / 5,如以下屏幕截图所示(“图 7.4”):
审阅者给电影评分为 4/5,而移动应用的评分为 4.8/5,如以下屏幕截图所示(“图 7.4”):
![](img/edef4e5f-45e7-40d0-8e72-9d9f44e37b38.png)
......@@ -754,7 +754,7 @@ org.tensorflow:tensorflow-android:1.7.0
> “星际大片代表了导演兼导演克里斯托弗·诺兰(Christopher Nolan)所期待的更多激动人心,发人深省,视觉上灿烂的电影制作人,即使其知识渊博超出了人们的理解范围。”
该影片在*烂番茄*上的平均评分为 7/10,如果将其缩放为 5,则得分为 3.5 / 5,而移动应用预测的评分为 3.37,如下图所示 屏幕截图(“图 7.5”):
该影片在*烂番茄*上的平均评分为 7/10,如果将其缩放为 5,则得分为 3.5/5,而移动应用预测的评分为 3.37,如下图所示 屏幕截图(“图 7.5”):
![](img/e35227a8-c487-43ee-934b-08186678ae3a.png)
......
# 用于客户服务的会话式 AI 聊天机器人
会话式聊天机器人最近因其在增强客户体验方面的作用而大肆宣传。 现代企业已经开始在几个不同的过程中使用聊天机器人的功能。 由于对话式 AI 的广泛接受,填写表格或通过 Internet 发送信息的繁琐任务变得更加简化。 对话型聊天机器人的理想品质之一是,它应该能够在当前上下文中响应用户请求。 对话型聊天机器人系统中的参与者分别是用户和机器人。 使用对话型聊天机器人有很多优点,如下表所示:
会话式聊天机器人最近因其在增强客户体验方面的作用而大肆宣传。 现代企业已经开始在几个不同的过程中使用聊天机器人的功能。 由于对话式 AI 的广泛接受,填写表格或通过互联网发送信息的繁琐任务变得更加简化。 对话型聊天机器人的理想品质之一是,它应该能够在当前上下文中响应用户请求。 对话型聊天机器人系统中的参与者分别是用户和机器人。 使用对话型聊天机器人有很多优点,如下表所示:
* **个性化帮助**:为所有客户创建个性化体验可能是一项繁琐的任务,但如果不这样做,则会使企业蒙受损失。 对话型聊天机器人是向每个客户提供个性化体验的便捷替代方法。
* **全天候支持**:使用客户服务代表 24/7 的费用很高。 在非工作时间使用聊天机器人提供客户服务消除了雇用额外客户代表的麻烦。
......@@ -173,7 +173,7 @@ RNN 的 LSTM 版本用于构建序列到序列模型。 这是因为 LSTM 在记
在此模型中,我们使用两个 LSTM。 第一个 LSTM 将输入推文编码为上下文向量。 该上下文向量不过是编码器 LSTM 的最后一个隐藏状态![](img/88e131cf-cc81-4f08-bb73-0bbb27ce18ed.png)`n`是隐藏状态向量的维。 输入推文![](img/ee42536a-7091-4d15-8ec9-ef97ead2b272.png)作为单词索引序列被馈送到编码器 LSTM,`k`就是输入推文的序列长度。 这些单词索引在馈送到 LSTM 之前已映射到单词嵌入`w ∈ R^m`。 单词嵌入包含在一个嵌入矩阵中`[W ∈ R^(m x N)]`,其中`N`表示词汇表中单词的数量。
第二个 LSTM 用作解码器。 它试图将编码器 LSTM 创建的上下文向量![](img/4c8e1ab3-3b4e-4061-b674-5cbd46748052.png)解码为有意义的响应。 作为此方法的一部分,我们在每个时间步中将上下文向量与前一个单词一起馈入以生成当前单词。 在第一步中,我们没有任何先前的词可用于条件 LSTM,因此我们使用代理`START`词开始从解码器 LSTM 生成词序列的过程。 在推理过程中,我们在当前时间步输入前一个单词的方式与训练过程中使用的方法不同。 在训练中,由于我们在每个时间步都知道`apriori`之前的单词,因此相应地输入它们没有任何问题。 但是,在推理期间,由于我们在当前时间步上没有实际的前一个单词,因此会反馈前一个时间步上的预测单词。 每个时间步`t`的隐藏状态![](img/99084dfb-e5ab-4074-ad44-01bb8d36b1d3.png)在最终的最大 softmax`N`之前通过几个全连接层馈送。 在此 softmax 层中获得最大概率的单词是时间步长的预测单词。 然后将这个字输入到下一步的输入,即解码器 LSTM 的步骤`t + 1`
第二个 LSTM 用作解码器。 它试图将编码器 LSTM 创建的上下文向量![](img/4c8e1ab3-3b4e-4061-b674-5cbd46748052.png)解码为有意义的响应。 作为此方法的一部分,我们在每个时间步中将上下文向量与前一个单词一起馈入以生成当前单词。 在第一步中,我们没有任何先前的词可用于条件 LSTM,因此我们使用代理`START`词开始从解码器 LSTM 生成词序列的过程。 在推理过程中,我们在当前时间步输入前一个单词的方式与训练过程中使用的方法不同。 在训练中,由于我们在每个时间步都知道`apriori`之前的单词,因此相应地输入它们没有任何问题。 但是,在推理期间,由于我们在当前时间步上没有实际的前一个单词,因此会反馈前一个时间步上的预测单词。 每个时间步`t`的隐藏状态![](img/99084dfb-e5ab-4074-ad44-01bb8d36b1d3.png)在最终的最大 softmax `N`之前通过几个全连接层馈送。 在此 softmax 层中获得最大概率的单词是时间步长的预测单词。 然后将这个字输入到下一步的输入,即解码器 LSTM 的步骤`t + 1`
Keras 中的`TimeDistributed`函数允许在解码器 LSTM 的每个时间步长获得预测的有效实现,如以下代码所示:
......
......@@ -127,7 +127,7 @@ Q 值表也通过迭代`t`进行索引,因为代理只能查看到目前为止
当![](img/3324a291-28b5-4821-920a-394f71f7e4fe.png)是恒定折扣因子时就是这种情况。 奖励`r`已经是训练元组的一部分。 因此,我们唯一需要计算目标的是动作`a'`,该动作给出最大 Q 值,并将相应的 Q 值赋予相应的动作`a'`。 这个计算问题![](img/b1ae24ef-b42e-46c8-9bba-d3868b2e37ed.png)分为两个部分:
* 网络`A`确定动作`a'`,该动作在状态`s'`下给出最大 Q 值。 但是,我们**不会**从网络 A 中获取与`a'`和状态`s'`对应的 Q 值。
* 网络`A`确定动作`a'`,该动作在状态`s'`下给出最大 Q 值。 但是,我们**不会**从网络`A`中获取与`a'`和状态`s'`对应的 Q 值。
* 网络`B`用于提取 Q 值`Q[tk](s', a')`对应于状态`s'`和动作`a'`
与基本的`DQN`相比,这导致稳定得多的训练。
......@@ -406,7 +406,7 @@ class RandomAgent:
# 自动驾驶汽车的环境
自动驾驶汽车的环境是 **OpenAI Gym**`CarRacing-v0`。 从此 OpenAI 环境呈现给代理的状态是`CarRacing-v0`中来自仿真汽车正面的图像。 环境**,**也会根据代理在给定状态下采取的行动来返回奖励。 如果汽车踩在草地上,我们将对奖励进行处罚,并将奖励标准化为`(-1,1)`以进行稳定训练。 环境的详细代码如下
自动驾驶汽车的环境是 **OpenAI Gym**`CarRacing-v0`。 从此 OpenAI 环境呈现给代理的状态是`CarRacing-v0`中来自仿真汽车正面的图像。 环境也会根据代理在给定状态下采取的行动来返回奖励。 如果汽车踩在草地上,我们将对奖励进行处罚,并将奖励标准化为`(-1,1)`以进行稳定训练。 环境的详细代码如下
```py
import gym
......
......@@ -62,7 +62,7 @@ plt.imshow(image)
与文本一起,`Claptcha`工具要求使用打印字体作为输入的字体。 如我们所见,它以横轴上有些扭曲的线的形式给图像增加了噪点。
# 生成数据以训练 CAPTCHA 断路
# 生成数据以训练 CAPTCHA 破坏
在本节中,我们将使用`Claptcha`工具生成多个验证码,以训练 CNN 模型。 CNN 模型将通过监督训练来学习识别 CAPTCHA 中的字符。 我们将生成用于训练 CNN 模型的训练和验证集。 除此之外,我们将生成一个单独的测试集,以评估其概括未见数据的能力。 可以对`CaptchaGenerator.py`脚本进行如下编码以生成验证码数据:
......@@ -125,9 +125,9 @@ python CaptchaGenerator.py --outdir_train '/home/santanu/Downloads/Captcha Gener
3.328 min: main_process
```
在下一节中,我们将讨论 CAPTCHA 断路器的卷积神经网络架构。
在下一节中,我们将讨论 CAPTCHA 破坏器的卷积神经网络架构。
# 验证码断路器 CNN 架构
# 验证码破坏器 CNN 架构
我们将使用 CNN 架构来识别 CAPTCHA 中的字符。 CNN 在密集层之前将具有两对卷积和池化。 我们将把验证码分为四个字符,然后将它们分别输入模型,而不是将整个验证码输入网络。 这要求 CNN 的最终输出层预测与`26`字母和`10`数字有关的`36`类之一。
......@@ -159,11 +159,11 @@ def _model_(n_classes):
```
可以如下图所示图示 CAPTCHA 断路器 CNN 模型(“图 10.3”):
可以如下图所示图示 CAPTCHA 破坏器 CNN 模型(“图 10.3”):
![](img/608c6914-e403-4e73-80a5-15da7deb8b53.png)
图 10.3:CAPTCHA Breaker CNN 架构
图 10.3:CAPTCHA 破坏器 CNN 架构
# 预处理 CAPTCHA 图像
......@@ -266,9 +266,9 @@ class DataGenerator(keras.utils.Sequence):
return X,y
```
# 训练 CAPTCHA 断路
# 训练 CAPTCHA 破坏
可以通过调用`train`功能来训练 CAPTCHA 断路器模型,如下所示:
可以通过调用`train`功能来训练 CAPTCHA 破坏器模型,如下所示:
```py
def train(dest_train,dest_val,outdir,batch_size,n_classes,dim,shuffle,epochs,lr):
......@@ -392,7 +392,7 @@ SVHN 是一个现实世界的数据集,由于它在对象识别算法中的使
通过这个**生成对抗网络****GAN**),我们将根据随机噪声生成房屋编号图像,并且生成的图像将与 SVHN 数据集中的图像非常相似。
回顾一下,在 GAN 中,我们有一个生成器(`G`)和一个鉴别器(`D`),它们针对损失函数彼此玩零和极小极大游戏。 随着时间的流逝,生成器和鉴别器的工作都会越来越好,直到我们到达一个固定点为止,两者都无法进一步改善。 该固定点是相对于损失函数的鞍点。 对于我们的应用,发生器 G 会将给定分布`P(z)`的噪声`z`转换​​为门牌号图像`x`,以使`x = G(z)`
回顾一下,在 GAN 中,我们有一个生成器(`G`)和一个鉴别器(`D`),它们针对损失函数彼此玩零和极小极大游戏。 随着时间的流逝,生成器和鉴别器的工作都会越来越好,直到我们到达一个固定点为止,两者都无法进一步改善。 该固定点是相对于损失函数的鞍点。 对于我们的应用,发生器`G`会将给定分布`P(z)`的噪声`z`转换​​为门牌号图像`x`,以使`x = G(z)`
生成的图像通过鉴别器`D`传递,鉴别器`D`尝试检测此生成的图像`x`为伪造,并从 SVHN 数据集中检测真实的门牌号码图像为真实。 同时,生成器将尝试创建图像`x = G(z)`,以使鉴别器发现图像是真实的。 如果我们将真实图像标记为`1`,而将生成器生成的伪图像标记为`0`,则鉴别器将尝试在给定两个类别的分类器网络中最小化二进制交叉熵损失。 鉴别符`D`所导致的损耗可以写成如下:
......@@ -436,7 +436,7 @@ SVHN 是一个现实世界的数据集,由于它在对象识别算法中的使
生成器网络将吸收随机噪声,并尝试输出类似于 SVHN 图像的图像作为输出。 随机噪声是`100`维输入向量。 每个维度都是遵循标准正态分布的随机变量,平均值为`0`,标准偏差为`1`
最初的致密层具有`8192`单元,将其重塑为形状为 4 x 4 x 512 的三维张量。 使用`512`滤镜可以将张量视为 4 x 4 图像。 为了增加张量的空间尺寸,我们进行了一系列转置 2D 卷积,步幅为`2`,内核滤波器尺寸为 5 x5。步幅大小决定了转置卷积的缩放比例。 例如,跨度为 2 的跨度将输入图像的每个空间尺寸加倍,然后进行转置卷积,通常会进行批归一化,以实现更好的收敛性。 除了激活层,网络使用`LeakyReLU`作为激活函数。 网络的最终输出是尺寸为 32 x 32 x 3 的图像。
最初的致密层具有`8192`单元,将其重塑为形状为`4 x 4 x 512`的三维张量。 使用`512`滤镜可以将张量视为`4 x 4`图像。 为了增加张量的空间尺寸,我们进行了一系列转置 2D 卷积,步幅为`2`,内核滤波器尺寸为`5 x5`。步幅大小决定了转置卷积的缩放比例。 例如,跨度为 2 的跨度将输入图像的每个空间尺寸加倍,然后进行转置卷积,通常会进行批归一化,以实现更好的收敛性。 除了激活层,网络使用`LeakyReLU`作为激活函数。 网络的最终输出是尺寸为`32 x 32 x 3`的图像。
在最后一层中使用`tanh`激活,以便对`[-1,1]`范围内的图像像素值进行标准化。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册