web-dev-qa-db-fra.com

Que signifie Axis = [1,2,3] dans K.Sum dans le backend Keras?

J'essaie de mettre en œuvre une fonction de perte personnalisée pour mon modèle CNN. J'ai trouvé un Ipython Notebook qui a mis en place une fonction de perte personnalisée nommée dés, comme suit:

from keras import backend as K
smooth = 1.

def dice_coef(y_true, y_pred, smooth=1):
    intersection = K.sum(y_true * y_pred, axis=[1,2,3])
    union = K.sum(y_true, axis=[1,2,3]) + K.sum(y_pred, axis=[1,2,3])
    return K.mean( (2. * intersection + smooth) / (union + smooth), axis=0)

def bce_dice(y_true, y_pred):
    return binary_crossentropy(y_true, y_pred)-K.log(dice_coef(y_true, y_pred))

def true_positive_rate(y_true, y_pred):
    return K.sum(K.flatten(y_true)*K.flatten(K.round(y_pred)))/K.sum(y_true)

seg_model.compile(optimizer = 'adam', 
              loss = bce_dice, 
              metrics = ['binary_accuracy', dice_coef, true_positive_rate])

Je n'ai jamais utilisé le backend Keras avant et je suis vraiment confondu avec les calculs matriciels du backend Keras. Donc, j'ai créé des tenseurs pour voir ce qui se passe dans le code:

val1 = np.arange(24).reshape((4, 6))
y_true = K.variable(value=val1)

val2 = np.arange(10,34).reshape((4, 6))
y_pred = K.variable(value=val2)

Maintenant je cours le dice_coef une fonction:

result = K.eval(dice_coef(y_true=y_true, y_pred=y_pred))
print('result is:', result)

Mais cela me donne cette erreur:

ValueError: Invalid reduction dimension 2 for input with 2 dimensions. for 'Sum_32' (op: 'Sum') with input shapes: [4,6], [3] and with computed input tensors: input[1] = <1 2 3>.

Ensuite, j'ai tout changé [1,2,3] à -1 Comme ci-dessous:

def dice_coef(y_true, y_pred, smooth=1):
    intersection = K.sum(y_true * y_pred, axis=-1)
    # intersection = K.sum(y_true * y_pred, axis=[1,2,3])
    # union = K.sum(y_true, axis=[1,2,3]) + K.sum(y_pred, axis=[1,2,3])
    union = K.sum(y_true, axis=-1) + K.sum(y_pred, axis=-1)
    return K.mean( (2. * intersection + smooth) / (union + smooth), axis=0)

Maintenant, cela me donne une valeur.

result is: 14.7911625

Questions:

  1. Quel est [1,2,3]?
  2. Pourquoi le code fonctionne lorsque je change [1,2,3] à -1?
  3. Que fait ce dice_coef fonction faire?
5
Muser

Qu'est-ce que [1,2,3]?

Ces chiffres spécifient la dimension que nous voulons faire la somme. Le plus petit nombre montre la dimension extérieure et le plus grand montre l'intérieur. Voir l'exemple:

import tensorflow as tf

tf.enable_eager_execution()

    a = tf.constant([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])

    print(tf.reduce_sum(a, axis=2).numpy())
    #[[ 3  7]
    # [11 15]]
    print(tf.reduce_sum(a, axis=1).numpy())
    #[[ 4  6]
    # [12 14]]
    print(tf.reduce_sum(a, axis=0).numpy())
    #[[ 6  8]
    # [10 12]]

Dans l'exemple ci-dessus, axis = 2 signifie, entrées intérieures qui sont: [1,2], [3,4], [5,6] et [7,8]. En conséquence, après la somme, nous avons le tenseur: [[3, 7], [11, 15]]. La même idée s'applique à d'autres axes.

Pourquoi le code fonctionne lorsque je change [1,2,3] à -1

Lorsque nous n'avons spécifié aucun axe ou d'autre part, spécifiez que tout axe signifie que nous allons résumer sur tous les éléments de tenseur. Cela résulte notre tenseur converti en un seul scalaire. Voir exemple:

a = tf.constant([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(tf.reduce_sum(a).numpy()) # 36
print(tf.reduce_sum(a, axis=[0,1,2])) # 36

Si nous avons 3 dimensions [0, 1, 2], axis = -1 est égal à axis = 2. Voir ICI pour un tutoriel complet sur python indexation.

Que fait cette fonction DIC_COEF?

enter image description here

Voir ICI pour une explication complète sur DIC_COEF.

2
Amir