python - 在 VGG16 模型和 Tensorflow lite 中使用 converter.optimization 时预测时间长
问题描述
我写了一个基于 VGG16 的模型,我只添加了两个额外的卷积层。输出是一个大小为 16x16x1 的数组,它只是简单二进制分类的结果。我使用了 TensorFlow-lite,代码基于可用的文档。问题是,当我使用模型进行预测时,需要很长时间(近 5 分钟)才能给出结果。我在 GPU 上使用 Tensorflow 2.4,Python 3.7,我的显卡是 GTX 1660Ti(移动版),CPU 是 intel i7 9750H。
该代码可在下面找到。
import tensorflow as tf
import os
import time
import numpy as np
import cv2
import keras
import pathlib
saved_model_dir= 'model/'
saved_modelh5 = 'model.h5'
dataset_path = 'bound box dataset/img'
out_path = 'converted_model.tflite'
num_calibration_steps = 10
#-----------------------------------------------------------
images = []
for file in os.listdir(dataset_path):
img = cv2.imread( os.path.join(dataset_path,file) )
images.append(img)
images = np.array( images )
imgs_tensor = tf.cast( images, dtype = tf.float32)/255.0
ds = tf.data.Dataset.from_tensor_slices((imgs_tensor)).batch(1)
print('data loaded')
#-----------------------------------------------------------
def representative_dataset_gen():
for input_value in ds.take(num_calibration_steps):
yield [input_value]
#converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter = tf.lite.TFLiteConverter.from_keras_model(keras.models.load_model(saved_modelh5))
converter.optimizations = [tf.lite.Optimize.DEFAULT ]
#converter.representative_dataset = tf.lite.RepresentativeDataset( representative_dataset_gen )
#converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
tflite_model = converter.convert()
#------------------------------------------------------------
#with open(out_path, "wb")as f:
# f.write(tflite_model)
print('converted')
tflite_model_file = pathlib.Path(out_path)
tflite_model_file.write_bytes(tflite_model)
print('Saved')
img = cv2.imread('bound box dataset/img/1.png')
input_data = img.reshape(1,512,512,3).astype(np.float32)/255.0
interpreter = tf.lite.Interpreter( model_content = tflite_model)
interpreter.allocate_tensors()
# Get input and output tensors.
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
# Test model on random input data.
t = time.time()
input_shape = input_details[0]['shape']
#input_data = np.array(np.random.random_sample(input_shape), dtype=np.float32)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
# The function `get_tensor()` returns a copy of the tensor data.
# Use `tensor()` in order to get a pointer to the tensor.
output_data = interpreter.get_tensor(output_details[0]['index'])
t = time.time() - t
print('predict time:',t)
解决方案
首先你的 GPU 没有计算这个预测。您必须使用 cuda 将数据传输到 gpu,但这不是必需的。
将图像重塑为 (256,256) 甚至更低,尺寸为 (512, 512),图像对于 VGG 输入来说是非常大的倍。这就是您的计算需要这么长时间的原因。
我的下一个建议是改用像 ResNet50 这样的新架构。
推荐阅读
- python - 为什么 np.sum 只显示我的 np.array 的最后一个元素?
- authentication - Google OAuth 2 授权不可靠(redirect_uri_mismatch)
- python - 如何对具有多索引的熊猫系列进行位置索引
- python - 如何将数据发布到 php 并打印该数据?
- python - 当我运行我的不和谐机器人时出现错误(RuntimeError:事件循环已关闭)
- google-colaboratory - 无法清除 Google colab 磁盘空间
- java - 如何复制列表中的相同项目、更改属性值并将其添加到新列表中?
- javascript - 将 24 小时时间转换为旋转值
- reactjs - 基于产品 ID 的 React fetch API
- report - SQLWatch 报告“不包含数据”