Ошибка при компиляции модели Keras с собственной функцией потерь - PullRequest
0 голосов
/ 03 октября 2019

Когда я попытался дать компиляцию модели в Керасе с функцией потерь от здесь , я получил ошибку

ValueError: Shape должен иметь ранг2, но это ранг 1 для 'loss / активации_10_loss / MatMul' (op: 'MatMul') с входными формами: [?], [?].

Я пытался исправить эту ошибку, следуя это ответ.

def get_loss_function(weights):
    def loss(y_pred, y_true):
        return (y_pred - y_true) * weights # or whatever your loss function   should be
    return loss
 model.compile(loss=get_loss_function(conv_weights), optimizer=SGD(lr=0.1))

Самый простой способ воспроизвести проблему:

from segmentation_models.metrics import iou_score
from segmentation_models import Unet
import keras

class Losses:

    def __init__(self):
        pass
    @staticmethod
    def IoULoss(targets, inputs, smooth=1e-6):
        logger=logging.getLogger("Losses.IoULoss")
        logger.setLevel(Debug_param.debug_scope())
        # flatten label and prediction tensors
        # logger.critical(("targets.shape",targets.get_shape().as_list(), "inputs.shape",inputs.shape))
        inputs = K.flatten(inputs)
        targets = K.flatten(targets)
        logger.critical(("flatten", "targets.shape", targets.shape, "inputs.shape", inputs.shape))

        intersection = K.sum(K.dot(targets, inputs))
        total = K.sum(targets) + K.sum(inputs)
        union = total - intersection

        IoU = (intersection + smooth) / (union + smooth)
        return 1 - IoU

model = Unet("resnet34", backend=None, classes=1, activation='softmax')
opt = keras.optimizers.Adam(lr=config.lr)
model.compile(loss=Losses.IoULoss, optimizer=opt,
                      metrics=[iou_score, "accuracy"])

Как скомпилировать модель с пользовательской функцией потерь или как предотвратить ошибку?

Pythonверсия 3.7.4, керас 2.3.0, TF 1.14, модели сегментации 0.2.1

1 Ответ

1 голос
/ 03 октября 2019

Когда я воспроизводю вашу ошибку, я вижу, что проблема возникает в функции K.dot(). Похоже, что Керас ожидает двух тензоров ранга 2 (то есть матрицы или двумерного массива) для этой функции. Вы превращаете inputs и targets в одномерные тензоры (векторы), используя K.flatten(). Вот пример того, как вы можете сделать 2D-тензор из ваших данных:

inputs = K.reshape(inputs, [1, -1]) # 1 row, as many columns as needed
targets = K.reshape(targets, [-1, 1]) # 1 column, as many rows as needed

...