减少用于特征生成的预训练深度学习模型的大小

时间:2017-03-03 08:29:16

标签: numpy machine-learning neural-network deep-learning keras

我在Keras中使用预训练模型来生成一组图像的特征:

model = InceptionV3(weights='imagenet', include_top=False)
train_data = model.predict(data).reshape(data.shape[0],-1)

但是,我有很多图像,Imagenet模型为每个图像输出131072个特征(列)。

对于200k图像,我会得到(200000, 131072)的数组,这个数组太大而无法放入内存中。

更重要的是,我需要将此数组保存到磁盘,保存为.npy.h5py

时需要100 GB的空间

我可以通过只提供1000个图像批量并将它们保存到磁盘来避免内存问题,但不能解决磁盘空间问题。

如何在不丢失太多信息的情况下缩小模型?

更新

作为答案建议我也在模型中包含下一层:

base_model = InceptionV3(weights='imagenet')
model = Model(input=base_model.input, output=base_model.get_layer('avg_pool').output)

这会将输出减少到(200000, 2048)

更新2

另一个有趣的解决方案可能是bcolz包来减少numpy数组的大小https://github.com/Blosc/bcolz

1 个答案:

答案 0 :(得分:2)

我发现您的问题至少有两种解决方案:

  1. 应用model = AveragePooling2D((8, 8), strides=(8, 8))(model),其中model是您加载的InceptionV3对象(不带顶部)。这是InceptionV3架构的下一步 - 所以人们可以轻易地假设 - 这些功能仍然存在大量歧视性线索。
  2. 对数据样本应用某种降维(例如PCA),并降低所有数据的维度以获得合理的文件大小。