Keras中model.predict()与model()的区别

本文详细比较了Keras中`keras_model.predict()`和`keras_model(x)`两种获取模型预测的方法,以及如何通过调整batch_size优化`predict`函数的速度。通过实例展示了不同预测策略的时间消耗,特别是使用tf.data.Dataset的效率提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、函数详解

在 Keras 中,获取模型的预测结果的两种方式:

  • keras_model() 直接调用模型对象将 Keras 模型对象当作函数一样调用,并将输入数据作为参数传递给它,从而直接获取预测结果。

    • 优缺点:(1)支持动态图计算;(2)只支持单样本预测;(3)只支持Tensor类型的输入数据;(4)输出数据为Tensor类型;
    • 适用范围:大规模数据;实时处理;预测速度快
  • keras_model.predict() 方法:predict() 方法是 Keras 模型对象的一个函数,用于进行推理并获取预测结果。

    • 优缺点:(1)不支持动态图计算;(2)支持批量样本预测;(3)支持Tensor和NumPy类型的输入数据;(4)输出数据为NumPy类型;(5)需要一次性将所有数据加载到内存中,因此对于大型数据集,可能会导致内存不足。
    • 适用范围:小规模数据;对内存占用不敏感;预测速度慢

在 PyTorch 中,只有一种方法获取模型的预测结果:pytorch_model()

1.1、keras_model.predict(x)

"""###################################################################
函数说明: keras_model.predict(x, batch_size=None, verbose=0, steps=None, callbacks=None, max_queue_size=10, workers=1, use_multiprocessing=False)
输入参数: 
        (1)x:                       输入数据。可以是 NumPy 数组、tf.data.Dataset 对象或字典等。具体取决于模型的输入层的期望。
        (2)batch_size:              批处理大小。如果未指定,将使用默认的批处理大小。批处理大小表示模型一次性处理的样本数量,可以影响内存使用和预测速度。
        (3)verbose:                 是否显示进度信息(0表示不显示任何信息、1表示显示进度条、2表示每个epoch显示一行)
        (4)steps:                   指定预测结束的步数(批次数)。如果未指定,将一直进行预测,直到输入数据用尽。
        (5)callbacks:               可选的回调函数列表。在预测过程中的不同阶段触发不同的回调函数,用于自定义行为。
        (6)max_queue_size:          指定生成器队列的最大大小。对于生成器提供的数据,此参数可以控制内存使用。
        (7)workers:                 指定生成器的工作进程数量。仅在使用生成器提供数据时才相关。
        (8)use_multiprocessing:     布尔值,表示是否使用多进程进行数据生成。默认为 False。如果设置为 True,则会使用 workers 个进程进行数据生成。

返回参数:
		numpy数组 
###################################################################"""

1.2、keras_model(x)

"""###################################################################
函数说明: keras_model(x, training=None)
输入参数: 
        (1)x:      				输入数据。可以是 Numpy 数组、Tensor 对象或者其他可以被模型接受的输入数据。这里输入数据的形状和数据类型需要和模型的输入层相匹配。
        (2)training:  			布尔值,表示模型是否处于训练模式。
     				True(训练模式): 		如:启用Dropout、	启用Batch Normalization
     				False(推理或预测模式): 	如:不启用Dropout、	不启用Batch Normalization
      			
返回参数:
		tensor张量
###################################################################"""

二、加速测试

keras里predict函数,预测速度慢的优化方法
keras里predict很慢,300倍减少predict运行时间的优化方法

2.1、model.predict(x=input_data) —— 时耗:0.09967 秒

2.2、model.predict(x=input_data, batch_size=8) —— 时耗:0.12919 秒

2.3、model.predict(tf.data.Dataset.from_tensors(input_data)) —— 时耗:0.08310 秒

2.4、model(x=input_data, training=False) —— 时耗:0.01395 秒

import time
import numpy as np
import tensorflow as tf


