当前位置: 首页 > news >正文

《深度学习》神经语言模型 Word2vec CBOW项目解析、npy/npz文件解析

目录

一、关于word2vec

1、什么是word2vec

2、常用训练算法

1)CBOW

2)SkipGram

二、关于npy、npz文件

1、npy文件

1)定义

2)特性

3)用途

4)保存及读取

运行结果:

运行结果:

2、npz文件

1)定义

2)用途

3)保存及读取

运行结果:

运行结果:

三、CBOW案例解析

1、获取训练集数据

调试结果:

2、生成one-hot

运行结果:

3、创建CBOW类

4、cuda、优化器

5、开始训练

运行结果:

6、测试

运行结果:

7、获取词向量矩阵

运行结果:

8、生成词嵌入字典

9、保存为npz文件

运行结果:


一、关于word2vec

1、什么是word2vec

        Word2Vec是一种用于将单词表示为连续向量的技术。它是一种浅层、双层的神经网络模型,用于训练单词的分布式表示。

        Word2Vec模型将单词映射到一个低维向量空间中,使得具有相似含义的单词在向量空间中距离较近。这种表示方法有助于在自然语言处理任务中更好地捕捉和理解单词之间的语义关系。

2、常用训练算法

        1)CBOW

                  以上下文词汇预测当前词,前后两个单词预测当前词,这里的两个单词是自定义个数的

    

        2)SkipGram

                以当前词预测上下文词汇,即当前词预测前后两个单词,这里的两个单词也是自定义个数的

二、关于npy、npz文件

1、npy文件

        1)定义

                npy文件是NumPy库中用于保存数组数据的二进制文件格式。

        2)特性

                二进制存储:npy文件以二进制形式存储数据,比文本文件(如CSV)更加高效地保存大型数组数据。二进制格式允许直接映射到内存,从而加快了读写速度

                数据完整性:npy文件不仅保存数组的数据,还包含了数组的形状(维度)、数据类型以及其他必要的元数据信息。这确保了数据的完整性,使得在加载数据时可以完全重现保存时的数组,而无需任何额外的转换或解析。

                跨平台性:npy文件的格式是跨平台的,可以在不同的操作系统硬件环境中进行加载和使用。

        3)用途

                npy文件的设计目的是为了在数据分析科学计算领域中,提供一种高效的存储读取NumPy数组数据的方式。

        4)保存及读取
"""保存为npy文件"""
a = np.random.randint(5,size=(2,4))
np.save('test.npy',a)
                运行结果:

"""读取npy文件"""
b = np.load('test.npy')
print(b)
                运行结果:

2、npz文件

        1)定义

                npz文件是NumPy用于存储数值数据的压缩格式。它实际上是一个压缩存档文件,可以包含一个或多个NumPy数组。

        2)用途

                npz文件通常用于存储和传输大量的数值数据,特别是在科学计算和数据分析领域。

        3)保存及读取
"""保存为npz文件"""
a = np.random.randint(0,10,(3,),dtype='int')
b = np.random.randint(0,10,(3,),dtype='int')
c = np.random.randint(0,10,(3,),dtype='int')
np.savez('test.npz',file1=a,file2=b,file3=c)  # 压缩储存数组,并给数组 分别命名
                运行结果:

"""读取npz文件"""
data = np.load('test.npz')
print(data.files)  # 读取其内文件名
aa = data[data.files[0]]  # 读取文件内容
bb = data[data.files[1]]
cc = data[data.files[2]]
print('read:',aa,bb,cc)  # 打印文件内容
                运行结果:

三、CBOW案例解析

1、获取训练集数据

