?>Array ( [lang] => fr [id] => 117 ) Scénario Complexe : Réseau Siamois avec Poids Partagés pour la Vérification de Signatures - WeAreCAS
deepLearn addLayer

Scénario Complexe : Réseau Siamois avec Poids Partagés pour la Vérification de Signatures

Scénario de test & Cas d'usage

Contexte Métier

Une banque veut développer un système pour vérifier l'authenticité des signatures des clients en comparant une signature entrante à une signature de référence. Ce scénario teste la construction d'une architecture avancée, un réseau siamois, qui utilise deux branches de traitement identiques avec des poids partagés (`sharingWeights`) et des connexions multiples (`srcLayers`).
Préparation des Données

Aucune donnée n'est nécessaire. Ce scénario se concentre sur la capacité de `addLayer` à construire un graphe de calcul non séquentiel et à gérer le partage de poids entre les couches.

Copié !
1/* Pas de données requises. Le test porte sur la construction d'une architecture complexe. */

Étapes de réalisation

1
Initialisation du modèle et création de deux couches d'entrée distinctes, une pour chaque image de signature ('signature_A' et 'signature_B').
Copié !
1PROC CAS;
2DEEPLEARN.buildModel / model={name='reseau_siamois', replace=true}, type='CNN';
3DEEPLEARN.addLayer / modelTable={name='reseau_siamois'}, name='signature_A', layer={type='input', nchannels=1, width=105, height=105};
4DEEPLEARN.addLayer / modelTable={name='reseau_siamois'}, name='signature_B', layer={type='input', nchannels=1, width=105, height=105};
5QUIT;
2
Construction de la première branche (A) du réseau : une couche de convolution suivie d'un pooling.
Copié !
1PROC CAS;
2DEEPLEARN.addLayer / modelTable={name='reseau_siamois'}, name='conv1_A', layer={type='convolution', nFilters=64, width=10, act='relu'}, srcLayers={'signature_A'};
3DEEPLEARN.addLayer / modelTable={name='reseau_siamois'}, name='pool1_A', layer={type='pooling', width=2, pool='max'}, srcLayers={'conv1_A'};
4QUIT;
3
Construction de la seconde branche (B) en spécifiant que ses couches doivent partager les poids de la branche A via le paramètre `sharingWeights`.
Copié !
1PROC CAS;
2DEEPLEARN.addLayer / modelTable={name='reseau_siamois'}, name='conv1_B', layer={type='convolution', nFilters=64, width=10, act='relu'}, srcLayers={'signature_B'}, sharingWeights='conv1_A';
3DEEPLEARN.addLayer / modelTable={name='reseau_siamois'}, name='pool1_B', layer={type='pooling', width=2, pool='max'}, srcLayers={'conv1_B'}, sharingWeights='pool1_A';
4QUIT;
4
Ajout d'une couche de concaténation pour fusionner les sorties des deux branches, en spécifiant plusieurs couches dans `srcLayers`.
Copié !
1PROC CAS;
2DEEPLEARN.addLayer / modelTable={name='reseau_siamois'}, name='concat', layer={type='concat'}, srcLayers={'pool1_A', 'pool1_B'};
3QUIT;
5
Ajout de la couche de sortie finale pour calculer un score de similarité.
Copié !
1PROC CAS;
2DEEPLEARN.addLayer / modelTable={name='reseau_siamois'}, name='sortie_similarite', layer={type='output', n=1, act='sigmoid'}, srcLayers={'concat'};
3QUIT;

Résultat Attendu


La structure du modèle 'reseau_siamois' doit être un graphe non linéaire. Il doit contenir deux branches parallèles partant de 'signature_A' et 'signature_B'. Les couches 'conv1_B' et 'pool1_B' doivent indiquer qu'elles partagent leurs poids avec 'conv1_A' et 'pool1_A' respectivement. La couche 'concat' doit avoir deux couches parentes ('pool1_A', 'pool1_B'). Le test réussit si cette architecture complexe est créée sans erreur.