我有以下模型:
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])])
我的训练/测试集有以下形状:
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.MineRelativeError之后发生的。请问是什么原因造成的?我该怎么修?
这对我来说似乎是一个bug,或者至少这种行为没有得到很好的记录。出现此问题是因为y_pred
内部受到挤压(出于某种原因(。作为一种变通方法,您可以使用与MeanRelativeError
:具有相同逻辑的自定义度量
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
参数进行一些实验,因为文档指出normalizer
应该与y_pred
具有相同的形状。