Keras 3 API 文档 / 实用工具 / Python和NumPy工具

Python和NumPy工具

[source]

set_random_seed function

keras.utils.set_random_seed(seed)

设置所有随机种子(Python、NumPy 和后端框架,例如 TF).

你可以使用此工具使几乎任何 Keras 程序完全确定.在涉及网络通信(例如参数服务器分布)的情况下,这会产生额外的随机源,或者在涉及某些非确定性 cuDNN 操作的情况下,存在一些限制.

调用此工具相当于以下操作:

import random
random.seed(seed)

import numpy as np
np.random.seed(seed)

import tensorflow as tf  # 仅在安装了 TF 的情况下
tf.random.set_seed(seed)

import torch  # 仅在后端为 'torch' 的情况下
torch.manual_seed(seed)

请注意,即使你没有使用 TensorFlow 作为后端框架,也会设置 TensorFlow 种子,因为许多工作流利用 tf.data 管道(具有随机洗牌功能).同样,许多工作流可能会利用 NumPy API.

参数: seed:整数,要使用的随机种子.


[source]

split_dataset function

keras.utils.split_dataset(
    dataset, left_size=None, right_size=None, shuffle=False, seed=None
)

将数据集分割成左半部分和右半部分(例如训练集/测试集).

参数: dataset: 一个 tf.data.Dataset 对象,一个 torch.utils.data.Dataset 对象, 或者是一个长度相同的数组列表/元组. left_size: 如果是浮点数(范围在 [0, 1] 之间),表示要打包到左数据集中的数据比例.如果是整数,表示要打包到左数据集中的样本数量.如果为 None,默认为 right_size 的补集. 默认为 None. right_size: 如果是浮点数(范围在 [0, 1] 之间),表示要打包到右数据集中的数据比例.如果是整数,表示要打包到右数据集中的样本数量.如果为 None,默认为 left_size 的补集. 默认为 None. shuffle: 布尔值,表示是否在分割前打乱数据. seed: 用于打乱的随机种子.

返回: 一个包含两个 tf.data.Dataset 对象的元组: 左分割和右分割.

示例:

>>> data = np.random.random(size=(1000, 4))
>>> left_ds, right_ds = keras.utils.split_dataset(data, left_size=0.8)
>>> int(left_ds.cardinality())
800
>>> int(right_ds.cardinality())
200

[source]

pack_x_y_sample_weight function

keras.utils.pack_x_y_sample_weight(x, y=None, sample_weight=None)

将用户提供的数据打包成一个元组.

这是一个方便的工具,用于将数据打包成 Model.fit() 使用的元组格式.

示例:

>>> x = ops.ones((10, 1))
>>> data = pack_x_y_sample_weight(x)
>>> isinstance(data, ops.Tensor)
True
>>> y = ops.ones((10, 1))
>>> data = pack_x_y_sample_weight(x, y)
>>> isinstance(data, tuple)
True
>>> x, y = data

参数: x: 传递给 Model 的特征. y: 传递给 Model 的真实目标. sample_weight: 每个元素的样本权重.

返回: 在 Model.fit() 中使用的格式元组.


[source]

get_file function

keras.utils.get_file(
    fname=None,
    origin=None,
    untar=False,
    md5_hash=None,
    file_hash=None,
    cache_subdir="datasets",
    hash_algorithm="auto",
    extract=False,
    archive_format="auto",
    cache_dir=None,
    force_download=False,
)

从URL下载文件(如果尚未在缓存中).

默认情况下,位于URL origin 的文件会下载到缓存目录 ~/.keras,放置在缓存子目录 datasets 中,并命名为 fname.因此,文件 example.txt 的最终位置将是 ~/.keras/datasets/example.txt..tar.tar.gz.tar.bz.zip 格式的文件也可以被解压.

传递哈希值将在下载后验证文件.命令行程序 shasumsha256sum 可以计算哈希值.

示例:

path_to_downloaded_file = get_file(
    origin="https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz",
    extract=True,
)

参数: fname:如果目标是单个文件,这是您希望为文件指定的本地名称. 如果为 None,将使用 origin 处文件的名称. 如果下载并解压目录归档文件, 提供的 fname 将用作解压目录名称(仅当它没有扩展名时). origin:文件的原始URL. untar:已弃用,取而代之的是 extract 参数. 布尔值,是否应解压tar归档文件. md5_hash:已弃用,取而代之的是 file_hash 参数. 文件的md5哈希值,用于文件完整性验证. file_hash:下载后文件的预期哈希字符串. sha256和md5哈希算法均受支持. cache_subdir:在Keras缓存目录下保存文件的子目录. 如果指定绝对路径,例如 "/path/to/folder", 文件将保存在该位置. hash_algorithm:选择用于验证文件的哈希算法. 选项有 "md5'"sha256'"auto'. 默认的 "auto' 检测正在使用的哈希算法. extract:如果为 True,解压归档文件.仅适用于压缩归档文件,如tar或zip. archive_format:尝试解压文件的归档格式. 选项有 "auto'"tar'"zip'None. "tar" 包括tar、tar.gz和tar.bz文件. 默认的 "auto' 对应于 ["tar", "zip"]. None或空列表将返回未找到匹配项. cache_dir:存储缓存文件的位置,当为None时, 默认使用 $KERAS_HOME 环境变量(如果设置了 KERAS_HOME)或 ~/.keras/. force_download:如果为 True,无论缓存状态如何,文件都将重新下载.