import torch
import torch.nn as nn  # 神经网络
import torch.nn.functional as F
import torch.optim as optim
from tqdm import tqdm,trange  # 显示进度条函数
import numpy as npCONTEX_SIZE = 2   # 设置词左边和右边选择的个数(即上下文词汇个数)
raw_text = """
We are about to study the idea of a computational process.
Computational processes are abstract beings that inhabit computers. 
As they evolve, processes manipulate other abstract things called data.
The evolution of a process is directed by a pattern of rules
called a program. People create programs to direct processes. 
In effect we conjure the spirits of the computer with our spells.
""".split()   # 语料库# 中文的语句,你可以选择分词,也可以选择分字
vocab = set(raw_text)   # 利用集合的唯一性,建立词库,集合内元素不重复
vocab_size = len(vocab)   # 打印词库长度# enumerate返回一个可迭代对象的元素内容及其索引
word_to_idx = {word:i for i,word in enumerate(vocab)}  # for循环的复合写法,第1次循环,i得到的索引号,word 第1个单词
idx_to_word = {i:word for i,word in enumerate(vocab)}data = []  # 用于存放分割出来的元组,元组内有两个元素,一个数前后对应的四个单词,另一个是中间的词
for i in range(CONTEX_SIZE,len(raw_text)-CONTEX_SIZE):  # 遍历值为上述设置的左右两边词长度2到文章总次数-2,i从2开始context = ([raw_text[i-(2-j)] for j in range(CONTEX_SIZE)]  # 获取前两个单词+ [raw_text[i+j+1] for j in range(CONTEX_SIZE)]  # 获取后两个单词)   # 获取上下文词,第一组为(['we''are''to''study'])target = raw_text[i]   # 获取目标词,第一个词为aboutdata.append((context,target))   # 将上下文词和目标词保存到data中,第一组格式为((['we','are''to''study']),'about')
        调试结果:

2、生成one-hot

def make_context_vector(context,word_to_idx):   # 将上下文词转换为one-hotidxs = [word_to_idx[w] for w in context]  # 遍历四个词,返回四个词对应的索引,将索引存入列表return torch.tensor(idxs,dtype=torch.long)  # 返回创建的一个torch张量,内容为词在词库中对应的索引# 上述函数的示例
print(make_context_vector(data[0][0],word_to_idx))   # 将前后两组单词以及上述定义的字典传入自定义函数,返回其在词库中的索引
        运行结果:

3、创建CBOW类

class CBOW(nn.Module):  # 定义一个CBOW的类,其继承nn.Module,nn.Module是PyTorch中所有神经网络模块的基类,提供了模型构建所需的基本功能。def __init__(self,vocab_size,embedding_dim):  # 初始化super(CBOW,self).__init__()self.embeddings = nn.Embedding(vocab_size,embedding_dim)  # vocab_size表示需要训练的词的个数,embedding_dim表示每个单词嵌入的维度大小self.proj = nn.Linear(embedding_dim,128)  # 额外增强的全连接层self.output = nn.Linear(128,vocab_size)def forward(self,inputs):  # 前向传播,传入数据的索引embeds = sum(self.embeddings(inputs)).view(1,-1)  # 将索引传入上述的Embedding词嵌入层进行处理,然后对结果求和,最后调整形状为1,embedding_dim,-1表示根据张量的大小自动计算该位置上的维度out = F.relu(self.proj(embeds))  # 将词嵌入的结果进行线性变换,然后再进行relu激活函数处理,即小于0的变为0,大于0的不变out = self.output(out)  # 输出层nll_prob = F.log_softmax(out,dim=-1)  # 使用softmax激活函数将原始输出值转换为概率分布的对数形式,dim=-1 指定了对最后一个维度进行计算,return nll_prob

4、cuda、优化器

# m模型在cuda训练
device = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"
print(device)
model = CBOW(vocab_size,10).to(device)  # 将词库长度和每个单词嵌入的维度大小传入模型,然后放入GPU进行运算optimizer = optim.Adam(model.parameters(),lr=0.001)  # 创建一个Adam优化器,对模型的参数进行优化
# model.parameters()返回模型中所有可训练参数的迭代器,lr表示学习率

5、开始训练

losses = []   # 存储损失的集合
loss_function = nn.NLLLoss()  # NLLLoss损失函数(当分类列表非常多的情况),将多个类别分别分成0、1两个类别。
for epoch in tqdm(range(200)):   # 开始训练,tqdm表示展示一个进度条,200表示循环展示200次total_loss = 0  # 用于储存当前epoch的总损失,每轮将总损失增加到列表for context,target in data:  # 遍历元组中的左右四个词,以及中间的一个词context_vecter = make_context_vector(context,word_to_idx).to(device)  # 通过遍历将所有的四个词以及词组对应的字典传入函数,返回对应的索引,然后传入GPUtarget = torch.tensor([word_to_idx[target]]).to(device)  # 返回中间的词对应的索引,然后转换为torch张量传入GPUtrain_predict = model(context_vecter)   # 将每一组数据的四个索引传入模型进行前向传播,model.forward可以不写forward# print(train_predict)  # 打印返回的每一个数对应的概率值对数形式loss = loss_function(train_predict,target)  # 将上述模型返回的预测结果与真实值传入负对数似然损失函数进行计算得到损失值optimizer.zero_grad()   # 梯度清零loss.backward()    # 反向传播计算得到每个参数梯度值optimizer.step()   # 根据梯度更新网络参数total_loss += loss.item()  # 叠加损失值losses.append(total_loss)
print(losses)
        运行结果:

