最新深圳设计师建网站,风景旅游网页设计,网站做锚点,wordpress打开媒体链接设置零基础吃透#xff1a;RaggedTensor在Keras和tf.Example中的实战用法
这份内容会拆解 RaggedTensor 两大核心实战场景——Keras 深度学习模型输入、tf.Example 可变长度特征解析#xff0c;全程用通俗语言逐行代码解释#xff0c;帮你理解“为什么用RaggedTensor”“怎么用…零基础吃透RaggedTensor在Keras和tf.Example中的实战用法这份内容会拆解 RaggedTensor 两大核心实战场景——Keras 深度学习模型输入、tf.Example 可变长度特征解析全程用通俗语言逐行代码解释帮你理解“为什么用RaggedTensor”“怎么用”“核心API原理”。一、场景1Keras中使用RaggedTensor训练LSTM判断句子是否是问题核心目标用长度不同的句子比如“What makes you think she is a witch?”有8个词“A newt?”只有2个词训练LSTM模型判断每个句子是否是疑问句。✅ 关键优势用RaggedTensor直接输入可变长度句子无需补0避免冗余计算模型原生支持处理。完整代码逐行拆解带原理importtensorflowastf# 步骤1定义任务数据 # 输入4个长度不同的句子可变长度文本sentencestf.constant([What makes you think she is a witch?,# 8个词She turned me into a newt.,# 6个词A newt?,# 2个词Well, I got better.])# 5个词# 标签每个句子是否是疑问句True是False否is_questiontf.constant([True,False,True,False])# 步骤2预处理字符串→RaggedTensor # 超参数哈希桶数量把单词转成0~999的整数hash_buckets1000# 步骤2.1按空格切分句子→得到RaggedTensor每个句子的单词列表长度可变wordstf.strings.split(sentences, )# 步骤2.2单词→哈希编号解决字符串无法输入模型的问题→ 仍为RaggedTensorhashed_wordstf.strings.to_hash_bucket_fast(words,hash_buckets)# 查看预处理结果验证是RaggedTensorprint(预处理后的单词编号RaggedTensor)print(hashed_words)关键解释tf.strings.split(sentences, )把每个句子按空格切分成单词列表返回RaggedTensor比如A newt?→[bA, bnewt?]tf.strings.to_hash_bucket_fast把字符串单词转成0~999的整数保留RaggedTensor结构长度不变。# 步骤3构建Keras模型核心支持RaggedTensor keras_modeltf.keras.Sequential([# 输入层关键设置raggedTrue接收RaggedTensor输入tf.keras.layers.Input(shape[None],dtypetf.int64,raggedTrue),# 嵌入层把单词编号→16维向量原生支持RaggedTensortf.keras.layers.Embedding(hash_buckets,16),# LSTM层处理可变长度序列无需补0自动按实际长度计算tf.keras.layers.LSTM(32,use_biasFalse),# 全连接层激活函数提取特征tf.keras.layers.Dense(32),tf.keras.layers.Activation(tf.nn.relu),# 输出层预测是否是疑问句1维输出tf.keras.layers.Dense(1)])# 步骤4编译训练预测 # 编译模型二分类任务用binary_crossentropy损失优化器选rmspropkeras_model.compile(lossbinary_crossentropy,optimizerrmsprop)# 训练模型直接传入RaggedTensorhashed_words和标签无需转密集张量keras_model.fit(hashed_words,is_question,epochs5)# 预测输入RaggedTensor输出每个句子的预测值越接近1越可能是疑问句print(\n模型预测结果)print(keras_model.predict(hashed_words))核心API解析为什么能支持RaggedTensorAPI/参数作用原理Input(raggedTrue)声明输入是RaggedTensor允许输入维度为[None]可变长度Keras层会适配处理Embedding原生支持RaggedTensor输入按“实际单词数”生成嵌入向量不生成冗余的补0向量LSTM处理RaggedTensor时自动按每个句子的实际长度计算序列特征忽略补0这里根本没补运行结果解读Epoch 1/5 → loss:2.5281Epoch 5/5 → loss:1.6017损失下降模型在学习 预测结果[[0.0526], [0.0006], [0.0392], [0.0021]]预测值越接近1模型认为是疑问句的概率越高第一句疑问句预测值0.0526第三句疑问句0.0392比第二/四句高符合标签规律模型初步学到了特征。关键优势对比补0的密集张量无需补0不用把所有句子补到最长长度8个词节省内存和计算逻辑简洁预处理和模型输入全程保留原始句子长度避免填充值干扰模型学习原生兼容Keras核心层Embedding/LSTM/Dense都支持RaggedTensor无需额外转换。二、场景2tf.Example中解析可变长度特征为RaggedTensor核心背景tf.Example是TensorFlow官方的protobuf数据格式一种高效的序列化格式常用于存储训练数据尤其适合存储「可变长度特征」比如有的样本有2个颜色有的有1个有的样本长度特征为空。✅ 核心需求把tf.Example中存储的可变长度特征直接解析为RaggedTensor不用手动处理空值/补0。完整代码逐行拆解importtensorflowastf# 导入protobuf文本解析工具把文本格式的protobuf转成Example对象importgoogle.protobuf.text_formataspbtext# 步骤1定义函数构建tf.Example defbuild_tf_example(s):# 步骤把文本格式的protobuf字符串→tf.train.Example对象→序列化转成字节串returnpbtext.Merge(s,tf.train.Example()).SerializeToString()# 构建4个tf.Example样本每个样本的colors/lengths特征长度不同example_batch[# 样本1colors[red,blue]2个lengths[7]1个build_tf_example(r features { feature {key: colors value {bytes_list {value: [red, blue]} } } feature {key: lengths value {int64_list {value: [7]} } } }),# 样本2colors[orange]1个lengths[]空build_tf_example(r features { feature {key: colors value {bytes_list {value: [orange]} } } feature {key: lengths value {int64_list {value: []} } } }),# 样本3colors[black,yellow]2个lengths[1,3]2个build_tf_example(r features { feature {key: colors value {bytes_list {value: [black, yellow]} } } feature {key: lengths value {int64_list {value: [1, 3]} } } }),# 样本4colors[green]1个lengths[3,5,2]3个build_tf_example(r features { feature {key: colors value {bytes_list {value: [green]} } } feature {key: lengths value {int64_list {value: [3, 5, 2]} } } })]# 步骤2定义特征规范关键用RaggedFeature feature_specification{# 声明colors特征是字符串型RaggedTensorcolors:tf.io.RaggedFeature(tf.string),# 声明lengths特征是int64型RaggedTensorlengths:tf.io.RaggedFeature(tf.int64),}# 步骤3解析tf.Example→RaggedTensor # 解析序列化的example_batch按特征规范返回RaggedTensorfeature_tensorstf.io.parse_example(example_batch,feature_specification)# 打印解析结果print(\n解析后的可变长度特征RaggedTensor)forname,valueinfeature_tensors.items():print({}{}.format(name,value))核心API解析API作用原理tf.train.ExampleTensorFlow的protobuf数据格式支持存储可变长度的列表特征bytes_list/int64_listpbtext.Merge把文本格式的protobuf字符串转成tf.train.Example对象SerializeToString()把Example对象序列化成字节串方便存储/传输tf.io.RaggedFeature声明特征是可变长度的解析后返回RaggedTensor而非补0的密集张量tf.io.parse_example批量解析序列化的Example字节串按特征规范返回对应张量这里是RaggedTensor运行结果解读colorstf.RaggedTensor [[bred, bblue], [borange], [bblack, byellow], [bgreen]] lengthstf.RaggedTensor [[7], [], [1, 3], [3, 5, 2]]colors4个样本的颜色特征长度分别为2、1、2、1直接用RaggedTensor存储无空值lengths4个样本的长度特征长度分别为1、0、2、3空样本第二个直接存为空列表无需补0。关键优势对比普通解析如果不用tf.io.RaggedFeature解析可变长度特征会返回补0的密集张量比如lengths会被解析成[[7,0,0], [0,0,0], [1,3,0], [3,5,2]]而RaggedTensor保留原始长度空特征就是空列表无需补0无冗余只存储有效元素节省内存后续兼容解析后的RaggedTensor可直接传入Keras模型/TF运算无需额外转换。三、核心总结RaggedTensor在Keras/tf.Example中的价值场景核心用法关键优势Keras模型Input层设置raggedTrue直接输入RaggedTensor处理可变长度序列文本无需补0模型学习更高效tf.Example解析用tf.io.RaggedFeature声明可变长度特征解析可变长度特征时保留原始结构无冗余补0通用关键结论RaggedTensor是TensorFlow处理「可变长度数据」的“一站式解决方案”从数据解析tf.Example→模型输入Keras→模型运算LSTM/Embedding全程兼容相比“补0密集张量”RaggedTensor既节省内存又避免填充值干扰模型学习是处理非均匀长度数据的最优选择核心API记忆KerasInput(raggedTrue)tf.Exampletf.io.RaggedFeature。