Проверка не удалась: 1 == NumElements () (1 против 2) Должен иметь одноэлементный тензор (Метрика нейронной сети c) - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть Neural Network Int TF2, и для этого я хочу сделать свою собственную метрику c. В моей функции я перебрасываю каждое значение тензора и могу вычислить новое значение в output_list. Это я буду складывать как мой новый y_pred и добавлю его в mean_absolute_error. Компиляция в порядке, но в первой итерации я получаю ошибку в заголовке. Что я делаю не так?

@tf.function 
def custom_metric_mae( y_true , y_pred ):
    output_list=tf.TensorArray(dtype=tf.float32, size=tf.shape(y_pred))
    for i in range(223):
        dphi = abs(y_true[i][0]-y_pred[i][0])
        if(dphi > 0.5):
            output_list.write(i,1 - dphi)
        else:
            output_list.write(i,dphi)     
    y_PredChanged = output_list.stack()
    return tf.metrics.mean_absolute_error(y_true , y_PredChanged)

Моя модель:

    model = keras.Sequential([
    keras.layers.Flatten(input_shape=(32,32)),
    keras.layers.Dense(64,activation="relu"),
    keras.layers.Dense(32,activation="relu"),
    keras.layers.Dense(16,activation="relu"),
    keras.layers.Dense(1, activation='linear')
    ])
model.compile(optimizer="adam",loss = "mean_absolute_error",metrics=[custom_metric_mae])

1 Ответ

0 голосов
/ 06 февраля 2020

Из документации Пользовательские метрики Keras :

Функция должна принимать (y_true, y_pred) в качестве аргументов и возвращать единственное значение тензора.

tf.metrics.mean_absolute_error возвращает два значения: фактическое значение MAE и значение update_op, которое после оценки обновляет рабочие значения и возвращает значение MAE. Я не совсем уверен, совместимо ли это с Keras, я бы предложил заменить его на keras.metrics.mae.

Обратите внимание, что при использовании Keras mae необходимо усреднить конечный результат ( функция применяется к последнему измерению y_true и y_pred, и результат имеет форму y_true.shape[:-1], которая, как правило, не будет одним значением). Для этого используйте tf.math.reduce_mean:

return tf.math.reduce_mean(keras.metrics.mae(y_true , y_PredChanged))
...