2017-03-03 115 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