Пользовательская функция потерь в Keras выдает странную ошибку: __call __ () отсутствует 1 обязательный позиционный аргумент: 'y_true' - PullRequest
0 голосов
/ 31 января 2020

У меня ошибка, которая меня несколько часов сбивала с толку. В общем, я реализовал эту функцию потерь, взятую из статьи. С y_true = [0,0, ..., 1, ..., 0] и y_pred является выходом моей сети одинакового размера с вероятностью принадлежности к каждому классу. Идея состоит в том, чтобы добавить log (y_j) перед 1 и добавить log (1-y_j) после 1. Это наказание полезно в одной проблеме, которую я пытаюсь решить. Не понимаю:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-39-0a4261d1fc84> in <module>
     24 ])
     25 
---> 26 model.compile(loss=custom_loss, optimizer='adam', metrics=['mse'])
     27 
     28 model.fit(CT_scan_train[:250], dummy_y[:250], epochs=5)

~\AppData\Local\Continuum\anaconda3\lib\site-packages\keras\engine\training.py in compile(self, optimizer, loss, metrics, loss_weights, sample_weight_mode, weighted_metrics, target_tensors, **kwargs)
    227         #                   loss_weight_2 * output_2_loss_fn(...) +
    228         #                   layer losses.
--> 229         self.total_loss = self._prepare_total_loss(masks)
    230 
    231         # Functions for train, test and predict will

~\AppData\Local\Continuum\anaconda3\lib\site-packages\keras\engine\training.py in _prepare_total_loss(self, masks)
    690 
    691                     output_loss = loss_fn(
--> 692                         y_true, y_pred, sample_weight=sample_weight)
    693 
    694                 if len(self.outputs) > 1:

TypeError: __call__() missing 1 required positional argument: 'y_true'

Спасибо за вашу помощь!

import keras.backend as K
from sklearn.metrics import make_scorer

def loss(y_true, y_pred):
    d = K.argmax(y_true)
    loss = K.sum(K.log(y_pred[:d]))+K.sum(K.log(1-y_pred[d:]))
    return loss

custom_loss = make_scorer(loss)

model = Sequential([
    Conv3D(2,(5,5,5), strides=(1, 1, 1), input_shape=(92, 92, 92, 1)),
    Activation('relu'),
    MaxPooling3D(pool_size=(2, 2, 2), strides=None, padding='valid', data_format=None),
    Conv3D(2, (3,3,3), strides=(1, 1, 1)),
    Activation('relu'),
    MaxPooling3D(pool_size=(2, 2, 2), strides=None, padding='valid', data_format=None),
    Conv3D(2, (3,3,3), strides=(1, 1, 1)),
    Activation('relu'),
    #Reshape(target_shape)
    Flatten(),
    Dense(64),
    Activation('relu'),
    Dense(32),
    Activation('relu'),
    Dense(5),
    Activation('relu'),
])

model.compile(loss=custom_loss, optimizer='adam')

model.fit(X, y, epochs=5)

Для получения дополнительной информации о make_scorer см .: https://scikit-learn.org/stable/modules/generated/sklearn.metrics.make_scorer.html

1 Ответ

0 голосов
/ 31 января 2020

проверьте ответ здесь .

Вам не нужно использовать make_scorer для этого, вы можете напрямую присвоить свою loss функцию model.compile

Надеюсь, это поможет

...