Пользовательская функция потери Кераса-это получение тензоров различной формы

#python #tensorflow #machine-learning #keras #deep-learning

Вопрос:

Я создал базовую пользовательскую функцию потерь (которая возвращает либо MSE или MAE y_true и y_pred ). Однако я получаю следующую ошибку:

InvalidArgumentError: Ввод для изменения формы представляет собой тензор с 32 значениями, но запрашиваемая форма имеет 1 [[узел custom_loss/Изменить форму

Форма train_features тензора , в который я перехожу 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 значениями (и какое это имеет отношение к моей пользовательской функции потерь, поскольку моя модель работает, когда я не использую свою пользовательскую функцию потерь):

 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)
 

И я понимаю, что выходные тензоры слоев моей модели должны быть в порядке (в противном случае модель не работала бы нормально, если бы я просто установил loss='mse' model.compile() ).

Комментарии:

1. проблема заключается в функции пользовательских потерь

Ответ №1:

Ваша функция потерь возвращает тензор с 32 значениями, это происходит потому, что вы используете только побитовую операцию, а выходные данные имеют ту же форму входных данных, нейронная сеть не может выполнить регрессию с этим, вам нужно сгенерировать тензор только с ОДНИМ значением, вам нужно уменьшить размерность до (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 и уменьшите размер выходного тензора, и это сработает.