新闻动态
你的位置:开云官网切尔西赞助商(2025已更新(最新/官方/入口) > 新闻动态 >
上一篇:《构建东谈主工智能模子基础:TFDS和Keras的完整搭配》体育游戏app平台
引子:在东谈主工智能模子的西席过程中,若何高效不停和处理大皆数据是一个病笃的课题。TensorFlow 的 TFRecord 样式为大限制数据存储和处理提供了一种活泼且高效的处罚决策。在本节学问中,咱们将先容若何足下 TFRecord 连结 TensorFlow 的 Dataset API 进行数据的索取、调节和加载(ETL),从而更好地维持东谈主工智能模子的西席和优化。通过 TFRecord,您不错将原始数据存储为一种轻量且易于处理的二进制样式,从而在大限制数据集的加载息争析上得回显赫的性能提高。咱们将详备探索若何构建 ETL 数据管谈,通过并行处理、批处理和预取等工夫,让数据加载与模子西席过程愈加流通、快速。这种数据处理方式不仅在单台机器上发扬出色,还能在多核 CPU、GPU 或 TPU 上膨胀,兑现更大限制的东谈主工智能模子西席。非论您是处理图像、文本,照旧其他类型的大限制数据,融归拢掌抓 TFRecord 偏执优化工夫将为构建高效的数据管谈奠定基础,使您约略更快速、智能地西席东谈主工智能模子。
融合 TFRecord
当您使用 TFDS 时,数据会被下载并缓存到磁盘,因此您无需每次使用时皆从头下载。TFDS 使用 TFRecord 样式进行缓存。若是您仔细不雅察下载过程,就会发现这少量——举例,图 4-1 展示了 cnn_dailymail 数据集若何被下载、打乱并写入 TFRecord 文献。
图 4-1. 将 cnn_dailymail 数据集下载
图 4-1. 将 cnn_dailymail 数据集下载为 TFRecord 文献
在 TensorFlow 中,TFRecord 是存储和检索大皆数据的首选样式。这是一种相当绵薄的文献结构,按功令读取以提高性能。在磁盘上,文献的结构相对径直,每札纪录由一个暗意纪录长度的整数、其对应的轮回冗余校验(CRC)、一个数据的字节数组及该字节数组的 CRC 构成。这些纪录被鸠合成一个文献,若是数据集很大,则会进行分片。
举例,图 4-2 说明了 cnn_dailymail 的
举例,图 4-2 说明了 cnn_dailymail 的西席集鄙人载后被分红了 16 个文献。
为了更直不雅地了解一个绵薄的示例,不错下载 MNIST 数据集并打印其信息:
data, info = tfds.load("mnist", with_info=True)
print(info)
在 info 中,您会看到其特征是这样存储的:
features=FeaturesDict({
'image': Image(shape=(28, 28, 1), dchk=1&type=tf.uint8),
'label': ClassLabel(shape=(), dchk=1&type=tf.int64, num_classes=10),
}),
与 CNN/DailyMail 的示例肖似,文献会被下载到 /root/tensorflow_datasets/mnist/<version>/files 目次。
您不错像这样将原始纪录作为 TFRecordDataset 加载:
filename="/root/tensorflow_datasets/mnist/3.0.0/mnist-test.tfrecord-00000-of-00001"
raw_dataset = tf.data.TFRecordDataset(filename)
for raw_record in raw_dataset.take(1):
print(repr(raw_record))
请细心,文献名的位置可能会证据您的操作系统而有所不同。
<tf.Tensor: shape=(), dchk=1&type=string, numpy=b"\n\x85\x03\n\xf2\x02\n\x05image\x12\xe8\x02\n\xe5\x02\n\xe2\x02\x89PNG\r \n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x1c\x00\x00\x00\x1c\x08\x00\x00\x00\x00Wf \x80H\x00\x00\x01)IDAT(\x91\xc5\xd2\xbdK\xc3P\x14\x05\xf0S(v\x13)\x04,.\x82\xc5A q\xac\xedb\x1d\xdc\n.\x12\x87n\x0e\x82\x93\x7f@Q\xb2\x08\xba\tbQ0.\xe2\xe2\xd4\x b1\xa2h\x9c\x82\xba\x8a(\nq\xf0\x83Fh\x95\n6\x88\xe7R\x87\x88\xf9\xa8Y\xf5\x0e\x 8f\xc7\xfd\xdd\x0b\x87\xc7\x03\xfe\xbeb\x9d\xadT\x927Q\xe3\xe9\x07:\xab\xbf\xf4\ xf3\xcf\xf6\x8a\xd9\x14\xd29\xea\xb0\x1eKH\xde\xab\xea%\xaba\x1b=\xa4P/\xf5\x02\ xd7\\\x07\x00\xc4=,L\xc0,>\x01@2\xf6\x12\xde\x9c\xde[t/\xb3\x0e\x87\xa2\xe2\ xc2\xe0A<\xca\xb26\xd5(\x1b\xa9\xd3\xe8\x0e\xf5\x86\x17\xceE\xdarV\xae\xb7_\xf3 I\xf7(\x06m\xaaE\xbb\xb6\xac\r*\x9b$e<\xb8\xd7\xa2\x0e\x00\xd0l\x92\xb2\xd5\x15\ xcc\xae'\x00\xf4m\x08O'+\xc2y\x9f\x8d\xc9\x15\x80\xfe\x99[q\x962@CN|i\xf7\xa9!=\ \xab\x19\x00\xc8\xd6\xb8\xeb\xa1\xf0\xd8l\xca\xfb]\xee\xfb]*\x9fV\xe1\x07\xb7\xc 9\x8b55\xe7M\xef\xb0\x04\xc0\xfd&\x89\x01<\xbe\xf9\x03*\x8a\xf5\x81\x7f\xaa/2y\x 87ks\xec\x1e\xc1\x00\x00\x00\x00IEND\xaeB`\x82\n\x0e\n\x05label\x12\x05\x1a\x03\ n\x01\x02">
它是一个包含纪录详备信息的长字符串,内部还包括校验和等现实。但是若是咱们也曾知谈特征,咱们就不错创建一个特征描摹,然后用它来分解数据。代码如下:
# 创建特征描摹
feature_description = {
'image': tf.io.FixedLenFeature([], dchk=1&type=tf.string),
'label': tf.io.FixedLenFeature([], dchk=1&type=tf.int64),
}
def _parse_function(example_proto):
# 使用上头的字典分解输入的 `tf.Example` proto
return tf.io.parse_single_example(example_proto, feature_description)
parsed_dataset = raw_dataset.map(_parse_function)
for parsed_record in parsed_dataset.take(1):
print((parsed_record))
这样输出的现实就友很多了!最初,您不错看到图像是一个 Tensor,况且它包含一个 PNG。PNG 是一种压缩图像样式,头部由 IHDR 界说,图像数据位于 IDAT 和 IEND 之间。若是仔细不雅察字节流,您不错看到它们。同期也有标签,它以整数形势存储,包含值 2:
{
'image': <tf.Tensor: shape=(), dchk=1&type=string,
numpy=b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x1c\x00\x00\x00\x1c\x08\x00\x00\x00\x00Wf\x80H\x00\x00\x01)IDAT(\x91\xc5\xd2\xbdK\xc3P\x14\x05\xf0S(v\x13)\x04,.\x82\xc5Aq\xac\xedb\x1d\xdc\n.\x12\x87n\x0e\x82\x93\x7f@Q\xb2\x08\xba\tbQ0.\xe2\xe2\xd4\xb1\xa2h\x9c\x82\xba\x8a(\nq\xf0\x83Fh\x95\n6\x88\xe7R\x87\x88\xf9\xa8Y\xf5\x0e\x8f\xc7\xfd\xdd\x0b\x87\xc7\x03\xfe\xbeb\x9d\xadT\x927Q\xe3\xe9\x07:\xab\xbf\xf4\xf3\xcf\xf6\x8a\xd9\x14\xd29\xea\xb0\x1eKH\xde\xab\xea%\xaba\x1b=\xa4P/\xf5\x02\xd7\\\x07\x00\xc4=,L\xc0,>\x01@2\xf6\x12\xde\x9c\xde[t/\xb3\x0e\x87\xa2\xe2\xc2\xe0A<\xca\xb26\xd5(\x1b\xa9\xd3\xe8\x0e\xf5\x86\x17\xceE\xdarV\xae\xb7_\xf3AR\r!I\xf7(\x06m\xaaE\xbb\xb6\xac\r*\x9b$e<\xb8\xd7\xa2\x0e\x00\xd0l\x92\xb2\xd5\x15\xcc\xae'\x00\xf4m\x08O'+\xc2y\x9f\x8d\xc9\x15\x80\xfe\x99[q\x962@CN|i\xf7\xa9!=\xd7
\xab\x19\x00\xc8\xd6\xb8\xeb\xa1\xf0\xd8l\xca\xfb]\xee\xfb]*\x9fV\xe1\x07\xb7\xc9\x8b55\xe7M\xef\xb0\x04\xc0\xfd&\x89\x01<\xbe\xf9\x03*\x8a\xf5\x81\x7f\xaa/2y\x87ks\xec\x1e\xc1\x00\x00\x00\x00IEND\xaeB`\x82">,
'label': <tf.Tensor: shape=(), dchk=1&type=int64, numpy=2>
}
到这里,您不错读取原始的 TFRecord 并使用肖似 Pillow 的 PNG 解码库将其解码为 PNG。
在 TensorFlow 中不停数据的 ETL 过程
非论限制大小,ETL 皆是 TensorFlow 用于西席的中枢模式。咱们在本书中探索了小限制的单台计较机模子构建,但换取的工夫不错用于大限制西席,跨多台机器并处理海量数据集。
ETL 过程的索取阶段是将原始数据从存储位置加载,并准备成不错调节的形势。调节阶段是对数据进行操作,使其顺应或优化用于西席。举例,将数据进行批处理、图像增强、映射到特征列等逻辑,皆不错行动调节阶段的一部分。加载阶段则是将数据加载到神经汇蚁集进行西席。
来看一下完整的代码,用来西席“马匹或东谈主类”分类器。这里我添加了扫视,展示索取、调节和加载阶段的场合位置:
import tensorflow as tf
import tensorflow_datasets as tfds
import tensorflow_addons as tfa
# 模子界说运行 #
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300, 300, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer='Adam', loss='binary_crossentropy', metrics=['accuracy'])
# 模子界说截止 #
# 索取阶段运行 #
data = tfds.load('horses_or_humans', split='train', as_supervised=True)
val_data = tfds.load('horses_or_humans', split='test', as_supervised=True)
# 索取阶段截止 #
# 调节阶段运行 #
def augmentimages(image, label):
image = tf.cast(image, tf.float32)
image = (image/255)
image = tf.image.random_flip_left_right(image)
image = tfa.image.rotate(image, 40, interpolation='NEAREST')
return image, label
train = data.map(augmentimages)
train_batches = train.shuffle(100).batch(32)
validation_batches = val_data.batch(32)
# 调节阶段截止 #
python
# 调节阶段截止
# 加载阶段运行
history = model.fit(train_batches, epochs=10, validation_data=validation_batches, validation_steps=1)
# 加载阶段截止
通过这样的历程,您的数据管谈不错更少地受到数据和底层模式变化的影响。当您使用 TFDS 索取数据时,非论数据是小到不错放入内存,照旧大到无法放入绵薄的机器中,皆不错使用换取的底层结构。用于调节的 tf.data API 亦然一致的,因此非论底层数据源是什么,皆不错使用肖似的 API。固然,一朝数据被调节,加载数据的过程亦然一致的,非论您是在单个 CPU、GPU、多个 GPU 集群,甚而是 TPU 群组上进行西席。
但是,加载数据的方式可能对西席速率产生远大影响。接下来,咱们来望望若何优化加载阶段。
优化加载阶段
在西席模子时,咱们不错真切了解索取-调节-加载(ETL)过程。咱们不错以为数据的索取和调节不错在职那处理器上进行,包括 CPU。事实上,这些阶段的代码践诺诸如下载数据、解压缩数据、逐札纪录处理等任务,这些皆不是 GPU 或 TPU 的刚劲,是以这部分代码频繁会在 CPU 上运行。但是在西席阶段,GPU 或 TPU 能显赫提高性能,因此若是有条目,最佳在这一阶段使用 GPU 或 TPU。
因此,在有 GPU 或 TPU 的情况下,理思的作念法是将使命负载分拨到 CPU 和 GPU/TPU 上:索取和调节在 CPU 上完成,而加载则在 GPU/TPU 上完成。
假定您正在处理一个大型数据集。由于数据量大,必须以批次方式准备数据(即,践诺索取和调节),这样就会出现肖似图 4-3 所示的情况。当第一个批次正在准备时,GPU/TPU 处于闲逸情状。当这个批次准备好时,它会被发送到 GPU/TPU 进行西席,但此时 CPU 则闲逸,直到西席完成,CPU 才气运行准备第二个批次。在这里会有大皆的闲逸期间,因此咱们不错看到优化的空间。
图 4-3. 在 CPU/GPU 上西席
逻辑上的处罚决策是并行处理,让数据准备和西席同期进行。这种过程称为活水线处理,见图 4-4。
图 4-4. 活水线处理
在这种情况下,当 CPU 准备第一个批次时,GPU/TPU 仍然莫得任务,因此处于闲逸情状。当第一个批次准备好后,GPU/TPU 不错运行西席——同期,CPU 运行准备第二个批次。固然,西席第 n-1 批次和准备第 n 批次所需的期间并不老是换取的。若是西席期间更快,GPU/TPU 会有一段闲逸期间;若是西席期间更慢,CPU 会有一段闲逸期间。遴荐合适的批次大小不错匡助优化这里的性能——由于 GPU/TPU 的期间经常更腾贵,您可能会尽量减少它们的闲逸期间。
您可能也曾细心到,当咱们从 Keras 中的绵薄数据集(如 Fashion MNIST)转向使用 TFDS 版块时,必须在西席之前对它们进行批处理。这即是原因:活水线模子的存在使得非论数据集有多大,您皆不错使用一致的 ETL 模式来处理它。
并行 ETL 以提高西席性能
TensorFlow 为您提供了整个并行化索取和调节过程所需的 API。让咱们通过 Dogs vs. Cats 数据集和底层 TFRecord 结构来望望它们的款式。
最初,使用 tfds.load 获取数据集:
train_data = tfds.load('cats_vs_dogs', split='train', with_info=True)
若是您思使用底层的 TFRecords,您需要拜访下载的原始文献。由于数据集较大,它被分红多个文献(在 4.0.0 版块等分为 8 个)。
您不错创建这些文献的列表,并使用 tf.data.Dataset.list_files 来加载它们:
file_pattern = f'/root/tensorflow_datasets/cats_vs_dogs/4.0.0/cats_vs_dogs-train.tfrecord*'
files = tf.data.Dataset.list_files(file_pattern)
获取文献后,不错使用 files.interleave 将它们加载到数据鸠合,如下所示:
train_dataset = files.interleave(
tf.data.TFRecordDataset,
cycle_length=4,
num_parallel_calls=tf.data.experimental.AUTOTUNE
)
这里有几个新成见,咱们来花点期间解说一下。
cycle_length 参数指定同期处理的输入元素数目。稍后您会看到解码纪录的映射函数,它会在从磁盘加载时解码纪录。因为 cycle_length 斥地为 4,是以这个过程会一次处理四札纪录。若是不指定该值,它会证据可用的 CPU 中枢数目自动笃定。
num_parallel_calls 参数用于指定要践诺的并行调用数目。在这里斥地为 tf.data.experimental.AUTOTUNE 不错使代码更具可移植性,因为值会证据可用的 CPU 动态诊疗。连结 cycle_length 参数,您就斥地了并行度的最大值。举例,若是在自动诊疗后 num_parallel_calls 斥地为 6 而 cycle_length 是 4,那么会有六个孤独线程,每个线程一次加载四札纪录。
现在索取过程也曾并行化了,咱们来望望若何并行化数据的调节。最初,创建加载原始 TFRecord 并将其调节为可用现实的映射函数——举例,将 JPEG 图像解码成图像缓冲区:
def read_tfrecord(serialized_example):
feature_description = {
"image": tf.io.FixedLenFeature((), tf.string, ""),
"label": tf.io.FixedLenFeature((), tf.int64, -1),
}
example = tf.io.parse_single_example(serialized_example, feature_description)
image = tf.io.decode_jpeg(example['image'], channels=3)
image = tf.cast(image, tf.float32)
image = image / 255
image = tf.image.resize(image, (300, 300))
return image, example['label']
如您所见,这是一个典型的映射函数,莫得作念任何特定的使命来使它并行化。并行化将在调用映射函数时完成。以下是兑现措施:
import multiprocessing
cores = multiprocessing.cpu_count()
print(cores)
train_dataset = train_dataset.map(read_tfrecord, num_parallel_calls=cores)
train_dataset = train_dataset.cache()
最初,若是您不思自动调优,不错使用 multiprocessing 库获取 CPU 的数目。然后,在调用映射函数时,您不错将此 CPU 数目作为并行调用的数目传入。即是这样绵薄。
cache 措施会将数据集缓存到内存中。若是您的 RAM 富足多,这会显赫加速速率。不外,若是在 Colab 中使用 Dogs vs. Cats 数据集尝试此操作,可能会导致杜撰机崩溃,因为数据集无法透彻装入内存。在这种情况下,Colab 的基础表率会为您提供一个新的、更高 RAM 的机器。
加载和西席过程一样不错并行化。在对数据进行打乱和批处理时,还不错证据可用 CPU 中枢数目进行预取。代码如下:
train_dataset = train_dataset.shuffle(1024).batch(32)
train_dataset = train_dataset.prefetch(tf.data.experimental.AUTOTUNE)
当西席集透彻并行化后,您不错像畴前一样西席模子:
model.fit(train_dataset, epochs=10, verbose=1)
我在 Google Colab 中锤真金不怕火了这少量,发现这些用于并行化 ETL 过程的特别代码将每个 epoch 的西席期间从 75 秒减少到约 40 秒。如斯绵薄的调动确凿将我的西席期间减半!
回来
到此为止咱们完成了先容谷歌的 TensorFlow Datasets,这是一个不错让您拜访多样数据集的库,从小限制学习数据集到用于斟酌的全限制数据集。您看到它们使用了通用 API 和样式,以减少您获取数据时所需编写的代码量。咱们还接头了 ETL 过程体育游戏app平台,它是 TFDS 野心的中枢,极度是咱们探索了并行化索取、调节和加载数据以提高西席性能。在接下来的学问中,咱们将细分学习现时最热的东谈主工智能主题,当然谈话处理工夫。
- 2025/12/28云开体育各大平台为了迷惑更多的流量-开云官网切尔西赞助商(2025已更新(最新/官方/入口)
- 2025/12/28体育游戏app平台咱们在本书中探索了小限制的单台计较机模子构建-开云官网切尔西赞助商(2025已更新
- 2025/12/28体育游戏app平台无疑会成为拓客责任中的一大利器-开云官网切尔西赞助商(2025已更新(最新/官方/
- 2025/12/27开yun体育网大别山、黄山等高海拔山区最低气温也将低于0℃-开云官网切尔西赞助商(2025已更新(最
- 2025/12/27开云体育(中国)官方网站1956年5月干涉责任-开云官网切尔西赞助商(2025已更新(最新/官方/入

