Embedding 编码方法

article/2025/4/27 21:40:14

一、作用

        Embedding 是一种单词编码,用低维向量实现了编码,这种编码通过神经网络训练优化,能表达单词之间的相关性。

        在是用独热码one_hot编码时,我们会发现单词的编码十分稀疏,以至于训练的效率不是很高。采用embedding的方法可以很好的优化这个个问题。

        举个栗子:

二、函数介绍

Embedding(词汇表大小,编码维度)

送入embedding层的数据的维度要求是 [送入样本数,循环核时间展开步数]

即需要将训练的数据reshape为以上形式!.

另外Embedding一般只作为第一层

三、实例介绍

        示例一:一个字母预测下一个字母

import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Dense, SimpleRNN, Embedding
import matplotlib.pyplot as plt
import osinput_word = "abcde"
w_to_id = {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4}  # 单词映射到数值id的词典x_train = [w_to_id['a'], w_to_id['b'], w_to_id['c'], w_to_id['d'], w_to_id['e']]
y_train = [w_to_id['b'], w_to_id['c'], w_to_id['d'], w_to_id['e'], w_to_id['a']]np.random.seed(7)
np.random.shuffle(x_train)
np.random.seed(7)
np.random.shuffle(y_train)
tf.random.set_seed(7)# 使x_train符合Embedding输入要求:[送入样本数, 循环核时间展开步数] ,
# 此处整个数据集送入所以送入,送入样本数为len(x_train);输入1个字母出结果,循环核时间展开步数为1。
x_train = np.reshape(x_train, (len(x_train), 1))
y_train = np.array(y_train)model = tf.keras.Sequential([Embedding(5, 2),SimpleRNN(3),Dense(5, activation='softmax')
])model.compile(optimizer=tf.keras.optimizers.Adam(0.01),loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),metrics=['sparse_categorical_accuracy'])checkpoint_save_path = "./checkpoint/run_embedding_1pre1.ckpt"if os.path.exists(checkpoint_save_path + '.index'):print('-------------load the model-----------------')model.load_weights(checkpoint_save_path)cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,save_weights_only=True,save_best_only=True,monitor='loss')  # 由于fit没有给出测试集,不计算测试集准确率,根据loss,保存最优模型history = model.fit(x_train, y_train, batch_size=32, epochs=100, callbacks=[cp_callback])model.summary()# print(model.trainable_variables)
file = open('./weights.txt', 'w')  # 参数提取
for v in model.trainable_variables:file.write(str(v.name) + '\n')file.write(str(v.shape) + '\n')file.write(str(v.numpy()) + '\n')
file.close()###############################################    show   ################################################ 显示训练集和验证集的acc和loss曲线
acc = history.history['sparse_categorical_accuracy']
loss = history.history['loss']plt.subplot(1, 2, 1)
plt.plot(acc, label='Training Accuracy')
plt.title('Training Accuracy')
plt.legend()plt.subplot(1, 2, 2)
plt.plot(loss, label='Training Loss')
plt.title('Training Loss')
plt.legend()
plt.show()############### predict #############preNum = int(input("input the number of test alphabet:"))
for i in range(preNum):alphabet1 = input("input test alphabet:")alphabet = [w_to_id[alphabet1]]# 使alphabet符合Embedding输入要求:[送入样本数, 循环核时间展开步数]。# 此处验证效果送入了1个样本,送入样本数为1;输入1个字母出结果,循环核时间展开步数为1。alphabet = np.reshape(alphabet, (1, 1))result = model.predict(alphabet)pred = tf.argmax(result, axis=1)pred = int(pred)tf.print(alphabet1 + '->' + input_word[pred])

执行结果:

 示例二:四个字母预测下一个字母

代码:

