CNN Float16 vs Float32
來自專欄 CV&DL
眾所周知,通常的深度學習預測(inference)的參數,輸入輸出和運算都是用的4個位元組的 float(也叫 float 32)浮點數表示。 Float 指的是浮點數,由 IEEE 指定規則,這種結構是一種科學計數法,用符號、指數和尾數來表示,底數定位2。float 包括1個符號位、8個指數位和23個尾數位。如果改成用2個位元組的 float 16浮點數來表示,可以節約內存佔用、耗電量和運算時間。
正好最近有這方面的任務,於是想用Keras進行Float16和Float32的測試。本文主要進行準確率的測試對比,速度方面由於身邊沒有支持FP16特性的機器,所以就不討論速度對比了。
測試環境:keras2.10+tensorflow1.3.0
在Keras中可以非常方便的對默認數據類型進行設置,只需兩行代碼:
from keras import backend as KK.set_floatx(float16) # supports float16, float32, float64
在通過K.set_floatx(float16)函數設置數據類型為float16後,現在驗證一下模型是否是以float16數據類型進行運算的,我以VGG16為例子,將VGG16的每個卷積和全連接層輸出的數據類型列印出來:
可以看到VGG16的每個層輸出數據的類型確實是float16。接下來就開始進行測試,我選取當前主流的CNN模型進行此次的測試,如ResNet、Inception等。使用ImagNet的驗證集(包含50000張圖像,分屬於1000個類別)進行測試。
結果如下:
可以注意到float16與float32的準確率(包括top1、top5)的差別非常小,除了ResNet50有明顯差距(暫時還未分析出ResNet50的差距為什麼那麼大)。
此次測試的代碼在我的Github上,權重文件和數據集都有提供下載。
TianzhongSong/keras-FP16-test以上是我最近做的測試,可能對某些方面理解有偏差,文章或代碼可能存在錯誤,歡迎大家批評指正。
推薦閱讀:
※Keras之父:我擔心的是AI被社交媒體操控
※Esquirrel 的 Live -- 小白跨界入門深度學習的那些事
※【消息】Keras 2參上!這次也請大家多多關照哦
※機器學習、深度學習入坑之路?
※Keras,Theano,pytorch,caffe2 哪個更好一些,應該怎麼嘗試學習?
TAG:卷積神經網路CNN | 深度學習DeepLearning | Keras |