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

我正在使用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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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