簡體   English   中英

Tensorflow & Keras:不同的 output 形狀取決於訓練或推斷

[英]Tensorflow & Keras: Different output shape depends on training or inferring

我對tensorflow.keras.Model進行子類化以實現某個 Z20F35E630DAF399DBFA4C3F68 預期行為:

  1. 訓練(擬合)時間:返回張量列表,包括最終的 output 和輔助 output;
  2. 推斷(預測)時間:返回單個 output 張量。

代碼是:

class SomeModel(tensorflow.keras.Model):
    # ......
    def call(self, x, training=True):
        # ......
        return [aux1, aux2, net] if training else net

這就是我使用它的方式:

model=SomeModel(...)
model.compile(...,
    loss=keras.losses.SparseCategoricalCrossentropy(),
    loss_weights=[0.4, 0.4, 1],...)
# ......
model.fit(data, [labels, labels, labels])

並得到:

AssertionError:在轉換后的代碼中:

ipython-input-33-862e679ab098:140 調用 *

 `return [aux1, aux2, net] if training else net`

...\tensorflow_core\python\autograph\operators\control_flow.py:918 if_stmt

那么問題是if語句被轉換為計算圖,這當然會導致問題。 我發現整個堆棧跟蹤很長而且沒用,所以這里不包括在內。

那么,有沒有辦法讓 TensorFlow 根據training生成不同的圖?

您使用的是哪個 tensorflow 版本? 您可以覆蓋 Tensorflow 2.2 中的 .fit、.predict 和 .evaluate 方法中的行為,這將為這些方法生成不同的圖表(我假設)並可能適用於您的用例。

早期版本的問題是子類模型是通過跟蹤call方法創建的。 這意味着 Python 條件變為 Tensorflow 條件,並在圖創建和執行期間面臨一些限制。
首先,必須定義兩個分支(if-else),並且關於 python collections(例如列表),分支必須具有相同的結構(例如元素數量)。 您可以在此處此處閱讀有關 Autograph 的限制和影響的信息。

(此外,如果條件基於 Python 變量而不是張量,則可能不會在每次運行時評估條件。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM