Keras(十五)tf_record基础API使用

本文详细介绍如何使用TensorFlow创建和读取TFRecord文件,包括构造不同类型列表、序列化与反序列化Example对象、处理TFRecord文件及其压缩版本。

本文将介绍:

  • 构建一个tf.train.Example对象
  • 将tf.train.Example对象存入文件中,生成的tf_record文件.
  • 使用tf.data的API读取tf_record文件,并实现反序列化
  • 将tf.train.Example对象存入压缩文件中,生成的tf_record压缩文件.
  • 使用tf.data的API读取tf_record压缩文件.

一,构建一个ByteList,FloatList,Int64List的对象

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import sklearn
import pandas as pd
import os
import sys
import time
import tensorflow as tf
from tensorflow import keras

# 打印使用的python库的版本信息
print(tf.__version__)
print(sys.version_info)
for module in mpl, np, pd, sklearn, tf, keras:
    print(module.__name__, module.__version__)
    
# tfrecord 是一种文件格式
# -> tf.train.Example可以是一个样本或者一组
#    每个Example-> tf.train.Features -> {"key": tf.train.Feature}
#       每个Feature有不同的格式-> tf.train.Feature -> tf.train.ByteList/FloatList/Int64List

# 1,构建一个ByteList,FloatList,Int64List的对象
# tf.train.ByteList
favorite_books = [name.encode('utf-8') for name in ["machine learning", "cc150"]]
favorite_books_bytelist = tf.train.BytesList(value = favorite_books)
print(favorite_books_bytelist,type(favorite_books_bytelist))

# tf.train.FloatList
hours_floatlist = tf.train.FloatList(value = [15.5, 9.5, 7.0, 8.0])
print(hours_floatlist,type(hours_floatlist))

# tf.train.Int64List
age_int64list = tf.train.Int64List(value = [42])
print(age_int64list,type(age_int64list))

二,构建一个tf.train.Features对象

# tf.train.Features
features = tf.train.Features(
    feature = {
        "favorite_books": tf.train.Feature(bytes_list = favorite_books_bytelist),
        "hours": tf.train.Feature(float_list = hours_floatlist),
        "age": tf.train.Feature(int64_list = age_int64list),
    }
) 
print(features)

三,构建一个tf.train.Example对象

# tf.train.Example(使用features构建Example)
example = tf.train.Example(features=features)
print(example)

# 将tf.train.Example对象序列化.
serialized_example = example.SerializeToString()
print(serialized_example)

四,将tf.train.Example对象存入文件中,生成的tf_record文件

output_dir = 'tfrecord_basic'
if not os.path.exists(output_dir):
    os.mkdir(output_dir)
filename = "test.tfrecords"
filename_fullpath = os.path.join(output_dir, filename)
# 将序列化后的tf.train.Example对象存入文件中.
with tf.io.TFRecordWriter(filename_fullpath) as writer:
    for i in range(3):# 写入三次
        writer.write(serialized_example)

五,使用tf.data的API读取tf_record文件

dataset = tf.data.TFRecordDataset([filename_fullpath])
for serialized_example_tensor in dataset:
    print(serialized_example_tensor)

六,将tf.train.Example对象反序列化

# 定义每个feature的数据类型
expected_features = {
    "favorite_books": tf.io.VarLenFeature(dtype = tf.string), # VarLenFeature代表变长的数据类型
    "hours": tf.io.VarLenFeature(dtype = tf.float32), 
    "age": tf.io.FixedLenFeature([], dtype = tf.int64), # FixedLenFeature代表定长的数据类型
}
# 解析TFRecord数据集
dataset = tf.data.TFRecordDataset([filename_fullpath])
for serialized_example_tensor in dataset:
    example = tf.io.parse_single_example(
        serialized_example_tensor,
        expected_features)
    # print(example)
    books = tf.sparse.to_dense(example["favorite_books"],default_value=b"")
    for book in books:
        print(book.numpy().decode("UTF-8"))

七,将tf.train.Example对象存入压缩文件中,生成的tf_record压缩文件

filename_fullpath_zip = filename_fullpath + '.zip'
options = tf.io.TFRecordOptions(compression_type = "GZIP")
with tf.io.TFRecordWriter(filename_fullpath_zip, options) as writer:
    for i in range(3):
        writer.write(serialized_example)

八,使用tf.data的API读取tf_record压缩文件

dataset_zip = tf.data.TFRecordDataset([filename_fullpath_zip],compression_type= "GZIP")
for serialized_example_tensor in dataset_zip:
    example = tf.io.parse_single_example(
        serialized_example_tensor,
        expected_features)
    books = tf.sparse.to_dense(example["favorite_books"],default_value=b"")
    for book in books:
        print(book.numpy().decode("UTF-8"))
<think>好的,我需要帮助用户了解如何使用TensorFlow.NET Keras将CSV数据转换为张量。用户已经提供了之前的回答和几个引用,我需要结合这些信息来生成示例代码和解释。 首先,回顾用户的问题,他们想了解在TensorFlow.NET Keras中如何读取CSV数据并转换为张量。之前的回答中提到了使用Microsoft.Data.Analysis的DataFrame.LoadCsv方法,但用户现在转向了TensorFlow.NET,所以需要调整方法。 根据提供的引用,特别是引用[1]和[2],TensorFlowPython版)使用tf.data来处理CSV数据,比如使用tf.data.experimental.make_csv_dataset。但用户询问的是TensorFlow.NET,即C#版本的TensorFlow,所以需要确认TensorFlow.NET是否支持类似的功能。 查阅TensorFlow.NET的文档,发现它确实提供了对Keras API的支持,并且数据处理部分可能类似于Python版的tf.data。不过,TensorFlow.NET的API可能与Python版有所不同,需要注意方法名和参数的变化。 接下来,需要构建一个示例代码,展示如何读取CSV文件并转换为张量。可能步骤包括:加载CSV数据,解析为数据集,进行预处理(如归一化),然后转换为张量供模型使用。 引用[4]提到了数据归一化的方法,所以在示例中可以包含归一化步骤。同时,引用[3]展示了如何处理压缩的CSV文件,可能可以提及但非必要。 需要注意的是,TensorFlow.NET可能没有完全实现所有Python版的功能,比如tf.data.experimental.make_csv_dataset,因此可能需要使用其他方法,如使用C#的文件读取结合TensorFlow.NET的API来构造数据集。 可能的解决方案步骤: 1. 使用C#的StreamReader读取CSV文件。 2. 解析每一行,分割成特征和标签。 3. 将数据转换为数值类型(如float)。 4. 使用TensorFlow.NET的API将数据转换为张量。 5. 数据预处理(如归一化)使用类似引用[4]的方法。 此外,用户可能需要了解如何将数据集分为训练集和测试集,以及如何集成到Keras模型中。 需要验证TensorFlow.NET中是否有类似于tf.keras.utils.get_file的函数,如果没有,可能需要手动下载文件或使用C#的网络请求库。 最后,确保代码示例正确,并解释每个步骤的作用,帮助用户理解流程。同时,生成相关问题,覆盖可能遇到的后续疑问,比如处理缺失值、大数据集处理或与其他数据管道的对比。</think>以下是使用TensorFlow.NET Keras将CSV数据转换为张量的详细实现方法,结合数据加载、预处理和模型集成的最佳实践: --- ### 核心实现步骤 #### 1. 环境准备 ```bash # 安装TensorFlow.NET核心包 dotnet add package TensorFlow.NET # 安装Keras扩展 dotnet add package TensorFlow.Keras ``` #### 2. 基础CSV加载与张量转换 ```csharp using Tensorflow; using Tensorflow.Keras.Utils; using static Tensorflow.Binding; // 加载CSV文件路径(示例数据) string csvPath = "titanic/train.csv"; var dataset = tf.data.TextLineDataset(csvPath).Skip(1); // 跳过表头 // 定义解析函数 Tensor parse_csv(string line) { var defaults = new[] { tf.constant(0.0f), tf.constant(""), tf.constant(0.0f) }; // 示例数据类型 var parsed = tf.io.decode_csv(line, record_defaults: defaults, field_delim: ","); return new { Features = parsed[0], Label = parsed[2] }; // 根据实际列调整索引 } // 创建数据集管道 var dataset = tf.data.TextLineDataset(csvPath) .Skip(1) .Map(parse_csv) .Batch(32) .Prefetch(1); // 转换为可迭代张量 foreach (var batch in dataset) { var features = batch.Features; var labels = batch.Labels; // 在此处插入模型训练代码 } ``` #### 3. 数据预处理(含归一化) ```csharp // 参考引用[4]的归一化逻辑 var (mean, std) = CalculateMeanStd(dataset); // 需实现统计计算 Tensor Normalize(Tensor data) => (data - mean) / std; // 在数据管道中添加预处理 dataset = dataset.Map(x => new { Features = Normalize(x.Features), x.Labels }); ``` --- ### 完整工作流程示例 ```csharp // 创建完整数据处理管道 var dataset = tf.data.TextLineDataset(new[] { "data.csv" }) .Skip(1) .Shuffle(1000) .Map(line => { var splits = tf.strings.split(line, ","); var features = tf.strings.to_number(splits[1..-1], TF_DataType.TF_FLOAT); var label = tf.strings.to_number(splits[-1], TF_DataType.TF_INT32); return (features, label); }) .Batch(64) .Cache() .Repeat(); // 构建Keras模型 var model = keras.Sequential(new[] { keras.layers.InputLayer(input_shape: 8), // 假设8个特征 keras.layers.Dense(128, activation: "relu"), keras.layers.Dense(1, activation: "sigmoid") }); // 编译并训练 model.compile(optimizer: "adam", loss: keras.losses.BinaryCrossentropy(), metrics: new[] { "accuracy" }); model.fit(dataset, epochs: 10); ``` --- ### 与PythonTensorFlow的对比 | 功能 | TensorFlow.NET实现 | Python实现参考[^1] | |------------------------|--------------------------------------------|--------------------------------| | CSV数据加载 | `tf.data.TextLineDataset` + 手动解析 | `tf.data.experimental.make_csv_dataset` | | 数据归一化 | 手动实现统计计算[^4] | `tf.keras.layers.Normalization`层 | | 压缩文件支持 | 需手动解压后加载 | `compression_type`参数直接支持[^3] | --- ### 高级技巧 #### 1. 处理大型CSV文件 ```csharp // 使用分片读取(每个分片处理1GB数据) var shardedFiles = new[] { "large_data.csv" }; var dataset = tf.data.Dataset.from_tensor_slices(shardedFiles) .Interleave(file => tf.data.TextLineDataset(file).Skip(1), cycle_length: 4, // 并行读取文件数 block_length: 16); ``` #### 2. 混合多种数据源 ```csharp // 组合CSV数据和图像数据管道 var csvDataset = LoadCSVData(); var imgDataset = LoadImageData(); var combinedDataset = tf.data.Dataset.zip((csvDataset, imgDataset)) .Map((csv, img) => { var combinedFeatures = tf.concat(new[] { csv.Features, img.Features }, axis: 0); return (combinedFeatures, csv.Label); }); ``` --- ### 常见问题解决方案 1. **数值转换错误** ```csharp // 使用安全转换方法 Tensor SafeConvert(Tensor strTensor) => tf.where( tf.math.is_nan(strTensor), tf.constant(0.0f), strTensor); ``` 2. **处理缺失值** ```csharp .Map(line => { var splits = tf.strings.split(line, ","); // 用0填充缺失数值列 var features = tf.strings.to_number( tf.where(tf.equal(splits, ""), "0", splits)[1..-1], TF_DataType.TF_FLOAT); }) ``` 3. **性能优化** ```csharp // 启用并行处理 dataset = dataset.Map(map_func: ParseLine, num_parallel_calls: tf.data.AUTOTUNE) .Prefetch(buffer_size: tf.data.AUTOTUNE); ``` --- ### 相关问题 1. **如何处理CSV中的分类特征?** > 使用`tf.keras.layers.StringLookup`层: > ```csharp > var lookup = keras.layers.StringLookup(vocabulary: ["cat", "dog"]); > var encoded = lookup(raw_category_tensor); > ``` 2. **如何验证数据管道正确性?** > 抽样检查首个批次: > ```csharp > foreach (var (features, labels) in dataset.Take(1)) > { > Console.WriteLine($"特征形状:{features.shape} 标签示例:{labels[0]}"); > } > ``` 3. **如何与Entity Framework集成?** > 先通过EF加载数据到内存,再转换为张量: > ```csharp > var dbData = context.MyTable.Select(x => new { x.Feature1, x.Label }).ToList(); > var dataset = tf.data.Dataset.from_tensor_slices( > (tf.constant(dbData.Select(x => x.Feature1).ToArray()), > tf.constant(dbData.Select(x => x.Label).ToArray())) > ); > ``` 4. **如何处理时间序列CSV数据?** > 使用滑动窗口处理: > ```csharp > dataset = dataset.Window(size: 30, shift: 1, drop_remainder: true) > .FlatMap(window => window.Batch(30)); > ``` --- [^1]: 政安晨——TensorFlow CSV数据处理示例 [^2]: TensorFlow官方文档-数据管道 [^3]: TensorFlow压缩文件处理技术 [^4]: 数值归一化最佳实践
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值