我在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
我可以通过只提供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
答案 0 :(得分:2)
我发现您的问题至少有两种解决方案:
model = AveragePooling2D((8, 8), strides=(8, 8))(model)
,其中model
是您加载的InceptionV3
对象(不带顶部)。这是InceptionV3
架构的下一步 - 所以人们可以轻易地假设 - 这些功能仍然存在大量歧视性线索。PCA
),并降低所有数据的维度以获得合理的文件大小。