我在为一个迁移学习个人项目开发特征提取器,Keras的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
因此,我认为速度慢的原因有以下几点:
- 我的输入数据有点大(加载的是(480, 640, 3)尺寸的图片)
- 我在使用一个性能较弱的CPU(M3-6Y30 @ 0.90GHz)
- 我在特征提取器的末端有一个展平操作。
我尝试过以下方法:
- 其他StackOverflow帖子建议添加一个最大池化层来减少特征大小/去除多余的零。我使用了一个相当大的最大池化窗口(因此显著减少了特征大小),但我的预测时间反而增加了。
- 批处理没有改善时间,这可能是因为使用了我的M3 CPU。批量大小为1张图片需要8秒,批量大小为4张需要32秒。
有什么方法可以加速预测函数吗? 我需要处理至少10,000张图片,并且由于项目的性质,我希望在输入模型之前尽可能保留原始数据(将与其他特征提取模型进行比较)
我的所有图像文件都保存在本地,但我可以尝试设置一个云计算机,并将我的代码移到那里以支持GPU运行。
问题仅仅是我在使用一个性能低下的CPU运行VGG16模型吗?
非常感谢您的指导。
回答:
你的模型存在许多问题。主要问题当然是机器非常慢,但由于你无法改变这一点,我将提供一些建议,帮助你加速计算:
-
VGG16 是一个相对较旧的架构。这里的主要问题是所谓的张量体积(特征图面积乘以特征数量)减少得非常慢。我建议你使用更现代的架构,例如 ResNet50 或 Inception v3,因为它们有所谓的“stem”,可以快速使内部张量变得更小。你的速度应该会因此受益。还有一个非常轻量级的架构叫做 MobileNet,似乎非常适合你的任务。
-
缩小你的图片 – 你的图片尺寸为
(480, 640)
,比默认的VGG
输入大6倍。这使得所有计算速度变慢6倍。你可以先尝试缩小图片,然后再使用特征提取器。