2017-05-15 1 views
1

J'essaie d'utiliser la pondération d'échantillon avec ImageGenerator dans une tâche de segmentation par pixel.Comment utiliser les poids d'échantillonnage avec augmentation de données dans Keras?

  • images et des masques sont des tableaux numpy (634, 1, 64, 64)
  • masques ont 5 classes (codée comme 0 à 4)
  • sample_weight est un réseau (634, 64, 64)
  • augmentation de données en utilisant .flow pour deux générateurs avec modèle identique seed=42 et batch_size=32
  • étant compilé avec sample_weight_mode='temporal'
  • 3 dernières couches i n le modèle Unet sont:

    conv2d_19 (Conv2D) (None, 5, 64, 64)  325   
    dropout_18[0][0]     
    
    conv2d_20 (Conv2D) (None, 1, 64, 64)  6   
    conv2d_19[0][0]     
    
    activation_1 (Activation) (None, 1, 64, 64)  0 
    conv2d_20[0][0] 
    

Cela jette une erreur:

ValueError: Found a sample_weight array with shape (634, 64, 64). In order to use timestep-wise sample weighting, you should pass a 2D sample_weight array.

Si je Reshape sample_weight à (634, 4096) je reçois:

ValueError: Found a sample_weight array with shape (634, 4096) for an input with shape (32, 1, 64, 64). sample_weight cannot be broadcast.

Est-ce mon malentendu sur la façon d'utiliser ImageGenerator ou est-il incapable de gérer cette situation particulière?

Si je n'utilise pas de poids d'échantillonnage, le modèle s'exécute et aucune erreur n'est générée.

Keras 2.0.4, Theano 0,9

Répondre

1

Les poids d'échantillon Keras prennent en entrée un tableau 1D (un poids par fonction) en mode par défaut, et un tableau 2D en mode temporel. Le mode temporel pourrait fonctionner pour vous, mais vous devrez apporter les modifications suivantes. Fondamentalement, Keras ne supporte pas les poids 3D, donc vous devez aplatir vos images 64x64 à l'entrée, et remodeler votre tenseur en 2D avant les couches convolutives.

1) remodeler sample_weight à 634,4096

2) ajouter une couche d'entrée qui accepte une image aplatie 4096 pixels de long: Keras va maintenant accepter par poids de pixels, en considérant les pixels en tant que séquence temporelle (a 1D signal)

3) ajouter une couche Reshape avant la première convolution 2D