Skip to content

[已解決] FutureWarning: Passing (type, 1) or ‘1type’ as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / ‘(1,)type’. _np_qint8 = np.dtype([(“qint8”, np.int8, 1)])

Tensorflow 可說是眾多深度學習框架當中最具知名度的(應該?),但是在我使用 Keras/Tensorflow 時,我經常會碰到以下這種關於 Numpy 版本的 FutureWarning:

FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint8 = np.dtype([("qint8", np.int8, 1)])


雖然程式運行得相安無事,但是每次看著這個報錯在訓練模型時都會在第一時間跳出來,長期下來也覺得相當心累(還有,我的模型效果不好,總覺得這個警告很觸霉頭哈哈哈)

所以今天我就決定寫下這篇文章,一來搞清楚這個問題發生的原因、二來把這個警訊解決掉,圖個日後的心安。


問題發生原因

這個問題發生的原因很簡單:Numpy 的版本高於 1.17.x 以上。從錯誤訊息中看起來,不論是 Keras 還是 Tensorflow(或是 Keras 背後調用的 Tensorflow),在使用 Numpy 時都會使用 (type, 1) 或是 '1type' 這樣的程式寫法,然而這種寫法可能是在 Numpy 之後的版本中會汰換掉的。

也就是說,如果 Tensorflow 的版本一直沒有更新,然後 Numpy 版本卻有在持續更新的話,總有一天會因為這個寫法而報錯。

不過也不用太擔心,因為一個框架中其所使用的 Library 本來就是會有版本限制,當不小心報錯的時候,大方向就是上網查一查,總會有人分享適用的版本的。

最後順帶一提,Tensorflow 當然有注意到 Numpy 版本可能要更換程式碼的寫法。據我實測,在 Tensorflow 2.2.0 版本以上,使用最新版的 Numpy 是不會有這個報錯的。顯然 Tensorflow 在後續的版本也改動了。

但是一般來說升級 Tensorflow 版本來解決這個問題似乎是很奇怪的方法吧 …… 畢竟 Tensorflow 是主要要使用的框架,不同版本之間許多函式是不同的。所以以下介紹解決這個 Warning 的方法,分別只有兩種:

  1. 調整 Numpy 版本
  2. 使用 warnings 模組隱藏警告

解決方法

1. 調整 Numpy 版本

正如上述所提及,這個問題是因為 Numpy 在版本 1.17.x 以上時,如果程式使用舊的寫法仍然是可以執行,但 Numpy 會拋給個警訊,告訴你接下來的版本可能會更換掉這個寫法。

所以解決方法就是,安裝不同的 Numpy 版本。

pip3 install numpy==1.16.0


這樣就可以讓警告消失了。不過若是會對你的模型訓練任務造成影響的話,還請參考第二種解決方法。


2. 使用 warnings 模組隱藏警告

這個方法也很單純,在程式的最開頭加入以下程式螞即可。

import warnings
warnings.filterwarnings('ignore')


但要注意的是:如果程式開發中會有其他的警告訊息,可能也會一起屏蔽。


3. 忽略掉這個警告 …

隱藏版的第三種方法! 調整自己的心態,告訴自己 warning 等於沒有報錯!完全沒有副作用的解決辦法,也不用更換版本或是加入程式碼。

共勉之。


References


Read More

Leave a Reply