6、测试

# 测试
context = ['People','create','to','direct']
context_vector = make_context_vector(context,word_to_idx).to(device)# 预测的值
model.eval()  # 进入测试模式
predict = model(context_vector)
max_idx = predict.argmax(1).item()  # dim=1表示每一行中的最大值对应的索引号,dim=0表示每一列中最大值对应的索引号
print(f"{','.join(context)}中间的单词为:",idx_to_word[max_idx])
        运行结果:

7、获取词向量矩阵

W = model.embeddings.weight.cpu().detach().numpy()   # 获取词嵌入层的权重,因为模型在GPU训练,先将其传入CPU,detach()表示分理处张量,然后将其转变为numpy数组类型
print(W)  # 打印模型的词嵌入矩阵
        运行结果:

8、生成词嵌入字典

word_2_vec = {}
for word in word_to_idx.keys():# 词向量矩阵中某个词的索引对应的那一列即为该词的词向量word_2_vec[word] = W[word_to_idx[word],:]
print('结束')

9、保存为npz文件

np.savez('word2vec实现.npz',file_1=W)
data = np.load('word2vec实现.npz')
print(data.files)
        运行结果:

相关文章:

《深度学习》神经语言模型 Word2vec CBOW项目解析、npy/npz文件解析

目录 一、关于word2vec 1、什么是word2vec 2、常用训练算法 1)CBOW 2)SkipGram 二、关于npy、npz文件 1、npy文件 1)定义 2)特性 3)用途 4)保存及读取 运行结果: 运行结果&#xf…...

黄粱一梦,镜花水月总是空

总有人间一两风,埋我十万八千梦 自古以来,梦在我们的生活中一直是一个神秘玄幻而又发人深省的存在,我们一生中有三分之一的时间都在睡觉,做过的梦也是丰富多彩数不胜数。 而从科学的角度来说,梦是我们潜意识里的生活…...

【分布式事务-01】分布式事务之2pc两阶段提交

redis系列整体栏目 内容链接地址【一】分布式事务之2pc两阶段提交https://zhenghuisheng.blog.csdn.net/article/details/142406325 分布式事务之2pc两阶段提交 一,分布式事务之2pc两阶段提交1,两阶段提交(2pc)2,2pc两阶段提交实现思路3&…...

docker 安装 rabbitMQ

第一步:准备工作 # 打开docker目录 [rootMuYu ~]# cd /usr/local/docker/ # 创建rabbitmq文件夹 [rootMuYu docker]# mkdir rabbitmq # 打开rabbitmq文件夹 [rootMuYu docker]# cd rabbitmq/ # 创建挂载目录 [rootMuYu rabbitmq]# mkdir data 第二步&#xff…...

知识改变命运 数据结构【java对象的比较】

0:前言 在基本数据类型中,我们可以直接使用号比较是否相等,还记的学堆哪里时候,插入一个数据,就会与其他数据进行比较,当时我们传入的是Integer类型,在Integer类里面已经实现了compare。 如果…...

01_23 种设计模式之《简单工厂模式》

文章目录 一、什么是设计模式二、设计模式类型简单工厂模式及应用场景定义抽象产品类和具体产品类实现工厂类客户端代码注意事项 一、什么是设计模式 设计模式:在软件研发过程中,经过实战验证,用于解决在特定环境下、重复出现的,…...

Android 12.0 关于定制自适应AdaptiveIconDrawable类型的动态日历图标的功能实现系列一

1.前言 在12.0的系统rom定制化开发中,在关于定制动态日历图标中,原系统是不支持动态日历图标的功能,所以就需要从新 定制动态时钟图标关于自适应AdaptiveIconDrawable类型的样式,就是可以支持当改变系统图标样式变化时,动态日历 图标的背景图形也跟着改变,所以接下来就来…...

【源码+文档+调试讲解】基于安卓的小餐桌管理系统springboot框架

