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

将独热码应用到神经网络中

引言

接上回,本文继续说如何用TensorFlow将独热编码应用到一个简单的神经网络中,以实现从一段随机文本到另一段随机文本的转换。

步骤一:导入库
import tensorflow as tf
import numpy as np
import random
import string
步骤二:生成随机文本数据

用一个函数来生成随机文本数据。

def generate_random_text(length):letters = string.ascii_lowercase + ' 'return ''.join(random.choice(letters) for i in range(length))random_text = generate_random_text(100)
print("Random Text:", random_text)
步骤三:独热编码

接下来,我们将对生成的随机文本进行独热编码。为此,我们需要创建一个字符到整数的映射,并使用这个映射来构建独热编码。


注:上一张我们说的是几个分类(数字代表类别)转为独热码,那么如何将一串文本转为独热码呢?在这里我们的方法是将一串文本的每个字符都对应到一个数字(这个过程就我们叫做映射到数字,这个对应关系的表就成为词汇表),之后从数字生成独热码。把所有数字的独热码放一起,就是这段文本的独热码了。


chars = string.ascii_lowercase + ' '
char_to_int = {c: i for i, c in enumerate(chars)}
int_to_char = {i: c for c, i in char_to_int.items()}def one_hot_encode(text):encoded = [char_to_int[char] for char in text]return tf.one_hot(encoded, depth=len(chars))encoded_text = one_hot_encode(random_text)
步骤四:构建神经网络模型

现在,让我们定义一个简单的密集神经网络模型(后期讲),它将接受独热编码的文本并尝试预测下一个字符的独热编码。

model = tf.keras.Sequential([tf.keras.layers.Flatten(input_shape=(None, len(chars))),tf.keras.layers.Dense(128, activation='relu'),tf.keras.layers.Dense(len(chars), activation='softmax')
])
步骤五:训练模型

因为作者个人感觉用随机数据训练没什么意义,也拟合不出什么,所以省略了…

步骤六:模型预测与解码

我们直接用没训练过的模型来预测输入文本的输出,并将其从独热编码转换回字符。

def decode_one_hot(output):return ''.join(int_to_char[np.argmax(out)] for out in output)# 假设我们已经训练了模型
# predictions = model.predict(encoded_text)
# decoded_text = decode_one_hot(predictions)
# print("Decoded Text:", decoded_text)

一些话

虽然我们学了很多关于独热码的知识,但是…对于我们的语言模型没有什么卵用…我们用的是字符索引加嵌入层方法(后面细讲)而不是独热码,具体原因:

独热码(One-Hot Encoding)

优势:

  1. 简单直观:每个字符都由一个独立的二进制位表示,这使得编码非常明确和直接。
  2. 易于理解:模型的输入维度与词汇表大小直接相关,容易理解和解释。
  3. 无参数共享:每个字符的表示独立,不会受到其他字符的影响,这在某些情况下可能是有益的。

缺点:

  1. 维度灾难:如果词汇表很大,独热编码会导致极其高维的特征空间,这会增加计算复杂性和存储需求。
  2. 缺乏语义信息:独热编码不包含任何关于字符之间关系的语义信息,即字符之间的相似性或关联性完全被忽略。
  3. 不变性:对于字符的微小变化(如大小写、拼写错误等),独热编码无法提供鲁棒性。

字符索引 + 嵌入层(Character Index + Embedding Layer)

优势:

  1. 维度降低:通过使用较低维度的密集向量来表示字符,嵌入层可以有效减少模型的输入维度。
  2. 捕获语义信息:嵌入层可以学习字符之间的语义关系,使得相似的字符在嵌入空间中拥有相似的表示。
  3. 参数共享:嵌入层中的参数是在所有字符之间共享的,这可以减少模型的总参数数量,提高泛化能力。
  4. 鲁棒性:嵌入层可以对字符的小变化具有一定的鲁棒性,例如拼写错误或大小写变化。

缺点:

  1. 需要大量数据:为了有效地学习嵌入,通常需要大量的训练数据。
  2. 调参复杂:嵌入层的维度和其他超参数需要仔细调整,以找到最佳配置。
  3. 黑盒性质:嵌入层学到的表示可能不如独热编码那样直观易懂。

有问题可以私信,看到会回复。

http://www.lryc.cn/news/401158.html

相关文章:

  • 在CSS中,使用Flexbox布局时,可以通过几个属性来控制容器内的项目之间的间距
  • 关于HDFS 和HBase
  • 【HarmonyOS】HarmonyOS NEXT学习日记:二、ArkTs语法
  • Web前端-Web开发CSS基础2-选择器
  • Mongodb数组字段索引之多键索引
  • [Spring] Spring Web MVC案例实战
  • 大模型“重构”教育:解构学习奥秘,推动教育普惠
  • HCNA VRP基础
  • 单片机外围设备-EEPROM
  • YOLO--置信度(超详细解读)
  • “解锁物流新纪元:深入探索‘沂路畅通‘分布式协作平台“
  • 昇思25天学习打卡营第六天|应用实践/计算机视觉/Vision Transformer图像分类
  • vxe-table合并行数据
  • LabVIEW异步和同步通信详细分析及比较
  • 【多模态学习笔记二】MINIGPT-4论文阅读
  • Docker基本讲解及演示
  • 各类专业技术的pdf电子书
  • 【Linux】多线程_9
  • LabVIEW设备检修信息管理系统
  • python爬虫基础:使用lxml库进行HTML解析和数据提取的实践指南
  • 大语言模型系列:Transformer
  • 宠物健康新守护:智能听诊器引领科技突破
  • KITTI 3D 数据可视化
  • 旅游数据可视化:免费工具让复杂数据变得简单易懂
  • 数据结构进阶:使用链表实现栈和队列详解与示例(C, C#, C++)
  • 【线程系列之五】线程池介绍C语言
  • 【学习css3】使用flex和grid实现等高元素布局
  • 如何防止Eclipse格式化程序在行注释开头插入空格
  • Nextjs 调用组件内的方法
  • ip地址是电脑还是网线决定的