我正在为这个转移学习个人项目开发一个特征提取器,而且Kera的VGG16模型的预测功能看起来很慢(对于一批4幅图像,需要31秒)。我确实希望它是缓慢的,但不确定预测函数是否比它应该的慢。
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所以,我的直觉是,它是缓慢的,因为这些原因:
我尝试过的事物:
对如何加快预测功能有什么想法吗?,我需要至少运行10,000张图像,而且由于项目的性质,我想在进入模型之前尽可能多地保留原始数据(将与其他特征提取模型进行比较)。
我所有的图像文件都是本地保存的,但我可以尝试设置一台云计算机,并将我的代码移到那里运行GPU支持。
问题是我只是在一个小CPU上运行VGG16模型吗?
如能提供指导,将不胜感激。
发布于 2017-10-14 14:28:01
你的模型有很多问题。主要的问题当然是非常慢的机器,但由于您无法更改这一点,这里我将就如何加快计算提出一些建议:
发布于 2022-08-03 13:59:30
VGG16是一个非常大的模型。现代小型模型,如MobileNetV3或EfficientNet,也可以达到同样的精度。
但是,如果您必须使用您的模型,您可以尝试OpenVINO。OpenVINO是为英特尔的硬件优化,但它应该与任何CPU一起工作。它通过转换为中间表示(中间表示,IR),执行图的剪枝和将一些操作合并到其他操作,同时保持准确性来优化您的模型。然后在运行时使用矢量化。
这里是各种模型和CPU的一些性能基准。您的处理器(M3-6Y30)是第6代,因此应该支持它。
将Keras模型转换为OpenVINO非常简单,除非您有漂亮的自定义层。关于如何做到这一点的完整教程可以找到这里。下面是一些片段。
安装OpenVINO
最简单的方法是使用PIP。或者,您可以使用这个工具在您的情况下找到最佳方法。
pip install openvino-dev[tensorflow2]将您的模型保存为SavedModel
OpenVINO无法转换HDF5模型,因此必须首先将其保存为SavedModel。
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)。在命令行中运行:
mo --saved_model_dir "model" --input_shape "[1, 3, 224, 224]" --data_type FP32 --output_dir "model_ir"运行推理
转换后的模型可以由运行时加载,并为特定的设备进行编译,例如CPU或GPU (集成到CPU中,比如Intel HD Graphics)。如果你不知道什么是你最好的选择,只需使用汽车。
# 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工作。
https://stackoverflow.com/questions/46719028
复制相似问题