gpt4 book ai didi

python - 为什么轻得多的 Keras 模型在推理时的运行速度与大得多的原始模型相同?

转载 作者:行者123 更新时间:2023-12-05 04:38:09 27 4
gpt4 key购买 nike

我使用以下架构训练了一个 Keras 模型:

def make_model(input_shape, num_classes):
inputs = keras.Input(shape=input_shape)
# Image augmentation block
x = inputs
# Entry block
x = layers.experimental.preprocessing.Rescaling(1.0 / 255)(x)
x = layers.Conv2D(32, 3, strides=2, padding="same")(x)
x = layers.BatchNormalization()(x)
x = layers.Activation("relu")(x)

x = layers.Conv2D(64, 3, padding="same")(x)
x = layers.BatchNormalization()(x)
x = layers.Activation("relu")(x)

previous_block_activation = x # Set aside residual

for size in [128, 256, 512, 728]:
x = layers.Activation("relu")(x)
x = layers.SeparableConv2D(size, 3, padding="same")(x)
x = layers.BatchNormalization()(x)

x = layers.Activation("relu")(x)
x = layers.SeparableConv2D(size, 3, padding="same")(x)
x = layers.BatchNormalization()(x)

x = layers.MaxPooling2D(3, strides=2, padding="same")(x)

# Project residual
residual = layers.Conv2D(size, 1, strides=2, padding="same")(
previous_block_activation
)
x = layers.add([x, residual]) # Add back residual
previous_block_activation = x # Set aside next residual

x = layers.SeparableConv2D(1024, 3, padding="same")(x)
x = layers.BatchNormalization()(x)
x = layers.Activation("relu")(x)

x = layers.GlobalAveragePooling2D()(x)
if num_classes == 2:
activation = "sigmoid"
units = 1
else:
activation = "softmax"
units = num_classes

x = layers.Dropout(0.5)(x)
outputs = layers.Dense(units, activation=activation)(x)
return keras.Model(inputs, outputs)

而且该模型有超过 200 万个可训练参数。

然后我用 300,000 训练了一个轻得多的模型。可训练参数:

def make_model(input_shape, num_classes):
inputs = keras.Input(shape=input_shape)
# Image augmentation block
x = inputs
# Entry block
x = layers.experimental.preprocessing.Rescaling(1.0 / 255)(x)
x = layers.Conv2D(64, kernel_size=(7, 7), activation=tf.keras.layers.LeakyReLU(alpha=0.01), padding = "same", input_shape=image_size + (3,))(x)
x = layers.MaxPooling2D(pool_size=(2, 2))(x)
x = layers.Conv2D(192, kernel_size=(3, 3), activation=tf.keras.layers.LeakyReLU(alpha=0.01), padding = "same", input_shape=image_size + (3,))(x)
x = layers.Conv2D(128, kernel_size=(1, 1), activation=tf.keras.layers.LeakyReLU(alpha=0.01), padding = "same", input_shape=image_size + (3,))(x)
x = layers.MaxPooling2D(pool_size=(2, 2))(x)
x = layers.Conv2D(128, kernel_size=(3, 3), activation=tf.keras.layers.LeakyReLU(alpha=0.01), padding = "same", input_shape=image_size + (3,))(x)
x = layers.MaxPooling2D(pool_size=(2, 2))(x)
x = layers.Dropout(0.5)(x)

x = layers.GlobalAveragePooling2D()(x)
if num_classes == 2:
activation = "sigmoid"
units = 1
else:
activation = "softmax"
units = num_classes

x = layers.Dropout(0.5)(x)

outputs = layers.Dense(units, activation=activation)(x)

return keras.Model(inputs, outputs)

然而,最后一个模型(更轻,甚至接受更小的输入大小)似乎以相同的速度运行,每秒仅分类 2 张图像。因为它是一个较小的模型,速度不应该有差异吗?查看代码,是否有明显的理由说明情况并非如此?

我在两种情况下都使用相同的推理方法:

image_size = (180, 180)
batch_size = 32


model = keras.models.load_model('model_13.h5')

t_end = time.time() + 10

iters = 0

while time.time() < t_end:

img = keras.preprocessing.image.load_img(
"test2.jpg", target_size=image_size
)


img_array = image.img_to_array(img)

#print(img_array.shape)

img_array = tf.expand_dims(img_array, 0) # Create batch axis


predictions = model.predict(img_array)
score = predictions[0]

print(score)
iters += 1

if score < 0.5:
print('Fire')
else:
print('No Fire')


print('TOTAL: ', iters)

最佳答案

参数的数量最多,表示模型训练或运行推理的速度。这可能取决于许多其他因素。

这里有一些示例,它们可能会影响模型的吞吐量:

  1. 激活函数:ReLu 激活比例如具有指数项的 ELU 或 GELU。不仅计算指数比线性数慢,而且梯度的计算也复杂得多,因为在 Relu 的情况下是常数,即激活的斜率(例如 1)。
  2. 用于您的数据的位精度。一些 HW 加速器在 float16 中的计算速度比在 float32 中的计算速度更快,而且读取更少的位可以减少延迟。
  3. 有些层可能没有参数但执行固定计算。尽管没有参数被添加到网络的权重中,但仍会执行计算。
  4. 您的培训硬件架构。某些过滤器大小和批量大小的计算比其他过滤器更有效。
  5. 有时计算硬件的速度不是瓶颈,用于加载和预处理数据的输入管道

如果不进行测试很难判断,但在您的特定示例中我猜,以下内容可能会减慢您的推理速度:

  1. 具有 7x7 转换的大感知范围
  2. leaky_relu 比 relu 稍慢
  3. 瓶颈可能是您的数据输入管道,而不是推理速度。如果推理速度比数据准备快得多,则两个模型的速度可能看起来相同。但实际上硬件处于空闲状态并等待数据。

要了解发生了什么,您可以更改一些参数并评估速度,或者您可以通过使用 tensorboard 跟踪您的硬件来分析您的输入管道。这是一个小指南:https://www.tensorflow.org/tensorboard/tensorboard_profiling_keras

最好的,萨沙

关于python - 为什么轻得多的 Keras 模型在推理时的运行速度与大得多的原始模型相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70636079/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com