Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
D_ACMER
apachecn-dl-zh
提交
38553a11
A
apachecn-dl-zh
项目概览
D_ACMER
/
apachecn-dl-zh
与 Fork 源项目一致
Fork自
OpenDocCN / apachecn-dl-zh
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
apachecn-dl-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
38553a11
编写于
8月 27, 2020
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2020-08-27 23:09:35
上级
ea70f28a
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
21 addition
and
21 deletion
+21
-21
docs/handson-tl-py/10.md
docs/handson-tl-py/10.md
+20
-20
docs/handson-tl-py/3.md
docs/handson-tl-py/3.md
+1
-1
未找到文件。
docs/handson-tl-py/10.md
浏览文件 @
38553a11
...
...
@@ -81,7 +81,7 @@
成功的图像字幕系统需要一种将给定图像转换为单词序列的方法。 为了从图像中提取正确和相关的特征,我们可以利用 DCNN,再结合循环神经网络模型(例如 RNN 或 LSTM),我们可以构建混合生成模型以开始生成单词序列作为标题,给定 源图像。
因此,从概念上讲,这个想法是建立一个混合模型,该模型可以将源图像
*I*
作为输入,并可以进行训练以使可能性最大,
*P(S | I),*
,这样
*S*
是单词序列的输出,这是我们的目标输出,可以由
*S = {S <sub>1</sub> ,S <sub>2 表示</sub> ,...,S <sub>n</sub> }*
,这样每个单词
*S <sub>w</sub>*
都来自给定的词典,这就是我们的词汇。 该标题
*S*
应该能够对输入图像给出恰当的描述。
因此,从概念上讲,这个想法是建立一个混合模型,该模型可以将源图像
`I`
作为输入,并可以进行训练以使可能性最大,
`P(S|I)`
,这样
`S`
是单词序列的输出,这是我们的目标输出,可以由
`S = {S [1], S[2], ..., S[n]}`
表示,这样每个单词
`S[w]`
都来自给定的词典,这就是我们的词汇。 该标题
`S`
应该能够对输入图像给出恰当的描述。
神经机器翻译是构建这样一个系统的绝佳灵感。 通常在语言模型中用于语言翻译,模型体系结构涉及使用 RNN 或 LSTM 构建的编码器-解码器体系结构。 通常,编码器涉及一个 LSTM 模型,该模型从源语言中读取输入语句并将其转换为密集的定长向量。 然后将其用作解码器 LSTM 模型的初始隐藏状态,最终以目标语言生成输出语句。
...
...
@@ -89,37 +89,37 @@
![](
img/4e95a622-a125-4518-9d81-f0de283fe145.png
)
在此,
Θ表示模型参数,
*I*
表示输入图像,
*S*
是其相应的由单词序列组成的标题描述。 考虑到长度为
*N*
的字幕说明,表示总共
*N*
个字,我们可以对
*{S <sub>0</sub> ,S <sub>1</sub> ,...,S <sub>N</sub> }*
,
使用链式规则,如下所示:
在此,
`Θ`
表示模型参数,
`I`
表示输入图像,
`S`
是其相应的由单词序列组成的标题描述。 考虑到长度为
`N`
的字幕说明,表示总共
`N`
个字,我们可以对
`{S[0], S[1], ...,S[N]}`
使用链式规则,如下所示:
![](
img/ea7fa58f-ba10-4924-a55c-5875ee0b307b.png
)
因此,在模型训练期间,我们有一对
(
*I*
,
*S*
)图像标题作为输入,其思想是针对上一个方程式优化对数概率的总和 使用有效算法(例如随机梯度下降)来完整训练数据。 考虑到前面公式的 RHS 中的项序列,基于 RNN 的模型是合适的选择,这样,直到
*t-1*
的可变单词数依次由存储状态
*h 表示 <sub>t</sub>*
。 根据先前的
*t-1*
状态和输入对(图像和下一个字)
*x <sub>t</sub>*
,使用以下命令在每个步骤中按以下步骤更新此内容: 非线性函数
`f(...)`
:
因此,在模型训练期间,我们有一对
`(I, S)`
图像标题作为输入,其思想是针对上一个方程式优化对数概率的总和 使用有效算法(例如随机梯度下降)来完整训练数据。 考虑到前面公式的 RHS 中的项序列,基于 RNN 的模型是合适的选择,这样,直到
`t-1`
的可变单词数依次由存储状态
`h[t]`
表示。 根据先前的
`t-1`
状态和输入对(图像和下一个字)
`x[t]`
,使用以下命令在每个步骤中按以下步骤更新此内容: 非线性函数
`f(...)`
:
*h <sub>t + 1</sub> = f(h <sub>t</sub> ,x <sub>t</sub> )*
`h[t+1] = f(h[t], x[t])`
通常,
*x <sub>t</sub>*
代表我们的图像特征和文字,它们是我们的输入。 对于图像功能,我们利用了前面提到的 DCNN。 对于函数
*f*
,我们选择使用 LSTM,因为它们在处理消失和探索梯度等问题方面非常有效,这已在本书的初始章节中进行了讨论。 考虑到 LSTM 存储器块的简要介绍,让我们参考
*Show and Tell*
研究论文中的下图:
通常,
`x[t]`
代表我们的图像特征和文字,它们是我们的输入。 对于图像功能,我们利用了前面提到的 DCNN。 对于函数
`f`
,我们选择使用 LSTM,因为它们在处理消失和探索梯度等问题方面非常有效,这已在本书的初始章节中进行了讨论。 考虑到 LSTM 存储器块的简要介绍,让我们参考《Show and Tell》
研究论文中的下图:
![](
img/78f9f35a-5341-47c2-8e0d-2759083c43a7.png
)
存储块包含 LSTM 单元
**c**
,该单元由输入,输出和忘记门控制。 单元
*c*
将根据输入对每个时间步的知识进行编码,直到先前的时间步为止。 如果门是
*1*
或
*0*
,则这三个门是可以相乘的层,以保持或拒绝来自门控层的值。 循环连接在上图中以蓝色显示。 我们通常在模型中有多个 LSTM,并且在时间
*t -1*
的输出
*m <sub>t-1</sub>*
在时间被馈送到下一个 LSTM。
*t*
。 因此,使用以下三个时间,将在时间
*t-1*
处的输出
*m <sub>t-1</sub>*
反馈到存储块。 我们前面讨论过的门。 实际的单元格值也使用“忘记门”反馈。 通常将时间
*t*
处的存储器输出
*m <sub>t</sub>*
输出到 softmax 以预测下一个单词。
存储块包含 LSTM 单元
`c`
,该单元由输入,输出和忘记门控制。 单元
`c`
将根据输入对每个时间步的知识进行编码,直到先前的时间步为止。 如果门是
*1*
或
*0*
,则这三个门是可以相乘的层,以保持或拒绝来自门控层的值。 循环连接在上图中以蓝色显示。 我们通常在模型中有多个 LSTM,并且在时间
`t-1`
的输出
`m[t-1]`
在时间被馈送到下一个 LSTM。因此,使用以下三个时间,将在时间
`t-1`
处的输出
`m[t-1]`
反馈到存储块。 我们前面讨论过的门。 实际的单元格值也使用“忘记门”反馈。 通常将时间
`t`
处的存储器输出
`m[t]`
输出到 softmax 以预测下一个单词。
这通常是从输出门
*o <sub>t</sub>*
和当前单元状态
*c <sub>t</sub>*
获得的。 下图中描述了其中的一些定义和操作以及必要的方程式:
这通常是从输出门
`o[t]`
和当前单元状态
`c[t]`
获得的。 下图中描述了其中的一些定义和操作以及必要的方程式:
![](
img/dc8b0dfb-4929-42ec-ab41-196bf28b0bbe.png
)
在这里,!
[](
img/7e114bcc-d207-47f4-a6d0-7318698691f2.png
)
是乘积运算符,尤其用于当前的门状态和值。
*W*
矩阵是网络中的可训练参数。 这些门有助于解决诸如爆炸和消失梯度的问题。 网络中的非线性是由我们的常规 S 型!
[](
img/368145b5-993b-4ece-acc2-74dfb213a8bc.png
)
和双曲正切
*h*
函数引入的。 如前所述,内存输出
*m <sub> t </sub>*
被馈送到 softmax 以预测下一个单词,其中输出是所有单词上的概率分布。
在这里,!
[](
img/7e114bcc-d207-47f4-a6d0-7318698691f2.png
)
是乘积运算符,尤其用于当前的门状态和值。
`W`
矩阵是网络中的可训练参数。 这些门有助于解决诸如爆炸和消失梯度的问题。 网络中的非线性是由我们的常规 S 型!
[](
img/368145b5-993b-4ece-acc2-74dfb213a8bc.png
)
和双曲正切
`h`
函数引入的。 如前所述,内存输出
`m[t]`
被馈送到 softmax 以预测下一个单词,其中输出是所有单词上的概率分布。
因此,基于此知识,您可以考虑基于 LSTM 的序列模型需要与必要的词嵌入层和基于 CNN 的模型结合,以从源图像生成密集特征。 因此,LSTM 模型的目标是根据预测的所有先前单词以及输入图像(由我们先前的
*p(S <sub>t</sub> | I,S <sub>0</sub> ,S <sub>1</sub> ,...,S <sub>t-1</sub> )*
。 为了简化 LSTM 中的循环连接,我们可以以展开形式来表示它,其中我们代表一系列 LSTM,它们共享下图所示的相同参数:
因此,基于此知识,您可以考虑基于 LSTM 的序列模型需要与必要的词嵌入层和基于 CNN 的模型结合,以从源图像生成密集特征。 因此,LSTM 模型的目标是根据预测的所有先前单词以及输入图像(由我们先前的
`p(S[t] | I, S[0], S[1], ..., S[t-1])`
。 为了简化 LSTM 中的循环连接,我们可以以展开形式来表示它,其中我们代表一系列 LSTM,它们共享下图所示的相同参数:
![](
img/25803aa5-92dd-4e45-9711-a1ef2878d940.png
)
从上图可以明显看出,基于展开的 LSTM 体系结构,循环连接由蓝色水平箭头表示,并已转换为前馈连接。 同样,很明显,在时间
*t-1*
处 LSTM 的输出
*m <sub>t-1</sub>*
在时间
*t 被馈送到下一个 LSTM。*
等。 将源输入图像视为
*I*
,将字幕视为
*S = {S <sub>0</sub> ,S <sub>1</sub> ,...,S <sub>N</sub> }*
下图描述了先前描述的展开架构中涉及的主要操作:
从上图可以明显看出,基于展开的 LSTM 体系结构,循环连接由蓝色水平箭头表示,并已转换为前馈连接。 同样,很明显,在时间
`t-1`
处 LSTM 的输出
`m[t-1]`
在时间
`t`
被馈送到下一个 LSTM。 将源输入图像视为
`I`
,将字幕视为
`S = {S[0], S[1], ..., S[N]}`
,
下图描述了先前描述的展开架构中涉及的主要操作:
![](
img/f4d3d071-bd12-4d75-99c3-f51d640b329d.png
)
在这里,标题中的每个文本单词都由一个热门向量
*S <sub>t</sub>*
表示,因此其尺寸等于我们词汇量(唯一的单词)。 另外要注意的一点是,我们为
*S <sub>0</sub>*
设置了特殊的标记或分隔符,分别由
`<START>`
和
*S <sub>N</sub> 表示[*
,我们用
`<END>`
来表示字幕的开头和结尾。 这有助于 LSTM 理解何时完全生成了字幕。
在这里,标题中的每个文本单词都由一个热门向量
`S[t]`
表示,因此其尺寸等于我们词汇量(唯一的单词)。 另外要注意的一点是,我们为
`S[0]`
设置了特殊的标记或分隔符,分别由
`<START>`
和
`S[N]`
表示
,我们用
`<END>`
来表示字幕的开头和结尾。 这有助于 LSTM 理解何时完全生成了字幕。
输入图像
*I*
输入到我们的 DCNN 模型中,该模型生成密集特征向量,并将基于嵌入层的单词转换为密集单词嵌入
*W <sub>∈</sub>*
。 因此,要最小化的整体损失函数是每个步骤右词的对数似然比,如以下等式所示:
输入图像
`I`
输入到我们的 DCNN 模型中,该模型生成密集特征向量,并将基于嵌入层的单词转换为密集单词嵌入
`W[eps]`
。 因此,要最小化的整体损失函数是每个步骤右词的对数似然比,如以下等式所示:
![](
img/e6a2071b-06ad-4962-91d1-2a66bf08c6e0.png
)
...
...
@@ -830,17 +830,17 @@ max_caption_size = vocab_metadata['max_caption_size']
vocab_size
=
vocab_metadata
[
'vocab_size'
]
```
# 了解贪婪和
波
束搜索
# 了解贪婪和
集
束搜索
为了从基于深度学习的神经图像字幕模型生成预测,请记住,它不像基本分类或分类模型那样简单。 我们将需要根据输入图像特征在每个时间步从模型中生成一系列单词。 有多种方式为字幕生成这些单词序列。
一种方法称为
**采样**
或
**g**
**芦苇搜索**
,我们从
`<START>`
令牌开始,输入图像特征,然后生成第一个单词 基于 LSTM 输出中的
*p1*
。 然后,我们将相应的预测词嵌入作为输入,并根据来自下一个 LSTM 的
*p2*
生成下一个词(以我们之前讨论的展开形式)。 继续此步骤,直到到达
`<END>`
令牌(表示字幕结束)为止,或者达到基于预定义阈值的令牌的最大可能长度。
一种方法称为
**采样**
或
**贪婪搜索**
,我们从
`<START>`
令牌开始,输入图像特征,然后生成第一个单词 基于 LSTM 输出中的
`p1`
。 然后,我们将相应的预测词嵌入作为输入,并根据来自下一个 LSTM 的
`p2`
生成下一个词(以我们之前讨论的展开形式)。 继续此步骤,直到到达
`<END>`
令牌(表示字幕结束)为止,或者达到基于预定义阈值的令牌的最大可能长度。
第二种方法称为
**
波束搜索**
,它比基于贪婪的搜索更有效,在基于贪婪的搜索中,我们在考虑到每个单词之前生成的单词的基础上,根据最高概率在每个步骤中选择最可能的单词 顺序,这正是采样的作用。 Beam 搜索扩展了贪婪搜索技术,并始终返回最可能输出的术语序列的列表。 因此,在构建每个序列时,为了在时间步
*t + 1*
生成下一项,而不是进行贪婪搜索并生成最可能的下一项,迭代地考虑了一组
*k*
最佳句子基于下一步扩展到所有可能的下一词。
*k*
的值通常是用户指定的参数,用于控制进行平行搜索或波束搜索以生成字幕序列的总数。 因此,在波束搜索中,我们以
*k*
最可能的单词作为字幕序列中的第一时间步输出开始,并继续生成下一个序列项,直到其中一个达到结束状态为止。 涵盖围绕波束搜索的详细概念的全部范围将不在当前范围之内,因此,如果您有兴趣,我们建议您查看有关 AI 上下文中波
束搜索的任何标准文献。
第二种方法称为
**
集束搜索**
,它比基于贪婪的搜索更有效,在基于贪婪的搜索中,我们在考虑到每个单词之前生成的单词的基础上,根据最高概率在每个步骤中选择最可能的单词 顺序,这正是采样的作用。 Beam 搜索扩展了贪婪搜索技术,并始终返回最可能输出的术语序列的列表。 因此,在构建每个序列时,为了在时间步
`t+1`
生成下一项,而不是进行贪婪搜索并生成最可能的下一项,迭代地考虑了一组
`k`
最佳句子基于下一步扩展到所有可能的下一词。
`k`
的值通常是用户指定的参数,用于控制进行平行搜索或集束搜索以生成字幕序列的总数。 因此,在集束搜索中,我们以
`k`
最可能的单词作为字幕序列中的第一时间步输出开始,并继续生成下一个序列项,直到其中一个达到结束状态为止。 涵盖围绕集束搜索的详细概念的全部范围将不在当前范围之内,因此,如果您有兴趣,我们建议您查看有关 AI 上下文中集
束搜索的任何标准文献。
# 实现基于
波
束搜索的字幕生成器
# 实现基于
集
束搜索的字幕生成器
现在,我们将实现一种基于
波
束搜索的基本算法来生成字幕序列:
现在,我们将实现一种基于
集
束搜索的基本算法来生成字幕序列:
```
py
from
keras.preprocessing
import
image
,
sequence
...
...
@@ -878,7 +878,7 @@ def get_raw_caption_sequences(model, word_to_index, image_features,
return
caption_seqs
```
这有助于我们使用
波
束搜索基于输入图像特征生成字幕。 但是,它是在每个步骤中基于先前标记的原始标记序列。 因此,我们将在此基础上构建一个包装器函数,该函数将利用先前的函数生成一个纯文本句子作为输入图像的标题:
这有助于我们使用
集
束搜索基于输入图像特征生成字幕。 但是,它是在每个步骤中基于先前标记的原始标记序列。 因此,我们将在此基础上构建一个包装器函数,该函数将利用先前的函数生成一个纯文本句子作为输入图像的标题:
```
py
def
generate_image_caption
(
model
,
word_to_index_map
,
index_to_word_map
,
...
...
@@ -1028,7 +1028,7 @@ ep50bs1_bleu = compute_bleu_evaluation(
```
您可以清楚地看到,随着我们开始考虑更高水平的 n-gram,分数开始下降。 总体而言,运行此过程非常耗时,要在
波
束搜索中获得更高的阶数会花费大量时间。 我们尝试了光束大小分别为 1、3、5 和 10 的实验。下表描述了每个实验的模型性能:
您可以清楚地看到,随着我们开始考虑更高水平的 n-gram,分数开始下降。 总体而言,运行此过程非常耗时,要在
集
束搜索中获得更高的阶数会花费大量时间。 我们尝试了光束大小分别为 1、3、5 和 10 的实验。下表描述了每个实验的模型性能:
![](
img/0c77c2ea-ffb1-4db5-8e3b-35514628b0d0.png
)
...
...
@@ -1036,7 +1036,7 @@ ep50bs1_bleu = compute_bleu_evaluation(
![](
img/d091a430-a904-4c49-9b84-cc431209bfca.png
)
从上一张图可以很明显地看出,基于 BLEU 指标,我们在
波束搜索期间具有 50 个历元且波
束大小为 10 的模型为我们提供了最佳性能。
从上一张图可以很明显地看出,基于 BLEU 指标,我们在
集束搜索期间具有 50 个历元且集
束大小为 10 的模型为我们提供了最佳性能。
# 自动图片字幕功能!
...
...
docs/handson-tl-py/3.md
浏览文件 @
38553a11
...
...
@@ -381,7 +381,7 @@ LSTM 可以用于序列预测以及序列分类。 例如,我们可以预测
资料来源:https://www.tensorflow.org/tutorials/seq2seq
输入嵌入层后面是两个堆叠的 LSTM 层。 然后,投影层将最上面的隐藏状态转换为尺寸为
`V`
(目标语言的词汇量)的 logit 向量。 这里,交叉熵损失用于通过反向传播训练网络。 我们看到在训练模式下,源句子和目标句子都被输入到网络中。 在推理模式下,我们只有源句。 在那种情况下,可以通过几种方法来完成解码,例如贪婪解码,与贪婪解码结合的注意力机制以及
波
束搜索解码。 我们将在这里介绍前两种方法:
输入嵌入层后面是两个堆叠的 LSTM 层。 然后,投影层将最上面的隐藏状态转换为尺寸为
`V`
(目标语言的词汇量)的 logit 向量。 这里,交叉熵损失用于通过反向传播训练网络。 我们看到在训练模式下,源句子和目标句子都被输入到网络中。 在推理模式下,我们只有源句。 在那种情况下,可以通过几种方法来完成解码,例如贪婪解码,与贪婪解码结合的注意力机制以及
集
束搜索解码。 我们将在这里介绍前两种方法:
![](
img/52fe1877-dded-4161-8520-ba0d425f2452.png
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录