if __name__ == "__main__":
    print("Tensorflow版本 =", tf.__version__)
	##############################################################################
    # (1)新建模型
    flag = 2
    if flag == 1:
        """1.序列模型"""
        from tensorflow import keras
        model = keras.Sequential([
            keras.layers.Dense(128, activation='relu', input_shape=(10,)),  # 定义第一个全连接层,包括 128 个神经元,使用 ReLU 激活函数,输入形状为 (10,)。
            keras.layers.Dense(64, activation='relu'),  # 定义第二个全连接层,包括 64 个神经元,使用 ReLU 激活函数。
            keras.layers.Dense(1, activation='sigmoid')  # 定义输出层,包括 1 个神经元,使用 Sigmoid 激活函数,适用于二分类问题。
        ])
        input_data = np.random.rand(1000, 10)  # 随机生成输入数据,其中包含 1000 个样本,每个样本有 10 个特征。
    elif flag == 2:
        """2.卷积模型"""
        from tensorflow.keras import layers, models
        model = models.Sequential([
            # 卷积层,包含 32 个卷积核(filters),每个卷积核大小为 (3, 3),使用 ReLU 激活函数。input_shape=(100, 100, 3) 表示输入图像的形状为 (100, 100, 3)
            layers.Conv2D(32, (3, 3), activation='relu', input_shape=(100, 50, 3)),
            layers.MaxPooling2D((2, 2)),
            layers.Conv2D(64, (3, 3), activation='relu'),
            layers.MaxPooling2D((2, 2)),
            # 将卷积层输出的多维数据展平为一维,为全连接层做准备。
            layers.Flatten(),
            layers.Dense(128, activation='relu'),
            layers.Dense(1, activation='sigmoid')
        ])
        input_data = np.random.rand(1000, 100, 50, 3)  # 随机生成输入数据,其中包含 1000 个样本,每个图像为100x100x3(RGB)。

    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])  # 编译模型: 指在使用模型进行训练之前,配置模型参数。
    model.summary()  # 打印模型概要
    ##############################################################################
    # (2)多种预测方式的时耗
    for ii in range(3):
        clock = time.time()
        res1 = model.predict(x=input_data)
        elapsed_time = time.time() - clock
        print(f"总共耗时1: {elapsed_time:.5f} 秒")

        clock = time.time()
        res2 = model.predict(x=input_data, batch_size=8)
        elapsed_time = time.time() - clock
        print(f"总共耗时2: {elapsed_time:.5f} 秒")

        clock = time.time()
        test3 = model.predict(tf.data.Dataset.from_tensors(input_data))
        elapsed_time = time.time() - clock
        print(f"总共耗时3: {elapsed_time:.5f} 秒")

        clock = time.time()
        res4 = model(x=input_data, training=False)
        elapsed_time = time.time() - clock
        print(f"总共耗时4: {elapsed_time:.5f} 秒")
        print(" ")

    """
	总共耗时1: 0.09967 秒
	总共耗时2: 0.12919 秒
	总共耗时3: 0.08310 秒
	总共耗时4: 0.01395 秒
    """
### 回答1: keras.model.predict是一个使用Keras模型进行预测的函数。它接受一个输入数据并输出预测结果。该函数可以用于各种深度学习任务,包括图像分类、文本分类、回归等等。在使用前,需要先编译模型并加载权重文件。 ### 回答2: Keras是一个高级神经网络API,可以运行在Tensorflow、Theano、CNTK等深度学习框架之上,致力于使深度学习模型的构建和训练快速、简单和易扩展。KerasPython的一个库,其中包含了一个专业的高级深度学习框架,提供了一些便捷易用的API,包装了TensorFlow、Theano、CNTK等深度学习框架,使得人们能够很容易的构建、训练和部署深度学习模型。其中,Keras的一个重要特性就是提供了一个大量的预处理和模型定义API,其中包括了Keras.model.predict函数。Keras.model.predict函数是Keras模型中最常用的函数之一,用于将一组输入数据作为输入,产生一组相应的输出。具体来说,使用Keras.model.predict函数需要按照以下步骤: 1. 构建模型:首先,需要构建好模型,这可以通过使用Keras中的模型构建API完成。这里举例说明最常用的三种构建模型的方法。 (1)Sequential模型:这种模型支持多层神经网络,按照顺序添加层。 (2)函数式API:此种模型使用Keras的函数式API来创建模型,支持任意网络拓扑结构。 (3)模型子类化:在此种模型中,用户需要自己定义模型类,实现构建网络过程。 2. 加载训练好的模型:如果模型已经被训练好了,那么就需要加载模型。 3. 输入测试数据:使用Keras.model.predict函数的第一步就是准备输入数据。 4. 进行预测:通过调用Keras.model.predict函数来进行预测。Keras.model.predict函数支持的参数的说明如下: (1)x:输入测试数据,可以是NumPy数组、Tensor或输入字典的组合。 (2)batch_size:设置网络的批大小。 (3)verbose:控制预测过程中是否输出日志信息。 (4)steps:预测数据的批次数。 (5)callbacks:设置在预测过程中需要调用的回调函数。 Keras.model.predict函数的输出为预测结果。需要注意的是,predict函数对于一个完整的输入数据集进行预测,并返回一个数组,其中每个元素都是一个预测结果。预测结果可以进行后续处理,例如分类或回归分析。总的来说,Keras.model.predict函数提供了一个非常便捷的API,用于测试训练好的神经网络模型,且易于使用,适用于许多实际场景的应用。 ### 回答3: keras是一个使用Python编写的开源深度学习框架,它简单易用且功能强大,被广泛应用于各种机器学习和深度学习任务中。其中keras.model.predict函数是keras中非常重要的一个函数,可以用于对训练好的模型进行预测。 具体来说,keras.model.predict函数用于对输入数据进行预测,并返回相应的预测结果。其基本语法如下: ``` predict(x, batch_size=None, verbose=0, steps=None) ``` 其中x表示输入数据,batch_size表示每次输入数据的数量,verbose表示是否显示预测的详细信息,steps表示每次迭代的步数。在使用keras.model.predict函数时,我们需要注意以下几点: 首先,我们需要将输入数据转换成模型接受的格式,通常是通过对数据进行归一化处理,并将其转换成numpy数组的形式。 其次,我们需要对输入数据进行预处理,通常是通过对数据进行缩放或者旋转等操作,从而增加模型的鲁棒性。 最后,我们需要根据实际情况选择合适的batch_size和steps参数,从而控制预测的速度和精度。 总的来说,keras.model.predict函数是keras框架中非常重要的一个函数,它可以用于对训练好的模型进行预测,并提供了各种参数设置,从而让我们能够更加灵活地进行预测操作。如果我们想要进一步利用keras进行深度学习的研究和应用,那么对此函数的认识和掌握是非常必要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖墩会武术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值