【自然语言处理八-transformer实现翻译任务-一(输入)】

自然语言处理八-transformer实现翻译任务-一(输入)

  • transformer架构
  • 数据处理部分
    • 模型的输入数据(图中inputs outputs outputs_probilities对应的label)
      • 以处理英中翻译数据集为例的代码
    • positional encoding 位置嵌入
      • 代码

鉴于transfomer的重要性,在两篇介绍过transfomer模型理论的基础上,我们将分几篇文章,用pytorch代码实现一个完整的transfomer模型。
下面是之前介绍模型的文章:
自然语言处理六-最重要的模型-transformer-上
自然语言处理六-最重要的模型-transformer-下

transformer架构

在这里重新给出transfomer架构图以及用中文翻译后的对照图:
在这里插入图片描述

从架构图可以看出实现transformer架构,encoder和decoder大部分相同。因此也规划几篇内容,介绍以下几大块:

  1. 输入输出部分
    处理数据,源和目标以及输出,以及位置编码

  2. 注意力部分
    多头注意力和掩蔽多头注意力

  3. 前馈网络等
    加和归一化,以及逐位前馈网路

  4. 训练和测试

本篇作为开始,先介绍处理数据部分

数据处理部分

模型的输入数据(图中inputs outputs outputs_probilities对应的label)

这部分用来处理transformer模型需要输入的数据,这部分其实和seq2seq架构是相同的,以自然语言的翻译为例:
比如transformer需要将 ich mochte ein bier 翻译成 i want a beer,那如需要输入的数据格式是这样的(假设句子最大长度5):
[ich mochte ein bier , i want a beer, i want a beer ]

那么上面那部分输入的用途都是什么呢?
encoder输入需要翻译的句子 ich mochte ein bier
decoder输入是 i want a beer
decoder的label是i want a beer
分别对应于图中inputs outputs outputs_probilities相对应的标签

其中是填充字符,用来填充到一个我们超参数中我们设定的sequence的长度
代表句子的开始, 代表句子结束
当然模型真正要处理还是需要根据词汇表转成数字格式的形式,才能被模型处理

以处理英中翻译数据集为例的代码

# -*- coding: utf-8 -*-

"""
加载源数据,并处理成data set和data loader
"""
import os
import zipfile
import torch
import torch.utils.data as Data
from src.configs import config
from src.utility.utils import Utils
from src.vocabulay.vocabulary import Vocabulary


class DataSetLoader:
    """
    数据封装成dateset和datelaoder
    """
    def __init__(self, is_train=True, numbers=config.num_examples):
        """
        init parameters
        """
        self.raw_file_path = config.raw_file_path
        self.raw_zip_path = config.raw_zip_path
        self.batch_size = config.batch_size
        self.num_steps = config.num_steps
        self.num_examples = numbers
        self.is_train = is_train

    def load_array(self, data_arrays):
        """
        构造一个数据迭代器
        :param data_arrays:  输入数据的列表
        :param is_train:     训练/测试数据集
        :return:             dataloader
        """
        dataset = Data.TensorDataset(*data_arrays)
        return Data.DataLoader(dataset, self.batch_size, shuffle=self.is_train)

    def load_data_nmt(self):
        """
        返回翻译数据集的迭代器和词表
        :return: 迭代器和词表
        """
        source, src_vocab, target, tgt_vocab = build_vocabu()
        src_array, src_valid_len = self.build_array_nmt(source, src_vocab)
        tgt_array, tgt_valid_len = self.build_array_nmt(target, tgt_vocab)
        data_arrays = (src_array, src_valid_len, tgt_array, tgt_valid_len)
        data_iter = self.load_array(data_arrays)
        return data_iter, src_vocab, tgt_vocab

    def build_array_nmt(self, lines, vocab):
        """将机器翻译的文本序列转换成小批量
        source[['hello', 'world'],..]  target[['你'], [好]]
        source[[]]
        """
        lines = [vocab[l] for l in lines]
        lines = [l + [vocab['<eos>']] for l in lines]
        array = torch.tensor([Utils.truncate_pad(
            l, self.num_steps, vocab['<pad>']) for l in lines])
        valid_len = Utils.reduce_sum(
            Utils.astype(array != vocab['<pad>'], torch.int32), 1)
        return array, valid_len


