我正在使用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
回答:
我看到了至少两种解决您问题的方案:
- 应用
model = AveragePooling2D((8, 8), strides=(8, 8))(model)
,其中model
是您加载的InceptionV3
对象(不包括顶层)。这是InceptionV3
架构中的下一步 – 因此可以很容易地假设 – 这些特征仍然包含大量的判别线索。 - 对数据样本应用某种降维方法(例如
PCA
),并将所有数据的维度降低以获得合理的文件大小。