返回: 下载文件的路径.

⚠️ 关于恶意下载的警告 ⚠️

从互联网下载某些东西是有风险的. 如果您不信任来源,请勿下载文件/归档文件. 我们建议您指定 file_hash 参数 (如果知道源文件的哈希值),以确保您获得的文件是您期望的文件.


[source]

Progbar class

keras.utils.Progbar(
    target, width=20, verbose=1, interval=0.05, stateful_metrics=None, unit_name="step"
)

显示一个进度条.

参数: target: 预期的总步数,如果未知则为None. width: 进度条在屏幕上的宽度. verbose: 冗长模式,0(静默),1(详细),2(半详细) stateful_metrics: 不应随时间平均的字符串指标名称的可迭代对象.此列表中的指标将按原样显示. 所有其他指标将在显示前由进度条平均. interval: 最小视觉进度更新间隔(以秒为单位). unit_name: 步数显示名称(通常为"step”或"sample”).


[source]

PyDataset class

keras.utils.PyDataset(workers=1, use_multiprocessing=False, max_queue_size=10)

基类,用于使用Python代码定义并行数据集.

每个PyDataset必须实现__getitem__()__len__()方法.如果你想在每个epoch之间修改你的数据集,你可以额外实现on_epoch_end()on_epoch_begin,以便在每个epoch开始时调用.__getitem__()方法应该返回一个完整的批次(而不是单个样本),而__len__()方法应该返回数据集中批次的数量(而不是样本的数量).

参数: workers: 用于多线程或多进程的工作线程数. use_multiprocessing: 是否使用Python多进程进行并行处理.将其设置为True意味着你的数据集将在多个分叉进程中复制.这对于从并行处理中获得计算级别的(而不是I/O级别的)好处是必要的.然而,只有当你的数据集可以安全地被pickle化时,才能将其设置为True. max_queue_size: 在多线程或多进程设置中迭代数据集时,队列中保留的最大批次数.减少此值可以减少数据集的CPU内存消耗.默认为10.

注意:

  • PyDataset是一种更安全的多进程方式.这种结构保证模型在每个epoch中只会对每个样本训练一次,而Python生成器则不是这种情况.
  • workersuse_multiprocessingmax_queue_size参数存在是为了配置fit()如何使用并行性来迭代数据集.它们不是由PyDataset类直接使用的.当你手动迭代一个PyDataset时,不会应用并行性.

示例:

from skimage.io import imread
from skimage.transform import resize
import numpy as np
import math

# 这里,`x_set`是图像路径列表
# 而`y_set`是相关的类别.

class CIFAR10PyDataset(keras.utils.PyDataset):

    def __init__(self, x_set, y_set, batch_size, **kwargs):
        super().__init__(**kwargs)
        self.x, self.y = x_set, y_set
        self.batch_size = batch_size

    def __len__(self):
        # 返回批次的数量.
        return math.ceil(len(self.x) / self.batch_size)

    def __getitem__(self, idx):
        # 返回批次idx的x, y.
        low = idx * self.batch_size
        # 上限为数组长度;如果项目总数不是批次大小的倍数,最后一个批次可能会更小.
        high = min(low + self.batch_size, len(self.x))
        batch_x = self.x[low:high]
        batch_y = self.y[low:high]

        return np.array([
            resize(imread(file_name), (200, 200))
               for file_name in batch_x]), np.array(batch_y)

[source]

to_categorical function

keras.utils.to_categorical(x, num_classes=None)

将类别向量(整数)转换为二进制类别矩阵.

例如,用于 categorical_crossentropy.

参数: x: 类值数组,将被转换为矩阵(整数从 0 到 num_classes - 1). num_classes: 类别总数.如果为 None,则推断为 max(x) + 1.默认为 None.

返回: 输入的二进制矩阵表示,作为 NumPy 数组.类别轴放在最后.

示例:

>>> a = keras.utils.to_categorical([0, 1, 2, 3], num_classes=4)
>>> print(a)
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]
>>> b = np.array([.9, .04, .03, .03,
...               .3, .45, .15, .13,
...               .04, .01, .94, .05,
...               .12, .21, .5, .17],
...               shape=[4, 4])
>>> loss = keras.ops.categorical_crossentropy(a, b)
>>> print(np.around(loss, 5))
[0.10536 0.82807 0.1011  1.77196]
>>> loss = keras.ops.categorical_crossentropy(a, a)
>>> print(np.around(loss, 5))
[0. 0. 0. 0.]

[source]

normalize function

keras.utils.normalize(x, axis=-1, order=2)

规范化一个数组.

如果输入是NumPy数组,则返回一个NumPy数组. 如果是后端张量,则返回一个后端张量.

参数: x: 要规范化的数组. axis: 沿其规范化的轴. order: 规范化顺序(例如,order=2表示L2范数).

返回: 数组的规范化副本.