8.2.1 项目介绍
实例8-1:Tensorflow使用注意力机制实现翻译系统(源码路径:daima\8\attention1.ipynb)
本实例的实现文件是nmt_with_attention.ipynb,在ipynb笔记本文件中训练模型后,如果输入一个西班牙语句子,例如:
¿todavia estan en casa?
则会返回对应英文翻译:
“are you still at home? ”
我们将训练生成的模型导出为tf.saved_model,因为这样可以在其他 TensorFlow 环境中使用。在完成翻译工作的同时,需要生成对应的注意力图,在途中这显示输入句子的哪些部分在翻译时引起了模型的注意。如图7-3所示。
图7-3 生成的注意力图
在编码之前先通过如下命令安装tensorflow_text:
pip install tensorflow_text
从头开始构建几个层,如果想在自定义层和内置层之间实现切换,请设置使用如下变量:
use_builtins = True
编写形状检查器类ShapeChecker,如果文件类型不符合要求则进行修复,具体实现代码如下所示。
class ShapeChecker():
def __init__(self):
# 对看到的每个轴名称进行缓存
self.shapes = {}
def __call__(self, tensor, names, broadcast=False):
if not tf.executing_eagerly():
return
if isinstance(names, str):
names = (names,)
shape = tf.shape(tensor)
rank = tf.rank(tensor)
if rank != len(names):
raise ValueError(f'Rank mismatch:\n'
f' found {rank}: {shape.numpy()}\n'
f' expected {len(names)}: {names}\n')
for i, name in enumerate(names):
if isinstance(name, int):
old_dim = name
else:
old_dim = self.shapes.get(name, None)
new_dim = shape[i]
if (broadcast and new_dim == 1):
continue
if old_dim is None:
# 如果轴名称为新名称,则需要将其长度添加到缓存中.
self.shapes[name] = new_dim
continue
if new_dim != old_dim:
raise ValueError(f"Shape mismatch for dimension: '{name}'\n"
f" found: {new_dim}\n"
f" expected: {old_dim}\n")
未完待续