Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
大唐爆破僧
apachecn-dl-zh
提交
012c1aa4
A
apachecn-dl-zh
项目概览
大唐爆破僧
/
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,发现更多精彩内容 >>
提交
012c1aa4
编写于
1月 18, 2021
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2021-01-18 15:28:09
上级
5912c44d
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
10 addition
and
10 deletion
+10
-10
new/handson-nlp-pt-1x/7.md
new/handson-nlp-pt-1x/7.md
+10
-10
未找到文件。
new/handson-nlp-pt-1x/7.md
浏览文件 @
012c1aa4
...
...
@@ -65,7 +65,7 @@
图 7.6 –检查编码器
我们使用最终的隐藏状态
`h
`
n 作为上下文向量,然后使用训练有素的解码器对其进行解码。 也值得观察,在我们的序列到序列模型的上下文中,我们分别在输入句子的开头和结尾添加了“开始”和“结束”标记。 这是因为我们的输入和输出没有有限的长度,并且我们的模型需要能够学习句子何时结束。 我们的输入语句将始终以“ end”令牌结尾,该令牌向编码器发出信号,表明此时的隐藏状态将用作此输入语句的最终上下文向量表示形式。 类似地,在解码器步骤中,我们将看到我们的解码器将继续生成单词,直到它预测到“结束”
令牌为止。 这使我们的解码器可以生成实际的输出语句,而不是无限长的令牌序列。
我们使用最终的隐藏状态
`h
[n]`
作为上下文向量,然后使用训练有素的解码器对其进行解码。 也值得观察,在我们的序列到序列模型的上下文中,我们分别在输入句子的开头和结尾添加了
`start`
和
`end`
标记。 这是因为我们的输入和输出没有有限的长度,并且我们的模型需要能够学习句子何时结束。 我们的输入语句将始终以
`end`
令牌结尾,该令牌向编码器发出信号,表明此时的隐藏状态将用作此输入语句的最终上下文向量表示形式。 类似地,在解码器步骤中,我们将看到我们的解码器将继续生成单词,直到它预测到
`end`
令牌为止。 这使我们的解码器可以生成实际的输出语句,而不是无限长的令牌序列。
接下来,我们将研究解码器如何获取此上下文向量,并学习将其转换为输出语句。
...
...
@@ -77,7 +77,7 @@
图 7.7 –检查解码器
首先,我们的模型将上下文向量作为编码器步骤
`h0`
的最终隐藏状态。 然后,我们的模型旨在根据给定的当前隐藏状态预测句子中的下一个单词,然后预测句子中的前一个单词。 我们知道我们的句子必须以“开始”标记开头,因此,在第一步中,我们的模型会尝试根据给定的先前隐藏状态
`h0`
来预测句子中的第一个单词, 句子(在这种情况下,是“开始”标记)。 我们的模型进行预测(
`"pienso"`
),然后更新隐藏状态以反映模型的新状态
`h1`
。 然后,在下一步中,我们的模型将使用新的隐藏状态和最后的预测单词来预测句子中的下一个单词。 这一直持续到模型预测出
“ end”
令牌为止,这时我们的模型停止生成输出字。
首先,我们的模型将上下文向量作为编码器步骤
`h0`
的最终隐藏状态。 然后,我们的模型旨在根据给定的当前隐藏状态预测句子中的下一个单词,然后预测句子中的前一个单词。 我们知道我们的句子必须以“开始”标记开头,因此,在第一步中,我们的模型会尝试根据给定的先前隐藏状态
`h0`
来预测句子中的第一个单词, 句子(在这种情况下,是“开始”标记)。 我们的模型进行预测(
`"pienso"`
),然后更新隐藏状态以反映模型的新状态
`h1`
。 然后,在下一步中,我们的模型将使用新的隐藏状态和最后的预测单词来预测句子中的下一个单词。 这一直持续到模型预测出
`end`
令牌为止,这时我们的模型停止生成输出字。
该模型背后的直觉与到目前为止我们所学的关于语言表示的知识一致。 给定句子中的单词取决于其前面的单词。 因此,要预测句子中的任何给定单词而不考虑之前已被预测的单词,这将是没有意义的,因为任何给定句子中的单词都不是彼此独立的。
...
...
@@ -165,7 +165,7 @@
4.
定义了我们的字段后,我们的分词就变成了简单的单行本。包含 30000 个句子的数据集内置了训练、验证和测试集,我们可以将其用于我们的模型。
```py
train_data, valid_data, test_data = Multi30k.splits(exts = (
‘.en’, ‘.de’
), fields = (SOURCE, TARGET))
train_data, valid_data, test_data = Multi30k.splits(exts = (
'.en', '.de'
), fields = (SOURCE, TARGET))
```
5.
我们可以使用数据集对象的
`examples`
属性检查单个句子。在这里,我们可以看到源(
`src`
)属性包含了我们的英语反向输入句,而我们的目标(
`trg`
)包含了我们的德语非反向输出句。
...
...
@@ -184,9 +184,9 @@
6.
现在,我们可以检查我们每个数据集的大小。在这里,我们可以看到,我们的训练数据集由 29,000 个例子组成,而我们的每个验证和测试集分别由 1,014 个和 1,000 个例子组成。在过去,我们对训练和验证数据使用了 80%/20% 的分割。然而,在这样的情况下,当我们的输入和输出字段非常稀疏,而我们的训练集规模有限时,在可用的数据上进行训练往往是有益的。
```py
print(
“Training dataset size: “
+ str(len(train_data. examples)))
print(
“Validation dataset size: “
+ str(len(valid_data. examples)))
print(
“Test dataset size: “
+ str(len(test_data. examples)))
print(
"Training dataset size: "
+ str(len(train_data. examples)))
print(
"Validation dataset size: "
+ str(len(valid_data. examples)))
print(
"Test dataset size: "
+ str(len(test_data. examples)))
```
这将返回以下输出:
...
...
@@ -213,7 +213,7 @@
8.
最后,我们可以从我们的数据集创建我们的数据迭代器。就像我们之前所做的那样,我们指定使用支持 CUDA 的 GPU(如果我们的系统中可用的话),并指定我们的批次大小。
```py
device = torch.device(
‘cuda’
if torch.cuda.is_available() else 'cpu')
device = torch.device(
'cuda'
if torch.cuda.is_available() else 'cpu')
batch_size = 32
train_iterator, valid_iterator, test_iterator = BucketIterator.splits(
(train_data, valid_data, test_data),
...
...
@@ -306,7 +306,7 @@ def forward(self, input, h, cell):
return
pred
,
h
,
cell
```
同样,类似于我们的编码器,我们在解码器中使用了两层 LSTM 层。 我们从编码器获取最终的隐藏状态,并使用它们生成序列
Y1 中的第一个单词。 然后,我们更新隐藏状态,并使用它和 Y1 生成我们的下一个单词 Y2
,重复此过程,直到我们的模型生成结束标记。 我们的解码器看起来像这样:
同样,类似于我们的编码器,我们在解码器中使用了两层 LSTM 层。 我们从编码器获取最终的隐藏状态,并使用它们生成序列
`Y1`
中的第一个单词。 然后,我们更新隐藏状态,并使用它和
`Y1`
生成我们的下一个单词
`Y2`
,重复此过程,直到我们的模型生成结束标记。 我们的解码器看起来像这样:
![
Figure 7.16 – LSTM model with a decoder
](
img/B12365_07_16.jpg
)
...
...
@@ -443,7 +443,7 @@ def forward(self, input, h, cell):
output = model(src, trg)
```
5.
接下来,我们需要通过比较我们的预测输出和真实的、正确的翻译句子来计算我们模型预测的损失。我们使用
shape 和 view 函数重塑我们的输出数据和目标数据,以便创建两个可以比较的 tensors
来计算损失。我们计算我们的输出和
`trg`
向量之间的
`loss`
标准,然后通过网络反推这个损失。
5.
接下来,我们需要通过比较我们的预测输出和真实的、正确的翻译句子来计算我们模型预测的损失。我们使用
`shape`
和
`view`
函数重塑我们的输出数据和目标数据,以便创建两个可以比较的张量
来计算损失。我们计算我们的输出和
`trg`
向量之间的
`loss`
标准,然后通过网络反推这个损失。
```py
output_dims = output.shape[-1]
...
...
@@ -511,7 +511,7 @@ def forward(self, input, h, cell):
```
py
if valid_loss < lowest_validation_loss:
lowest_validation_loss = valid_loss
torch.save(model.state_dict(),
‘seq2seq.pt’
)
torch.save(model.state_dict(),
'seq2seq.pt'
)
```
3. 最后,我们只需打印我们的输出。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录