[英]Tensorflow/Keras: Output shape mismatch in training data and predicted data
[英]Tensorflow & Keras: Different output shape depends on training or inferring
我對tensorflow.keras.Model
進行子類化以實現某個 Z20F35E630DAF399DBFA4C3F68 預期行為:
代碼是:
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.