IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scilab Discussion :

MNIST ConvNet : Comment charger et formater les données?


Sujet :

Scilab

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Chine

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2019
    Messages : 6
    Points : 5
    Points
    5
    Par défaut MNIST ConvNet : Comment charger et formater les données?
    Bonjour! Je débute avec Scilab (j ai seulement fait quelques programmes simples), et je ui quelques connaissances de base en programmation (un peu de C++, un peu de Python). J essaye de créer, pour un projet de classe, un réseau de neurones convolutif capable de reconnaitre les chiffres de la base de données MNIST (http://yann.lecun.com/exdb/mnist/). J utilise pour ça cette vidéo (en anglais :
    ) qui est un tutoriel pour Matlab. Je n arrive par contre absolument pas à comprendre comment les fonctions loadMNISTImages et loadMNISTLabels fonctionne (voir screenshots ou vidéo à 14:10 et 15:30), en particulier pour la fonction fopen, dont l équivalent me parait etre mget, mais mget utilise des arguments différents... Quelqu un peut m aider ?
    Images attachées Images attachées  

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    L'équivalent de la fonction MATLAB fopen est mopen
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Chine

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2019
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Mince... Autant pour moi, je parlais de fread, pas fopen... Le wiki de Scilab m'indique qu'il est déconseillé d'utiliser la fonction mtlb_fread, mais je doit avouer que je n ai aucune idee de comment sont stockées les données sur le fichier MNIST,ni de comment fonctionne mget, et que j aimerai donc me permettre de reproduire betement cette partie du programme, puis de manipuler apres le reste, une fois que j ai mais images sous la forme de vecteurs bien propre, mais je ne sais pas du tout comment traduire ca...

    Accessoirement, je ne comprend pas quelle différence il y a entre les lignes 7,8 et 9 de la fonction LoadMNISTImages... À part le nom dans laquelle ce qui est lu est stocké, la séquence d'appelle de fread est strictement identique... enfin bon... en résumé, si quelqu'un est capable de m'expliquer le fonctionnement de la fonction fread et de mget, j en serai ravi...

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Voici la traduction du code MATLAB en Scilab :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    function images = loadMNISTImages(filename)
     
        fd = mopen(filename, 'r')
     
        magic = mget(1, 'ib', fd)
        numImages = mget(1, 'ib', fd)
        numRows = mget(1, 'ib', fd)
        numCols = mget(1, 'ib', fd)
     
        images = mgeti(numImages*numRows*numCols, 'c', fd)
     
        mclose(fd)
     
        images = matrix(images, numCols, numRows, numImages)
     
        images = permute(images, [2 1 3])
     
        images = matrix(images, size(images, 1),  size(images, 2), size(images, 3))
     
        images = double(images)/255
     
    endfunction
    Par contre, la fonction mget/mgeti n'arrive pas à lire correctement les données des images. Je suis bloqué à 159 valeurs lues (avec le fichier train-images.idx3-ubyte) alors que le code MATLAB fonctionne correctement.

    Bizarre
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Chine

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2019
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Raah. j arrive meme pas à faire fonctionner le truc j ai un message dérreur sur la ligne 3 de ton code quand j essaie de le lancer avec cette ligne depuis un autre programme...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    images = loadMNISTImages ('MNIST/t10k-images-idx3-ubyte');
    Enfin bon... Si je suis à ce niveau de galère, ca me parait difficile de continuer de maniere correcte... Merci Beaucoup en tout cas d'avoir répondu aussi vite...

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Citation Envoyé par Jerome Briot Voir le message
    Par contre, la fonction mget/mgeti n'arrive pas à lire correctement les données des images. Je suis bloqué à 159 valeurs lues (avec le fichier train-images.idx3-ubyte) alors que le code MATLAB fonctionne correctement.

    Bizarre
    OK, le bug semble corrigé par l'équipe de développement et le code ci-dessus devrait donc fonctionner avec la prochaine version 6.0.2

    En attendant, il faut télécharger et installer la version Nightly Build : https://build.scilab.org/view/Scilab%20binaries/
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Citation Envoyé par EloiBr Voir le message
    images = loadMNISTImages ('MNIST/t10k-images-idx3-ubyte');
    Comme ceci peut être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    images = loadMNISTImages ('./MNIST/t10k-images-idx3-ubyte');
    Ou alors en mettant le chemin complet vers le fichier
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Chine

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2019
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Pas de chance d'etre tombé sur ce bug du coup... En tout cas, je suis toujours épaté par la réactivité des gens sur ce genre de forum! Merci!
    Je ne comprends pas ou est le lien vers la version 6.0.2 sur le site qu indique le lien...

    Tiens, tant que j'y pense, la citation, ca vient de Tom sawyer? Parcque le vieux Jim et Huck m y font pensé, mais que je ne me rapelle pas de lóccasion ou cette phrase est prononcée

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Citation Envoyé par EloiBr Voir le message
    Je ne comprends pas ou est le lien vers la version 6.0.2 sur le site qu indique le lien...
    Tu cliques sur la version correspondant au système d'exploitation dans la colonne "Nom du projet", puis sur le lien en dessous de "Derniers artefacts obtenus avec succès" sur la page qui s'ouvre.

    Par exemple pour Windows 64bits : https://build.scilab.org/view/Scilab....0-windows-64/ puis https://build.scilab.org/view/Scilab...ch-6.0_x64.exe
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Chine

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2019
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Ah... bah c est bien ce que j avait fait, mais j etait retomber sur une version 6.0.1, alors que la, elle est en train de s'installer, mais je croit que c est bien la 6.0.2... Je sais pas, elle a peut etre etee upload entre temps (je suis sur la version 32 bit (pas le temps de monter mon nouveau PC arrive y a 2 jours, je pleure, y a un R52600 et une 2080 qui m attendent, mais vu que je doit rendre ca au plus vite, et que j en ai pas fondamentalement besoin, bah difficile de justifier la journee que j y perdrai...

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Chine

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2019
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Voila le resultat apres quelques jour de boulot. Merci encore pour l aide. Je compte encore rajouter quelques fonction permettant d'afficher les images, et resultat de pooling d une maniere plus propre que des matrices.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    function [y]=ReLU(x)                                                              //RELU FUNCTION
        y= max(0,x)
    endfunction
     
     
    function [y]= Softmax(x)                                                          //SOFTMAX FUNCTION
        ex =  exp(x);
        y = ex/sum(ex);
    endfunction
     
     
    function [y] = Pool(x)                                                            // POOLING FUNCTION
        [xrow,xcol,numFilters] = size(x);
        y= zeros (xrow/2,xcol/2,numFilters);
     
        for k=1:numFilters
            filt = ones(2,2)/(2*2)
            image = conv2(x(:,:,k),filt, 'valid');
            [irow,icol,numFilters] = size(image);
            y(:,:,k) = image (1:2:irow,1:2:icol)
        end
     
    endfunction
     
     
    function [y] = Convo(x,W)                                                         // CONVOLUTION FUNCTION
     
        [wrow,wcol,numFilters] = size(W);
        [xrow,xcol] = size(x);
        yrow = xrow-wrow+1;
        ycol = xcol-wcol+1;
         y = zeros (yrow,ycol,numFilters);
     
    for k = 1:numFilters
        filt = W(:,:,k);
        //disp (filt)
        filt = filt(wrow:-1:1,wcol:-1:1)
        //disp(size(y))
        y(:,:,k) = conv2 (x,filt,'valid')
    end
     
    end
     
     
    function images = loadMNISTImages(filename)                                    //MNIST DATASET IMAGES LOADING FUNCTION
     
        fd = mopen(filename, 'r')
     
        magic = mget(1, 'ib', fd)                                                  //Be sure to use the right name and path to the file
        numImages = mget(1, 'ib', fd)
        numRows = mget(1, 'ib', fd)
        numCols = mget(1, 'ib', fd)
        images = mgeti(numImages*numRows*numCols, 'uc', fd)
     
        mclose(fd)
     
       images = matrix(images, numCols, numRows, numImages)
     
        images = permute(images, [2 1 3])
     
        images = matrix(images,size(images, 1),size(images, 2),size(images, 3))
     
        images = double(images)/255
     
     
    endfunction
     
     
    function labels= loadMNISTLabels(filename)                                    // MNIST DATASET LABELS LOADING FUNCTION
     
    fd = mopen (filename,'r')
     
    magic =  mget(1, 'ib', fd)                                                    //Be sure to use the right name and path to the file
    numLabels =  mget(1, 'ib', fd)
    labels = mget (numLabels,'uc',fd)
     
    mclose(fd)
     
    endfunction
     
     
    function [W1,W5,Wo]= MNISTConv (W1,W5, Wo, X, D)                               //TRAINING FUNCTION
        alpha = 0.01;
        bet = 0.95;
     
        momentum1 = zeros (9,9,20);
        momentum5 = zeros (100,2000);
        momentumo = zeros (10,100);
     
        N = length(D);
     
        bsize=100;                                                                //setting a batch size
        blist=1:bsize:(N-bsize+1);                                                //finding all the starting indice of the different batchs
     
        for batch = 1:length(blist)
            disp(batch)                                                           //keeping the user updated about the number of the current batch
            dW1 = zeros(9,9,20);
            dW5 = zeros(100,2000);
            dWo = zeros(10,100);
     
            begin = blist(batch);
            for k= begin:begin+bsize-1                                            //propagation
                x = X(:,:,k);
                y1 = Convo(x,W1);
                y2 = ReLU (y1);
                y3 = Pool (y2);
                y4 = matrix (y3,-1,1);
                v5 = W5*y4;
                y5 = ReLU(v5);
                v = Wo*y5;
                y = Softmax(v);
     
                d = zeros (10,1);                                                 //comparing to expected result
                d(sub2ind(size(d),D(k),1))=1;
     
                e=d-y;                                                            //calculating error vector
                delta =e;
                e5= Wo'*delta;
                delta5 = (y5 > 0) .*e5;                                           //backpropagation
                e4 = W5'*delta5;
                e3 = matrix(e4,size(y3));
                e2 = zeros(20,20,20);
                W3 = ones (20,20,20)/(2*2);
     
                for c = 1:20
                e2(:,:,c) = e3(:,:,c).*.ones(2,2)
                    e2(:,:,c) = e2(:,:,c).*W3(:,:,c);
                end
     
                delta2 = (y2 > 0).*e2;
     
                delta1_x = zeros(9,9,20);
                rotdelta2= delta2(20:-1:1,20:-1:1,:)
                for c=1:20
     
                    delta1_x(:,:,c)= conv2(x(:,:), rotdelta2(:,:,c),'valid');
     
                end
     
                dW1 = dW1 + delta1_x;                                            //saving the error vector in an error "batch pool"
                dW5 = dW5 + delta5*y4';
                dWo = dWo + delta *y5';
     
            end
     
            dW1 = dW1 / bsize;                                                   //creating a "batch error vector"
            dW5 = dW5 / bsize;
            dWo = dWo / bsize;
     
            momentum1 = alpha*dW1 + bet*momentum1;                               //applying it
            W1 = W1+ momentum1;
     
            momentum5 = alpha*dW5 + bet*momentum5;
            W5 = W5+ momentum5;
     
            momentumo = alpha*dWo + bet*momentumo;
            Wo = Wo+ momentumo;
        end
    endfunction
     
                                                                                    //PROGRAM
    Images = loadMNISTImages('t10k-images.idx3-ubyte');         //Loading training images 
    Images = matrix (Images,28,28,-1);
     
    Labels = loadMNISTLabels('t10k-labels.idx1-ubyte')          //Loading traininn images labels
    Labels (Labels == 0) = 10
     
    W1 = 2*rand(9,9,20)-1                                       //Randomly asigning wheight to convolution filters, and Neural connection
    W5= (2*rand(100,2000)-1) * sqrt(6)/sqrt(360+2000);
    Wo = (2*rand(10,100) -1) * sqrt(6)/sqrt(10 + 100);
     
    X = Images(:,:, 1:8000);                                    //Selecting the first 8000 images for training
    D = Labels(1:8000);
     
    for epoch =1:3
        disp('\\\\\',epoch, '/////')                            //Training the network by using the training function. 
        [W1,W5,Wo] = MNISTConv (W1,W5,Wo,X,D);                  //Inputs are the weigths, Images and Labels, 
                                                                //Output are the new weights, that we will send again in the  next epoch, or test.
     
    end
     
     
    X = Images(:,:, 8001:10000);                                //Selecting the last 2000 images we didn't use to use them as a test for the network
    D = Labels(8001:10000);                                     //Same for the labels
    acc = 0;
    N = length(D);
     
    disp('test')                                                //Beginning of the test
    for k= 1:N
        x = X(:,:,k);                                           //Propagation
        y1 = Convo(x,W1);
        y2 = ReLU(y1);
        y3 = Pool (y2);
        y4 = matrix (y3, -1, 1);
        v5 = W5*y4;
        y5 = ReLU(v5);
        v = Wo*y5;
        y = Softmax (v);
     
        [m,i ]= max(y);                                          //Calculating accuracy
        if i == D(k)
            acc = acc+1;
        end
    end
       acc = acc/N;
      disp ('accuracy is')                                       //Dysplaying accuracy
      disp (acc);
    PS: Ne fonctionne que sous SciLab 6.0.2.

  12. #12
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Citation Envoyé par Jerome Briot Voir le message
    OK, le bug semble corrigé par l'équipe de développement et le code ci-dessus devrait donc fonctionner avec la prochaine version 6.0.2

    En attendant, il faut télécharger et installer la version Nightly Build : https://build.scilab.org/view/Scilab%20binaries/
    Le bug de lecture est effectivement corrigé sur la nouvelle version 6.0.2 de Scilab disponible directement sur la page de téléchargement : https://www.scilab.org/download/6.0.2
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/06/2008, 20h33
  2. Réponses: 9
    Dernier message: 12/06/2008, 15h37
  3. Réponses: 2
    Dernier message: 09/03/2007, 16h24
  4. Réponses: 6
    Dernier message: 01/08/2006, 16h23
  5. Réponses: 4
    Dernier message: 04/12/2003, 08h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo