如何解决,不能转换符号张量(IteratorGetNext:1)到numpy数组



我已经将一个自定义损失函数传递给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.

取张量,乘以方差,和均值

相关内容

  • 没有找到相关文章

最新更新