import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Dense, SimpleRNN, Embedding
import matplotlib.pyplot as plt
import osinput_word = "abcdefghijklmnopqrstuvwxyz"
w_to_id = {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4,'f': 5, 'g': 6, 'h': 7, 'i': 8, 'j': 9,'k': 10, 'l': 11, 'm': 12, 'n': 13, 'o': 14,'p': 15, 'q': 16, 'r': 17, 's': 18, 't': 19,'u': 20, 'v': 21, 'w': 22, 'x': 23, 'y': 24, 'z': 25}  # 单词映射到数值id的词典training_set_scaled = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11, 12, 13, 14, 15, 16, 17, 18, 19, 20,21, 22, 23, 24, 25]x_train = []
y_train = []for i in range(4, 26):x_train.append(training_set_scaled[i - 4:i])y_train.append(training_set_scaled[i])np.random.seed(7)
np.random.shuffle(x_train)
np.random.seed(7)
np.random.shuffle(y_train)
tf.random.set_seed(7)# 使x_train符合Embedding输入要求:[送入样本数, 循环核时间展开步数] ,
# 此处整个数据集送入所以送入,送入样本数为len(x_train);输入4个字母出结果,循环核时间展开步数为4。
x_train = np.reshape(x_train, (len(x_train), 4))
y_train = np.array(y_train)model = tf.keras.Sequential([Embedding(26, 2),SimpleRNN(10),Dense(26, activation='softmax')
])model.compile(optimizer=tf.keras.optimizers.Adam(0.01),loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),metrics=['sparse_categorical_accuracy'])checkpoint_save_path = "./checkpoint/rnn_embedding_4pre1.ckpt"if os.path.exists(checkpoint_save_path + '.index'):print('-------------load the model-----------------')model.load_weights(checkpoint_save_path)cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,save_weights_only=True,save_best_only=True,monitor='loss')  # 由于fit没有给出测试集,不计算测试集准确率,根据loss,保存最优模型history = model.fit(x_train, y_train, batch_size=32, epochs=100, callbacks=[cp_callback])model.summary()file = open('./weights.txt', 'w')  # 参数提取
for v in model.trainable_variables:file.write(str(v.name) + '\n')file.write(str(v.shape) + '\n')file.write(str(v.numpy()) + '\n')
file.close()###############################################    show   ################################################ 显示训练集和验证集的acc和loss曲线
acc = history.history['sparse_categorical_accuracy']
loss = history.history['loss']plt.subplot(1, 2, 1)
plt.plot(acc, label='Training Accuracy')
plt.title('Training Accuracy')
plt.legend()plt.subplot(1, 2, 2)
plt.plot(loss, label='Training Loss')
plt.title('Training Loss')
plt.legend()
plt.show()################# predict ##################preNum = int(input("input the number of test alphabet:"))
for i in range(preNum):alphabet1 = input("input test alphabet:")alphabet = [w_to_id[a] for a in alphabet1]# 使alphabet符合Embedding输入要求:[送入样本数, 时间展开步数]。# 此处验证效果送入了1个样本,送入样本数为1;输入4个字母出结果,循环核时间展开步数为4。alphabet = np.reshape(alphabet, (1, 4))result = model.predict([alphabet])pred = tf.argmax(result, axis=1)pred = int(pred)tf.print(alphabet1 + '->' + input_word[pred])

注意这里的输入数据的维度发生了改变

执行结果: 

链接:

https://www.icourse163.org/learn/PKU-1002536002?tid=1452937471#/learn/content?type=detail&id=1233970430&cid=1253438622&replay=true


http://chatgpt.dhexx.cn/article/4eqZVX18.shtml

相关文章

nn.Embedding使用

nn.Embedding是一种词嵌入的方式,跟one-hot相似但又不同,会生成低维稠密向量,但是初始是随机化的,需要根据模型训练时进行调节,若使用预训练词向量模型会比较好。 1. one-hot one-hot是给定每个单词一个索引&#xf…

深度学习中Embedding的解释

转载于https://zhuanlan.zhihu.com/p/164502624 什么是Embedding? 近年来,NLP自然语言处理、推荐系统,以及计算机视觉已成为目前工业界算法岗的主流方向,无论在哪个领域,对“Embedding”这个词概念的理解都是每个庞大知…

Embedding理解+代码

目录 Embedding主要思想 Word2vec主要思想两种模型:目的: 算法一、定义超参数二、将语料库转换one-hot编码表示三、模型训练 代码手动实现 skip-gram模型一、数据准备二、定义超参数三、定义word2vec模型数据清洗及生成词汇表训练模型 四、 获取词向量和…

Embedding 基础

一、什么是Embedding 简单来说,Embedding 就是用一个数值向量“表示”一个对象(Object)的方法,这里说的对象可以是一个词、一个物品,也可以是一部电影等等。一个物品能被向量表示,是因为这个向量跟其他物品…

终于有人把Embedding讲明白了

导读:如果要总结深度学习大获成功的原因,那至少有两样东西必须入选:一样当然是很“深”的神经网络模型,这也是深度学习的“深度”的由来,另一样就是Embedding。 在深度学习中,Embedding是个很重要的概念&am…

计算机网络(二) | 网络编程基础、Socket套接字、UDP和TCP套接字编程

目录 一、网络编程基础1.1 为什么需要网络编程1.2 什么是网络编程1.3 网络编程中的基本概念 二、Socket套接字2.1 概念2.2 分类2.3 Java数据报套接字通信模型2.4 Java流套接字通信模型2.5 UDP数据包套接字编程2.6 TCP流套接字编程 一、网络编程基础 1.1 为什么需要网络编程 丰…

C#编程并实现网络UDP套接字