def extract_content():
    """
    提取raw text中内容
    :return: raw text
    """
    if not os.path.exists(config.raw_file_path):
        with zipfile.ZipFile(config.raw_zip_path, 'r') as zip_ref:
            zip_ref.extractall(os.path.dirname(config.raw_file_path))

    print('语料解压缩完成')
    with open(config.raw_file_path, 'r', encoding='UTF-8') as f:
        content = f.read()
    return content


def build_vocabu():
    """
    创建词表
    :return: 词表
    """
    text = Utils.preprocess_nmt(extract_content())
    source, target = Utils.tokenize_nmt(text, config.num_examples)
    src_vocab = Vocabulary(source, min_freq=2)
    tgt_vocab = Vocabulary(target, min_freq=2)
    return source, src_vocab, target, tgt_vocab

positional encoding 位置嵌入

为了添加位置信息,transformer的位置嵌入,每个位置的512维的数据用sin/cos做了处理
在这里插入图片描述
其中pos是在句子中位置,i是维度信息

代码

def get_sinusoid_encoding_table(n_position, d_model):
    def cal_angle(position, hid_idx):
        return position / np.power(10000, 2 * (hid_idx // 2) / d_model)
    def get_posi_angle_vec(position):
        return [cal_angle(position, hid_j) for hid_j in range(d_model)]

其他处理会在后续章节继续实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/528764.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java——网络编程

什么是计算机网络 把分布在不同地理区域的计算机设备&#xff0c;通过通信设备和线路(网线&#xff0c;光纤&#xff0c;交换机)连接&#xff0c;最终实现数据的传输和资源的共享。 实现不同计算机之间的联系&#xff0c;必须有介质连接 最早的网络&#xff1a;美国五角大楼一…

Go语言不能常量取址!?

题如下图 在软件开发中&#xff0c;常量是一种重要的编程元素&#xff0c;它们在程序中起到固定值的作用被大量使用 Go语言中的常量取址 在 Go 语言中&#xff0c;常量是无法被取址的。这意味着我们不能使用取址操作符 & 来获取常量的地址。例如&#xff1a; const a …

WinRAR功能之【锁定压缩文件】

今天来分享一下WinRAR解压缩软件的“锁定压缩文件”功能&#xff0c;这个功能可以保护压缩包里文件的完整性&#xff0c;也就是不能随意增加、删除以及修改压缩包里的文件。我们可以用两种方式来设置&#xff0c;一起来看看吧&#xff01; 方式1&#xff1a;在压缩文件的时候&a…

Gretel引领革命:发布全球最大开源Text-to-SQL数据集,开启AI培训新篇章|TodayAI

在合成数据行业中处于领先地位的Gretel公司&#xff0c;近日宣布了一项重大突破&#xff0c;推出了世界上最大的开源Text-to-SQL数据集&#xff0c;这一举措将加速AI模型的培训过程&#xff0c;并为全球各行各业的企业解锁新的可能性。 这个数据集包含了超过100,000个精心制作…

msvcp140.dll文件丢失能有什么办法可以解决,提供几种解决办法

哦豁&#xff01;当您打开计算机或想要启动某个应用程序时&#xff0c;意外地弹出一个令人不安的错误提示&#xff1a;“msvcp140.dll文件不见啦&#xff01;”这意味着您的操作系统找不到名为“msvcp140.dll”的重要文件&#xff0c;可能导致一些应用程序无法正常运行。但是别…

集合类多线程(JUC)

一、集合框架概述 集合&#xff1a; 是广义上的集合&#xff0c;简单理解就是容器。注意&#xff1a;集合只能存放对象类型的数据。 集合框架&#xff1a; 指的是 java.util 包中定义的各种容器类、相关的工具类、接口的统称。不同的容器存储不同结 构的数据。使用时要进行导包…

智慧园区水电能源监控管理系统

随着智慧城市的快速发展&#xff0c;智慧园区作为城市智能化的重要组成部分&#xff0c;其能源监控管理系统显得尤为关键。智慧园区水电能源监控管理系统&#xff0c;是利用先进的信息技术和自动控制技术&#xff0c;对园区内的水电能源使用进行实时监控、管理和优化的综合性智…

React 开发者必备技能之Redux基础入门实例

首先,我们需要安装 Redux 及其相关依赖: npm install redux react-reduxredux 是 Redux 库的核心部分,提供了创建 Store、Reducer、Action 等功能。react-redux 是 React 和 Redux 的集成库,用于在 React 组件中使用 Redux。 安装完成后,我们开始创建 Redux 应用程序: 创建 …

HarmonyOS 应用开发-应用异常处理案例

介绍 本示例介绍了通过应用事件打点hiAppEvent获取上一次应用异常信息的方法&#xff0c;主要分为应用崩溃、应用卡死以及系统查杀三种。 效果图预览 使用说明&#xff1a; 点击构建应用崩溃事件&#xff0c;3s之后应用退出&#xff0c;然后打开应用进入应用异常页面&#x…

分享|创业老阳推荐的Temu蓝海项目到底怎么样?

在当今竞争激烈的创业市场中&#xff0c;寻找一个具有潜力的蓝海项目成为了众多创业者的梦想。近日&#xff0c;创业老阳推荐的Temu蓝海项目引起了广泛关注。那么&#xff0c;这个项目到底怎么样呢?让我们一起来探讨一下。 首先&#xff0c;Temu蓝海项目在定位上具有显著优势 …

【数组】【最长距离】使循环数组所有元素相等的最少秒数

本文涉及知识点 数组 最长距离 LeetCode2808. 使循环数组所有元素相等的最少秒数 给你一个下标从 0 开始长度为 n 的数组 nums 。 每一秒&#xff0c;你可以对数组执行以下操作&#xff1a; 对于范围在 [0, n - 1] 内的每一个下标 i &#xff0c;将 nums[i] 替换成 nums[i] …

吴恩达深度学习 (week1,2)

文章目录 1、神经网络监督学习2、深度学习兴起原因3、深度学习二元分类4、深度学习Logistic 回归5、Logistic 回归损失函数6、深度学习梯度下降法7、深度学习向量法8、Python 中的广播9、上述学习总结10、大作业实现:rocket::rocket:&#xff08;1&#xff09;训练初始数据&…

初识Python(注释、编码规范、关键字...)

&#x1f947;作者简介&#xff1a;CSDN内容合伙人、新星计划第三季Python赛道Top1 &#x1f525;本文已收录于Python系列专栏&#xff1a; 零基础学Python &#x1f4ac;订阅专栏后可私信博主进入Python学习交流群&#xff0c;进群可领取Python视频教程以及Python相关电子书合…

2024年软考考纲改版后考试难度如何?

请注意&#xff1a;2024年软考只有两个资格的考纲发生了变化&#xff0c;分别是系统集成项目管理工程师&#xff08;中项&#xff09;和信息系统监理师&#xff0c;而且变化将在2024年下半年开始执行。其它资格的考纲保持不变&#xff01; 准备参加软考或者已经在备考的考生们…

什么时候考虑使用全局状态管理?vue获取全局状态变量一共有三种方法,你真的理解吗?

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、场景二、设置state中的变量三、直接访问state中的变量四、通过getters访问变量五、通过actions访问变量六、总结总结 前言 本文给大家做个参考&#xff0c;什么时候会考虑使用全局状态管理&#xff1f;以及帮助大家理…

vue+springboot实现JWT登录验证

目录 前言概念实际演示路由信息初始访问登录界面登录验证验证过期 vue实现依赖引入main.js获取和设置token工具类登录方法实体登录方法axios请求 router配置 springboot实现依赖引入JWT工具类忽视jwt验证注解拦截器逻辑跨域&调用拦截器配置登录接口&验证token接口 结语…

初识SpringMVC

一、什么是MVC MVC是一种软件架构模式&#xff08;是一种软件架构设计思想&#xff0c;不止Java开发中用到&#xff0c;其它语言也需要用到&#xff09;&#xff0c;它将应用分为三块&#xff1a; M&#xff1a;Model&#xff08;模型&#xff09;V&#xff1a;View&#xff08…

自定义类型:结构体,位端

结构体内存对齐 结构体的对齐规则&#xff1a; 1. 第一个成员在与结构体变量偏移量为0的地址处。 2. 其他成员变量要对齐到某个数字&#xff08;对齐数&#xff09;的整数倍的地址处。 对齐数 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的值为8 Linux中没有默…

【Shell】各种条件语句的使用——test语句、if语句、case语句

Shell条件语句的使用 条件语句 Shell条件语句的使用条件测试的语法字符串测试表达式整数二元比较操作符逻辑操作符 if的条件语句的语法if的嵌套case语句语法 条件测试的语法 语法1&#xff1a;test <测试表达式> 利用test命令进行条件测试表达式的方法。test命令与<测…

外包干了25天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入杭州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…