proc cas;
/* 1. Création du modèle vide */
deepLearn.buildModel / modelTable={name="MonCNN", replace=true} type="CNN";
/* TYPE 1 : INPUT (La porte d'entrée - Dimensions fixes) */
deepLearn.addLayer / modelTable="MonCNN", name="L_Input",
layer={type="INPUT", nChannels=1, width=28, height=28};
/* TYPE 2 : CONVO (Extraction de features - Filtres requis) */
deepLearn.addLayer / modelTable="MonCNN", name="L_Convo_1",
srcLayers={"L_Input"},
layer={
type="CONVO", /* Type Convolution */
nFilters=32, /* Nombre de feature maps */
width=3, height=3, /* Taille du Kernel (3x3) */
act="RELU"
};
/* TYPE 3 : POOL (Réduction de dimension - Fenêtre requise) */
deepLearn.addLayer / modelTable="MonCNN", name="L_Pool_1",
srcLayers={"L_Convo_1"},
layer={
type="POOL", /* Type Pooling */
pool="MAX", /* Méthode (Max Pooling) */
width=2, height=2, stride=2
};
/* TYPE 4 : FULLCONNECT (Classification - Nombre de neurones requis) */
deepLearn.addLayer / modelTable="MonCNN", name="L_Dense",
srcLayers={"L_Pool_1"},
layer={
type="FULLCONNECT", /* Type Dense/Fully Connected */
n=128, /* Nombre de neurones cachés */
act="RELU"
};
/* TYPE 5 : OUTPUT (Probabilités - Fonction d'activation finale) */
deepLearn.addLayer / modelTable="MonCNN", name="L_Output",
srcLayers={"L_Dense"},
layer={type="OUTPUT", act="SOFTMAX"};
/* Résumé de l'architecture hétérogène */
deepLearn.modelInfo / modelTable="MonCNN";
quit;
deepLearn