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

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

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

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

对于20万张图像,我会得到一个(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. 应用model = AveragePooling2D((8, 8), strides=(8, 8))(model),其中model是您加载的InceptionV3对象(不包括顶层)。这是InceptionV3架构中的下一步 – 因此可以很容易地假设 – 这些特征仍然包含大量的判别线索。
  2. 对数据样本应用某种降维方法(例如PCA),并将所有数据的维度降低以获得合理的文件大小。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注