我创建了一个基本的自定义损失函数(返回 MSE
或 MAE
属于 y_true
及 y_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()
).
1条答案
按热度按时间ulydmbyx1#
你的损失函数返回一个32个值的Tensor,这是因为你只使用了位运算,并且输出具有相同的输入形状,神经网络不能用它进行回归,你需要生成一个只有一个值的Tensor,你需要将维数降低到(1)。例如,这样做会起作用:
还有一个注意事项:你不能把if语句作为你的损失函数,网络不能用它做回归,if没有梯度,去掉if,降低输出Tensor的维数,它就会工作。