我有一個多類分類機器學習應用程式,我想使用 tensorflow 計算 f1 分數。的預測值和實際值存盤在熊貓dataframesy_pred和y_act分別。兩者都填充了 1 和 0。所以我做這樣的事情:
# convert dataframes to numpy
pred_numpy = numpy.asarray([y_pred], numpy.int32)
act_numpy = numpy.asarray([y_act], numpy.int32)
# compute multiclass f1
metric = tfa.metrics.F1Score(num_classes=num_classes, average="macro")
metric.update_state(act_numpy, pred_numpy)
print(metric.result().numpy())
但是我收到以下錯誤
TypeError: Cannot convert 1e-12 to EagerTensor of dtype int32
從熊貓到 tensorflow 的型別轉換必須有一些東西會引發錯誤。我嘗試了一系列緩解措施都無濟于事。
我嘗試將 numpy 陣列轉換為張量,如下所示:
pred_tf = tf.convert_to_tensor(pred_numpy, numpy.int32)
我嘗試確保熊貓資料框沒有 1e-12 實體:
y_pred = y_pred.replace(1e-12, 0)
我嘗試在沒有numpy.int32選項的情況下轉換為 numpy 。
但是我仍然得到同樣的錯誤。在不出現此錯誤的情況下成功從熊貓轉換為張量的任何提示?
uj5u.com熱心網友回復:
這是 tfa api 檔案中提供的代碼示例:
metric = tfa.metrics.F1Score(num_classes=3, threshold=0.5)
y_true = np.array([[1, 1, 1],
[1, 0, 0],
[1, 1, 0]], np.int32)
y_pred = np.array([[0.2, 0.6, 0.7],
[0.2, 0.6, 0.6],
[0.6, 0.8, 0.0]], np.float32)
metric.update_state(y_true, y_pred)
result = metric.result()
result.numpy()
請注意,該y_pred陣列是模型的原始輸出float,可能來自 softmax 激活。如果您查看該函式的代碼,就會發現這是支持的,因為它沿最終維度執行 argmax,或對概率設定閾值。因此,如果您將這些轉換為int,則概率都將被截斷為0,盡管我懷疑您無論如何都在傳遞已經 argmax 的值。
我懷疑這個特定錯誤來自 API 中的這一行:
y_pred = tf.logical_and(y_pred >= threshold, tf.abs(y_pred) > 1e-12)
因為它無法將您提供的 int32 與 1e-12 進行比較并嘗試轉換第二個值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/317014.html
