首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras VGG16预测速度慢

Keras VGG16预测速度慢
EN

Stack Overflow用户
提问于 2017-10-12 21:16:38
回答 2查看 4.6K关注 0票数 6

我正在为这个转移学习个人项目开发一个特征提取器,而且Kera的VGG16模型的预测功能看起来很慢(对于一批4幅图像,需要31秒)。我确实希望它是缓慢的,但不确定预测函数是否比它应该的慢。

代码语言:javascript
复制
data = DataGenerator() 
data = data.from_csv(csv_path=csv_file,
                     img_dir=img_folder,
                     batch_size=batch)

#####################################################
conv_base = VGG16(include_top=False, 
                  weights='imagenet', 
                  input_shape=(480, 640, 3))

model = Sequential()
model.add(conv_base)
model.add(MaxPooling2D(pool_size=(3, 4)))
model.add(Flatten())
######################################################

for inputs, y in data:
    feature_batch = model.predict(inputs)

    yield feature_batch, y

所以,我的直觉是,它是缓慢的,因为这些原因:

  • 我的输入数据有点大(加载在(480,640,3)大小的图像中)
  • 我运行的CPU很弱(M3-6Y30 @ 0.90GHz)
  • 我在特征提取器的末尾有一个扁平的操作。

我尝试过的事物:

  • 其他StackOverFlow文章建议添加一个最大池层,以减少特性大小/删除无关的零值。我使我认为是一个相当大的最大池窗口(因此显著减少了特性大小,但我的预测时间增加了。)
  • 批处理没有改善时间,这可能是显而易见的,因为我的M3 CPU的使用)。一批大小为1图像需要8秒,批大小为4则需要32秒。

对如何加快预测功能有什么想法吗?,我需要至少运行10,000张图像,而且由于项目的性质,我想在进入模型之前尽可能多地保留原始数据(将与其他特征提取模型进行比较)。

我所有的图像文件都是本地保存的,但我可以尝试设置一台云计算机,并将我的代码移到那里运行GPU支持。

问题是我只是在一个小CPU上运行VGG16模型吗?

如能提供指导,将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-14 14:28:01

你的模型有很多问题。主要的问题当然是非常慢的机器,但由于您无法更改这一点,这里我将就如何加快计算提出一些建议:

  1. VGG16是一种比较古老的体系结构。这里的主要问题是所谓的张量(特征图的面积、次数、特征的数量)确实是缓慢减少的。我建议您使用更现代的架构,例如ResNet50初始v3,因为它们有所谓的阀杆,它使内部张量变得更小,速度更快。你的速度应该得益于此。还有一种叫做MobileNet的非常轻巧的体系结构,它看起来非常适合您的任务。
  2. 下采样您的图像-如果您的图像大小为(480, 640),您的图像比默认的VGG输入大6倍。这使得所有的计算都慢了6倍。您可以尝试先对图像进行降采样,然后使用特征提取器。
票数 5
EN

Stack Overflow用户

发布于 2022-08-03 13:59:30

VGG16是一个非常大的模型。现代小型模型,如MobileNetV3或EfficientNet,也可以达到同样的精度。

但是,如果您必须使用您的模型,您可以尝试OpenVINO。OpenVINO是为英特尔的硬件优化,但它应该与任何CPU一起工作。它通过转换为中间表示(中间表示,IR),执行图的剪枝和将一些操作合并到其他操作,同时保持准确性来优化您的模型。然后在运行时使用矢量化。

这里是各种模型和CPU的一些性能基准。您的处理器(M3-6Y30)是第6代,因此应该支持它。

将Keras模型转换为OpenVINO非常简单,除非您有漂亮的自定义层。关于如何做到这一点的完整教程可以找到这里。下面是一些片段。

安装OpenVINO

最简单的方法是使用PIP。或者,您可以使用这个工具在您的情况下找到最佳方法。

代码语言:javascript
复制
pip install openvino-dev[tensorflow2]

将您的模型保存为SavedModel

OpenVINO无法转换HDF5模型,因此必须首先将其保存为SavedModel。

代码语言:javascript
复制
import tensorflow as tf
from custom_layer import CustomLayer
model = tf.keras.models.load_model('model.h5', custom_objects={'CustomLayer': CustomLayer})
tf.saved_model.save(model, 'model')

使用模型优化器转换SavedModel模型

模型优化器是来自OpenVINO开发包的命令行工具。它将Tensorflow模型转换为IR,这是OpenVINO的默认格式。您还可以尝试FP16的精度,这将使您在不降低精度的情况下获得更好的性能(只需更改data_type)。在命令行中运行:

代码语言:javascript
复制
mo --saved_model_dir "model" --input_shape "[1, 3, 224, 224]" --data_type FP32 --output_dir "model_ir"

运行推理

转换后的模型可以由运行时加载,并为特定的设备进行编译,例如CPU或GPU (集成到CPU中,比如Intel HD Graphics)。如果你不知道什么是你最好的选择,只需使用汽车。

代码语言:javascript
复制
# Load the network
ie = Core()
model_ir = ie.read_model(model="model_ir/model.xml")
compiled_model_ir = ie.compile_model(model=model_ir, device_name="CPU")

# Get output layer
output_layer_ir = compiled_model_ir.output(0)

# Run inference on the input image
result = compiled_model_ir([input_image])[output_layer_ir]

免责声明:我在OpenVINO工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46719028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档