文章目录 一、UDP介绍二、C#命令行/控制台hello world程序(一)创建项目(二)客户端程序(三)服务端程序(四)使用wireshark抓包 三、C#Form窗口程序(一)创建项目…

Linux C语言高级

一、软件包管理及shell命令 1.流行的两种软件包管理机制 1.Deb软件包:由Debian Linux首先提出的软件包管理机制 2.RPM软件包:由Redhat Linux推出的软件包管理机制 2.Debian Linux开发了APT软件包管理器 1.检查和修复软件包依赖关系 2.利用Internet网络帮…

精心收集了60个C语言项目源码,分享给大家

C语言文章更新目录 C/C学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C语言基础-第一个C程序 C语言基础-简单程序分析 VS2019编写简单…

python基于c语言开发_C高级编程:基于模块化设计思想的C语言开发 PDF 超清版

给大家带来的一篇关于C语言相关的电子书资源,介绍了关于C高级编程、模块化、设计思想、C语言开发方面的内容,本书是由机械工业出版社出版,格式为PDF,资源大小80 MB,吉星编写,目前豆瓣、亚马逊、当当、京东等…

【Linux】网络基础+UDP网络套接字编程

只做自己喜欢做的事情,不被社会和时代裹挟着前进,是一件很奢侈的事。 文章目录 一、 网络基础1.局域网和广域网2.协议初识和网络协议分层(TCP/IP四层模型)3.MAC地址和IP地址(子网掩码,路由表,I…

C#使用TCP/UDP协议通信并用Wireshark抓包分析数据

目录 一、Wireshark抓包软件下载安装二、控制台程序使用 UDP 通信1)创建新项目2)编写代码3)编译结果4)抓包分析数据 三、Form窗口程序使用 TCP 通信1)创建新项目2)设计图形界面3)编写代码4&…

SimpleFOC之ESP32(九)—— WIFI、UDP和TCP

目录 说明一、网络通信1.1、准备工作1.2、UDP通信1.3、TCP通信 二、硬件准备三、代码参考四、代码演示4.1、WIFI_AP模式UDP通信4.2、WIFI_STA模式TCP client通信 五、UDP通信控制电机5.1、硬件准备5.2、代码演示5.2.1、串口通信更改为UDP通信5.2.2、笔记本连接AP5.2.3、UDP发送…

如何进行网络编程(代码利用UDP socket实现)

目录 一、什么是网络编程? 二、那么在Java中能调用C语言的函数吗? 三、操作系统提供的socket API主要有两类(实际上不止两类) 1.流套接字(底层使用TCP协议) TCP协议的特点: 2.数据报套接字…

北斗系统学习—JT808协议用C语言解析

前言: 本人从事于Linux应用开发(音视频应用方向),现在主要是负者AI摄像头的开发,在学音视频的途中,虽然是个小白,但是更愿意把自己所学音视频的一些知识分享给大家,以后每周都会更新哦! 本期介绍…

TCP/IP协议(一、自己动手实现udp)

对TCP/IP协议都只是听过,没有仔细研究过,一些知识体系也比较零散,什么三次握手,四次挥手,滑动窗口,零拷贝技术等等,都是知识有这么个东西,而不知道具体是啥,这几天还是根…

【Linux】传输层协议:UDP和TCP

但人不能永远浪漫下去,那会走向自我毁灭的。浪漫都是水字旁,会把人淹死的。人最终还是要进入一个规则体系,所谓,随心所欲不逾矩嘛 文章目录 一、UDP协议1.端口号2.理解UDP报头3.UDP的特点(面向数据报,全双…

Linux网络:UDP协议 | TCP协议

文章目录 前言端口号netstat -- pidof UDP协议TCP协议三次握手 四次挥手确认应答(ACK)机制超时重传机制连接管理机制理解TIME_WAIT状态理解 CLOSE_WAIT 状态 滑动窗口流量控制拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结 基于TCP 和 UDP 的应用层协议TCP/UD…

C语言SOCKET编程指南

转载自:http://blog.sina.com.cn/s/blog_79b01f66010163q3.html 这篇文章完全可以作为c语言socket编程指南,无论在任何系统下。感谢作者fenglovel! C语言SOCKET编程指南 1、介绍 Socket 编程让你沮丧吗?从man pages中很难得到有…

【socket】从计算机网络基础到socket编程——Windows Linux C语言 + Python实现(TCP+UDP)

一、部分基础知识1.1 计算机网络的体系结构1.11 互联网简介1.12 计算机网络的分类1.13 协议与网络的分层体系结构▶ 协议▶ 网络的分层体系结构 1.14 OSI 七层模型(重要)▶ OSI 模型的结构▶ OSI 模型各层的功能 1.15 TCP/IP 的体系结构(重要…