自定义keras损失函数得到不同形状的Tensor

h43kikqp  于 2021-09-08  发布在  Java
关注(0)|答案(1)|浏览(404)

我创建了一个基本的自定义损失函数(返回 MSEMAE 属于 y_truey_pred ). 但是,我得到以下错误:
invalidargumenterror:整形的输入是一个具有32个值的Tensor,但请求的形状有1[[节点自定义\丢失/整形]
形状 train_features 我传入的Tensor model.fit()(44,906,1) ,我的顺序模型是:

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.LocallyConnected1D(4, kernel_size=(4), strides=2,
      activation='relu', input_shape= train_features.shape[1:], padding='valid'))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(1, activation='relu'))

我不确定为什么要重塑具有32个值的Tensor(这与我的自定义损失函数有什么关系,因为我的模型在我不使用自定义损失函数时工作):

def custom_loss(y_true,y_pred):
    if y_true >= y_pred:
      return keras.backend.square(y_pred - y_true)
    else:
      return keras.backend.abs(y_pred-y_true)

我的理解是,我的模型的层输出Tensor应该是正确的(否则,如果我简单地设置 loss='mse' 在里面 model.compile() ).

ulydmbyx

ulydmbyx1#

你的损失函数返回一个32个值的Tensor,这是因为你只使用了位运算,并且输出具有相同的输入形状,神经网络不能用它进行回归,你需要生成一个只有一个值的Tensor,你需要将维数降低到(1)。例如,这样做会起作用:

import keras.backend as K

def my_mse(y_true, y_pred):
    return K.mean(K.square(y_pred - y_true), axis=-1)

还有一个注意事项:你不能把if语句作为你的损失函数,网络不能用它做回归,if没有梯度,去掉if,降低输出Tensor的维数,它就会工作。

相关问题