У меня ошибка, которая меня несколько часов сбивала с толку. В общем, я реализовал эту функцию потерь, взятую из статьи. С 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