2017-03-03 80 views
3

我使用的是预训练模型Keras生成功能的一组图片:减少预训练的深度学习模型的大小特征生成

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

不过,我有大量的图片和Imagenet模型输出每个图像的131072个特征(列)。

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

更重要的是,我需要保存这个数组到磁盘和将采取的空间100 GB时,保存为.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

回答

2

的大小我看到至少有两种解决问题的方法:

  1. 套用model = AveragePooling2D((8, 8), strides=(8, 8))(model)其中model是你装(无顶)的InceptionV3对象。这是InceptionV3体系结构的下一步 - 所以人们可能很容易认为 - 这些功能仍然存在大量歧视性线索。
  2. 对数据样本应用某种维度降低(例如PCA),并降低所有数据的维度以获得合理的文件大小。
+1

1.实际上是一个非常简单的解决方案,它带来了很好的减少。 2.不可行,我已经尝试过了。计算第一批1000张图像的PCA并随后使用相同值转换其他图像批次也没有意义。 – spore234