我向Keras模型傳遞了一個自定義的損失函式,我試圖在計算rmse分數之前對我的標簽進行反變換。
我已經通過標準縮放器轉換了形狀為(n,1)的標簽,其中n代表標簽中的記錄數。
我的代碼
# standardization。
lab_scaler2 = StandardScaler().fit(label2)
scaled_lab2 = lab_scaler2.transform(label2)
# 自定義損失函式from keras import backend as k
def root_mean_squared_error(y_true, y_pred)。
try:
y_true = lab_scaler2.inverse_transform(y_true)
except Exception as e:
logging.error(f'y_true: {e}')
try:
y_pred = lab_scaler2.inverse_transform(y_pred.reshape(-1, 1)
except Exception as e:
logging.error(f'y_pred: {e}')
return k.sqrt(k.mean(k.square(y_pred - y_true) ))
我得到的錯誤
但是它給出了一個錯誤,我在日志檔案中記錄了這個錯誤。該錯誤如下# log file。
ERROR:root:y_true: 無法將一個符號化的Tensor(IteratorGetNext:1)轉換成numpy陣列。
這個錯誤可能表明你試圖將一個Tensor傳遞給一個NumPy呼叫,這不被支持。
ERROR:root:y_pred:
'Tensor'物件沒有屬性'reshape'。
如果你正在尋找與numpy相關的方法,請運行以下內容。
from tensorflow.python.ops.numpy_ops import np_config
np_config.enable_numpy_behavior()
我發現了一些相關的問題,但對我來說并不奏效
uj5u.com熱心網友回復:正如snoopy建議的那樣,你不能在損失函式中呼叫numpy函式,甚至轉換為numpy陣列也不行,對于所有涉及梯度的問題。
但是在你的案例中,你試圖呼叫的只是一個標準縮放器,這個方法只是做了:
其中u是訓練的平均值,s是訓練的標準偏差。
標準標度器是一個線性三角函式,只需用手去做,你只需要計算資料的平均數和方差,而不是呼叫標度器,只需做一個乘法和一個加法(標度器的逆運算),找到平均數和方差,然后用手去做逆運算,這是一個單行運算式:z = ((d))
z = (x - u) / sz = (x - u) / s -> (z * s) u = x.
只需取張量,乘以方差,然后求平均值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/326890.html
標籤:
上一篇:如何將一個numpy陣列的nan值填充到其列的平均值中?
下一篇:在Vue中使用PHPApi回應
