2017-10-12 194 views
2

我正在研究這個轉移學習個人項目的特徵提取器,並且Kera的VGG16模型的預測函數看起來很慢(一批4幅圖像需要31秒)。我確實期望它很慢,但不確定預測函數是否比應該慢。Keras VGG16預測速度緩慢

data = DataGenerator() 
data = data.from_csv(csv_path=csv_file, 
        img_dir=img_folder, 
        batch_size=batch) 

##################################################### 
conv_base = VGG16(include_top=False, 
        weights='imagenet', 
        input_shape=(480, 640, 3)) 

model = Sequential() 
model.add(conv_base) 
model.add(MaxPooling2D(pool_size=(3, 4))) 
model.add(Flatten()) 
###################################################### 

for inputs, y in data: 
    feature_batch = model.predict(inputs) 

    yield feature_batch, y 

所以,我的直覺是,這是由於這些原因慢:

  • 我輸入的數據是
  • 有點大((480,640,3)大小的圖像加載)
  • 我在弱CPU上運行(M3-6Y30 @ 0.90GHz)
  • 我在特徵提取器的末尾有一個扁平操作。

事情我已經嘗試:

  • 其他StackOverflow的帖子建議增加最大池層 縮小特徵尺寸/刪除多餘的零。我做了我認爲 一個相當大的最大池窗口(從而減少特徵尺寸 顯著,但我的預測時間的增加。
  • 批處理沒有改善時這可能是由於明顯向 使用我的M3 CPU的) 。 1幅圖像的批量大小需要8秒,4 批量大小需要32

是否有關於如何加快預測函數任何想法?我需要至少運行10,000個圖像,並且由於項目的性質,我希望在進入模型之前保留儘可能多的原始數據(將與其他特徵提取模型進行比較)

我所有的圖像文件都保存在本地,但我可以嘗試安裝雲計算機並將代碼移到那裏以支持GPU運行。

問題只是我在Dinky CPU上運行VGG16模型?

指導將不勝感激。

+0

0.9GHz非常,非常非常弱 – OptimusCrime

回答

1

您的模型有許多問題。主要問題當然是很慢的機器,但你不能在這裏改變我會說明你如何能加快你的計算諮詢的一些作品:

  1. VGG16是比較老的架構。這裏的主要問題是所謂的張量(特徵圖的面積乘以特徵的數量)真的很慢。我建議你使用更現代的建築,例如ResNet50Inception v3,因爲它們具有所謂的杆,這使得張量內張得非常小。你的速度應該得益於此。還有一個非常輕巧的架構,稱爲MobileNet,這對您的任務來說非常適合。

  2. 下采樣您的圖像 - 用大小(480, 640)圖像的比默認VGG輸入大6倍。這使得所有計算速度降低了6倍。您可以嘗試先下載圖像,然後使用特徵提取器。

+0

這是有用的建議,並有幫助,所以非常感謝!我也意識到,當我從控制檯運行我的模型(而不是Python Notebook)時,我收到了一條關於在我的機器上設置SSE指令的警告,以加速運行在CPU上的Tensorflow的計算。這裏有一個相關的StackOverFlow鏈接對其他感興趣的人:https://stackoverflow.com/questions/43134753/tensorflow-wasnt-compiled-to-use-sse-etc-instructions-but-these-are-availab#43135194 –

+0

如果你不介意我會感激upvote :) –