TensorFlow bug激怒社群,使用者:我要用PyTorch了!
昨天,randolf-scholz 開了一個 issue 討論這個 bug。
issue 頁面:https://github.com/tensorflow/tensorflow/issues/25175
具體描述如下:
系統資訊
-
並未寫自定義程式碼;
-
OS 平臺和分佈:Ubuntu 18.10;
-
TensorFlow安裝源:conda 預設渠道
-
TensorFlow版本:1.12(conda 版本 mkl_py36h69b6ba0_0)
-
Python 版本:3.6.8
當前行為
Dropout層的行為是測試模式。
期望行為
Dropout層在訓練和測試模式之間轉換。
復現該 issue 的教程程式碼:https://www.tensorflow.org/tutorials/
import tensorflow as tf mnist = tf.keras.datasets.mnist (x_train, y_train),(x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(), tf.keras.layers.Dense(512, activation=tf.nn.relu), tf.keras.layers.<mark data-type="technologies" data-id="1c91194a-1732-4fb3-90c9-e0135c69027e">Dropout</mark>(0.2), tf.keras.layers.Dense(10, activation=tf.nn.softmax) ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=5) model.evaluate(x_test, y_test)
將 droprate 設定為 0.999 和設定為 0.2 的效能一樣(準確率都超過 95%)。這不可能,這意味著Dropout層內的訓練/測試轉換受到損壞,Dropout層總是返回 inputs,即使是在訓練階段也是這樣。
在TensorFlow1.10 中,教程指令碼在 droprate 為 99.9% 時,給出了「正確的」結果——大約 11% 的準確率。
其他資訊/日誌
問題根源似乎是 tensorflow.keras.backend.learning_phase,或者 model.fit 沒有正確設定訓練 flag。
該使用者還表示:問題似乎出現 tf.keras,而不是單獨的 keras 包。這個 issue 似乎還影響了 keras.backend.in_train_phase 功能。ta 在以下檔案中進行了測試:
-
https://pastebin.com/SvTwrSC8
-
https://pastebin.com/VtBwL5mz
在該 issue 頁面上,其他使用者也進行了測試。
有使用者表示,在TensorFlow1.13.0 版本上進行測試時,沒有出現問題。
而 Keras 作者 François Chollet 表示:
我對該 issue 和指令碼進行了詳細調查,確認這種錯誤行為僅出現在TensorFlow1.11 和 1.12 版本中。
這種行為與Dropout層或 in_train_phase 後端效能無關。Dropout層沒有問題。
當用戶在「deferred mode」中使用 Sequential 模型時,這個 bug 才會出現。deferred mode 是最近引入的使用 Sequential 模型的新方式,無需輸入 input_shape引數作為第一層。在這個案例中,似乎學習階段值設定有誤。
我認為這不會影響到很多使用者,因為 deferred mode 還很新,並未得到廣泛使用,幾乎沒有什麼 Keras 樣例使用它(keras.io 上也沒有使用過它)。但是很不幸,tensorflow.org 上的一些教程開始使用它。
我正在聯絡 devrel,確保更新程式碼示例,在 Sequential 模型中新增 input_shape引數(這種方法更好,它允許靜態層相容性檢查)。
你可以在第一個 flatten 層中輸入 input_shape=(28, 28) 來修復這個 bug。
不久前這個 bug 已在 TF 端修復。
TensorFlow是機器學習領域最廣泛使用的框架,此 bug 一出現就引起了大量使用者的關注和討論。吐槽聲甚重……
網友RedEyed__:想棄坑了
他們怎麼能這樣……這可是最常用的層。我也遇到了這個問題。這類問題的存在讓我想轉投 PyTorch。
網友 duckbill_principate:開發者根本不關心使用者體驗
把所有方法硬塞進 Keras 的想法真的很糟糕,尤其是 eager 模式。Keras 的設計對於標準模型來說還挺好用,但對以研究為導向的模型非常不友好(研究者不應該是 eager 模式的主要受益者嗎?)eager 聽起來不錯,但你用得越多,發現的 bug 就越多:實現異常緩慢而且會出現 bug,或者乾脆遺失非常重要的 ops。
我已經愉快地使用TensorFlow兩年半了,但設計的改變、蹩腳的 eager 實現、bug 的增多都讓我覺得非常不爽。我覺得開發者似乎沒有多少緊迫感,也沒有多關心使用者體驗,而是更多地追求自己的目標(這從來都不是一個好現象)。
我不想放棄 TF,因為它大部分還是好的,但我最終還是轉向了 PyTorch(原因如上所述,而且我也失去了對 TF 開發者的信任)。對此,我從未後悔過。
PS:為什麼兩年之後 Tensorboard 的 UI 還是那麼爛?除錯、視覺化和理解神經網路可以說是深度學習中最困難的部分,而在這方面能夠提供幫助的主要工具在兩年內幾乎沒有任何改進?!?!?!谷歌到底在幹嘛?
PPS:資料 pipeline 為什麼也還是那麼爛?有時候讀一些文件就像拔牙一樣。
谷歌大腦回應:嘗試給 1.11 和 1.12 加補丁
感謝您引起我們的注意並建立了這個 bug 討論。我們保證會在 1.13 中修復這個 bug,同時看看能否給 1.11 和 1.12 加補丁。
儘管谷歌大腦官方已經作出了迴應,但這一 bug 仍然破壞了使用者對TensorFlow開發程序的信心。
網友 duckbill_principate :開發程序緩慢是可預見的
說真的,我不指望到今年年底能用上TensorFlow2.x。如果我要開始一個大型研究或工程專案,我會在 1.12 或 1.3、1.4 上進行標準化,直到塵埃落定。以他們的速度,在正式啟用之前,肯定還要花好幾個月的時間修復 bug 並提速。令人沮喪的是,近一年來他們就像一列失事的火車緩慢前進。
感覺 TF 的團隊好像分成了三部分(三路人分別忙著開發 2.0、改變 eager 及重構keras),因此可以預見,整個開發程序都會慢很多。按照經驗來看,在做其它事情之前,最好先挑一件事做好……我不明白他們為什麼要同時做三件事,也許是怕 PyTorch 搶了自己飯碗吧。
參考連結:
https://github.com/tensorflow/tensorflow/issues/25175
https://www.reddit.com/r/MachineLearning/comments/ajqmq9/d_tfkeras_dropout_layer_is_broken/