我已经将一个自定义损失函数传递给Keras模型,在计算rmse分数之前,我试图对我的标签进行逆变换。
我用标准标量变换了形状为(n,1)的标签,其中n表示标签中的记录数。
我的代码# standardization
lab_scaler2 = StandardScaler().fit(label2)
scaled_lab2 = lab_scaler2.transform(label2)
# custom loss function
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)))
Error I am get
但是它给出了一个错误,我已经记录在日志文件中。错误如下
# log file
ERROR:root:y_true: Cannot convert a symbolic Tensor (IteratorGetNext:1) to a numpy array.
This error may indicate that you're trying to pass a Tensor to a NumPy call, which is not supported
ERROR:root:y_pred:
'Tensor' object has no attribute 'reshape'.
If you are looking for numpy-related methods, please run the following:
from tensorflow.python.ops.numpy_ops import np_config
np_config.enable_numpy_behavior()
我发现了一些相关的问题,但它不适合我
根据snoopy的建议,对于所有涉及梯度的问题,你不能在损失函数中调用numpy函数,即使转换为numpy数组也不起作用。
但是在你的例子中你要调用的只是一个标准标量,这个方法只做:
z = (x - u) / s
其中u为训练的均值,s为训练的标准差。
标准标量是一个线性变换,只需要手工做,你只需要计算数据的均值和方差,而不是调用标量只需要做乘法和加法(标量的逆运算),找到均值和方差,然后手工做逆,它是一行表达式:
z = (x - u) / s
->(z * s) + u = x
.
取张量,乘以方差,和均值