摘 要 相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低运营人员成本,实现了小餐桌的标准化、制度化、程序化的管理,有效地防止了小餐桌的随意管理,提高了信息的处理速度和精确度,能够及时、准确地查询和修…...

C语言中的文件操作(二)

C语言中的文件操作&#xff08;一&#xff09;-CSDN博客https://blog.csdn.net/Xiaodao12345djs/article/details/142746010?spm1001.2014.3001.5501 四、文件的顺序读写 1、fputc (字符输出函数/写) 将一个字符写入文件中 #include <stdio.h>int main() {FILE* pf fo…...

【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则

文章目录 C 继承详解&#xff1a;初阶理解与实战应用前言第一章&#xff1a;继承的基本概念与定义1.1 继承的概念1.2 继承的定义 第二章&#xff1a;继承中的访问权限2.1 基类成员在派生类中的访问权限2.2 基类与派生类对象的赋值转换2.2.1 派生类对象赋值给基类对象2.2.2 基类…...

Ubuntu 22.04 安装 KVM

首先检查是否支持 CPU 虚拟化&#xff0c;现在的 CPU 都应该支持&#xff0c;运行下面的命令&#xff0c;大于0 就是支持。 egrep -c (vmx|svm) /proc/cpuinfo安装 Libvirt apt install -y qemu-kvm virt-manager libvirt-daemon-system virtinst libvirt-clients bridge-uti…...

101 公司战略的基本概念

公司战略的概念 传统概念&#xff08;战略是终点途径&#xff09;&#xff1a;计划性、全局性、长期性现代概念&#xff08;战略是途径&#xff09;&#xff1a;应变性、竞争性、风险性综合概念&#xff08;前二者的折中&#xff09;&#xff1a;预先性、反应性公司的使命与目标…...

【devops】devops-ansible之剧本初出茅庐--搭建rsync和nfs

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8》从问题中去学习k8s 《docker学习》暂未更…...

@RestController 和 @Controller 注解的联系及要点

1. RestController • RestController 是 Spring 4.0 引入的一个注解&#xff0c;它相当于 Controller ResponseBody组合注解。 主要作用&#xff1a;主要用于构建 RESTful Web 服务。标注 RestController 的类里的所有方法&#xff0c;返回的都是 JSON 或 XML 等格式的数据…...

机器学习篇-day03-线性回归-正规方程与梯度下降-模型评估-正则化解决模型拟合问题

一. 线性回归简介 定义 线性回归(Linear regression)是利用 回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关系进行建模的一种分析方式。 回归方程(函数) 一元线性回归: y kx b > wx b k: 斜率, 在机器学习中叫 权重(weight), 简称: w b: 截距, 在机…...

图像人脸与视频人脸匹配度检测

import cv2 import dlib import numpy as np import os from pathlib import Path# 加载预训练模型 face_recognition_model "dlib_face_recognition_resnet_model_v1.dat" face_recognition_net dlib.face_recognition_model_v1(face_recognition_model)detector …...

【AI绘画】Midjourney进阶:对称构图详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;什么是构图为什么Midjourney要使用构图 &#x1f4af;对称构图特点使用场景提示词书写技巧测试 &#x1f4af;小结 &#x1f4af;前言 通常来学习AI绘画的人可以分为…...

道路积水检测数据集 1450张 路面积水 带分割 voc yolo

道路积水检测数据集 1450张 路面积水 带分割 voc yolo 分类名: (图片张数&#xff0c; 标注个数) puddle:(1468,1994) 总数:(1468&#xff0c;1994) 总类(nc): 1类 道路积水检测数据集介绍 项目名称 道路积水检测数据集 项目概述 本数据集包含1450张带有标注的图像&#x…...

上门安装维修系统小程序开发详解及源码示例

随着智能家居和设备的普及&#xff0c;消费者对上门安装和维修服务的需求日益增加。为了满足这一市场需求&#xff0c;开发一款上门安装维修系统小程序成为了一种有效的解决方案。本文将详细介绍上门安装维修系统小程序的开发过程&#xff0c;并提供一个简单的源码示例&#xf…...

03_23 种设计模式之《原型模式》

文章目录 一、原型模式基础知识原型模式的结构应用场景 实例拷贝构造函数被调用场景如下&#xff1a;典型的应用场景&#xff1a; 一、原型模式基础知识 原型模式是一种创建型设计模式&#xff0c;其功能为复制一个运行时的对象&#xff0c;包括对象各个成员当前的值。而代码又…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...