ValueError: Shapes (None,) and (None, 1) are incompatible

ValueError: Shapes (None,) and (None, 1) are incompatible

我有以下型号:

model = Sequential()
model.add(layers.InputLayer(input_shape=(5,)))
model.add(layers.Dense(20, activation='relu'))
model.add(layers.Dense(30, activation='relu'))
model.add(layers.Dense(1))
model.compile(loss=['mean_absolute_error'], optimizer='adam',
metrics=[metrics.MeanAbsoluteError(), metrics.MeanRelativeError(normalizer=[1])])

我的 training/testing 集合具有以下形状:

x_train.shape
(114589, 5)

y_train.shape
(114589, 1)

x_test.shape
(49110, 5)

y_test.shape
(49110, 1)

我遇到了这个错误

ValueError: Shapes (None,) and (None, 1) are incompatible
       

在我向模型添加新指标后发生此错误 tf.keras.metrics.MeanRelativeError。 请问这是什么原因造成的?我该如何解决?

这对我来说似乎是一个错误,或者至少这种行为没有很好的记录。出现问题是因为 y_pred 在内部被压缩(出于某种原因)。作为一种变通方法,您可以使用与 MeanRelativeError:

相同 logic 的自定义指标
import tensorflow as tf

def _mean_relative_error(normalizer):
  def mean_relative_error(y_pred, y_true):
    return tf.math.divide_no_nan(tf.abs(y_true - y_pred), normalizer)
  return mean_relative_error

model = tf.keras.Sequential()
model.add(tf.keras.layers.InputLayer(input_shape=(5,)))
model.add(tf.keras.layers.Dense(20, activation='relu'))
model.add(tf.keras.layers.Dense(30, activation='relu'))
model.add(tf.keras.layers.Dense(1))
model.compile(loss='mae', optimizer='adam', metrics=[tf.keras.metrics.MeanAbsoluteError(), _mean_relative_error(normalizer=[1])])
model.fit(tf.random.normal((10, 5)), tf.random.normal((10, 1)), epochs=2, batch_size=3)
Epoch 1/2
4/4 [==============================] - 1s 7ms/step - loss: 0.7566 - mean_absolute_error: 0.7209 - mean_relative_error: 0.7209
Epoch 2/2
4/4 [==============================] - 0s 6ms/step - loss: 0.6665 - mean_absolute_error: 0.6625 - mean_relative_error: 0.6625
<keras.callbacks.History at 0x7f04dcfa4390>

您可以对 normalizer 参数进行一些试验,因为 docs 指出 normalizer 应该与 y_pred.[=19= 具有相同的形状]