NeuralNetworks 0.1.11__tar.gz → 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. neuralnetworks-0.2.0/PKG-INFO +190 -0
  2. neuralnetworks-0.2.0/README.md +160 -0
  3. {neuralnetworks-0.1.11 → neuralnetworks-0.2.0}/pyproject.toml +5 -2
  4. {neuralnetworks-0.1.11 → neuralnetworks-0.2.0}/src/NeuralNetworks/Dependances.py +2 -14
  5. neuralnetworks-0.2.0/src/NeuralNetworks/Latent.py +51 -0
  6. {neuralnetworks-0.1.11 → neuralnetworks-0.2.0}/src/NeuralNetworks/MLP.py +171 -161
  7. {neuralnetworks-0.1.11 → neuralnetworks-0.2.0}/src/NeuralNetworks/__init__.py +7 -8
  8. neuralnetworks-0.2.0/src/NeuralNetworks/tools/AirfRANS.py +36 -0
  9. neuralnetworks-0.2.0/src/NeuralNetworks/tools/MNIST.py +118 -0
  10. neuralnetworks-0.2.0/src/NeuralNetworks/tools/VKI-LS59.py +7 -0
  11. neuralnetworks-0.2.0/src/NeuralNetworks/tools/image.py +249 -0
  12. neuralnetworks-0.2.0/src/NeuralNetworks.egg-info/PKG-INFO +190 -0
  13. {neuralnetworks-0.1.11 → neuralnetworks-0.2.0}/src/NeuralNetworks.egg-info/SOURCES.txt +5 -2
  14. {neuralnetworks-0.1.11 → neuralnetworks-0.2.0}/src/NeuralNetworks.egg-info/requires.txt +3 -0
  15. {neuralnetworks-0.1.11 → neuralnetworks-0.2.0}/tests/test_MLP.py +9 -21
  16. neuralnetworks-0.1.11/PKG-INFO +0 -146
  17. neuralnetworks-0.1.11/README.md +0 -119
  18. neuralnetworks-0.1.11/src/NeuralNetworks/Image.py +0 -105
  19. neuralnetworks-0.1.11/src/NeuralNetworks/Plot.py +0 -324
  20. neuralnetworks-0.1.11/src/NeuralNetworks.egg-info/PKG-INFO +0 -146
  21. {neuralnetworks-0.1.11 → neuralnetworks-0.2.0}/LICENSE +0 -0
  22. {neuralnetworks-0.1.11 → neuralnetworks-0.2.0}/setup.cfg +0 -0
  23. {neuralnetworks-0.1.11 → neuralnetworks-0.2.0}/src/NeuralNetworks.egg-info/dependency_links.txt +0 -0
  24. {neuralnetworks-0.1.11 → neuralnetworks-0.2.0}/src/NeuralNetworks.egg-info/top_level.txt +0 -0
@@ -0,0 +1,190 @@
1
+ Metadata-Version: 2.4
2
+ Name: NeuralNetworks
3
+ Version: 0.2.0
4
+ Summary: Multi-Layer Perceptrons with multi-Fourier encoding, variable learning rate, visualization and PyTorch compilation
5
+ Author-email: Alexandre Brun <alexandre51160@gmail.com>
6
+ License: GPL-3.0-or-later
7
+ Project-URL: Documentation, https://xxxfetraxxx.github.io/NeuralNetworks/
8
+ Project-URL: Source, https://github.com/xXxFetraxXx/NeuralNetworks
9
+ Classifier: Programming Language :: Python :: 3
10
+ Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
11
+ Classifier: Operating System :: OS Independent
12
+ Requires-Python: >=3.9
13
+ Description-Content-Type: text/markdown
14
+ License-File: LICENSE
15
+ Requires-Dist: numpy>=1.25
16
+ Requires-Dist: matplotlib>=3.10
17
+ Requires-Dist: tqdm>=4.66
18
+ Requires-Dist: torch<3.0,>=2.9.1
19
+ Requires-Dist: torchvision<1.0,>=0.24
20
+ Requires-Dist: torchaudio<3.0,>=2.9
21
+ Requires-Dist: torchmetrics>=1.8
22
+ Requires-Dist: visualtorch>=0.2
23
+ Requires-Dist: random-fourier-features-pytorch>=1.0
24
+ Requires-Dist: IPython>=8.16
25
+ Requires-Dist: requests
26
+ Requires-Dist: airfrans
27
+ Requires-Dist: scipy
28
+ Requires-Dist: pandas
29
+ Dynamic: license-file
30
+
31
+ # NeuralNetworks Module
32
+
33
+ Module complet pour la création, l'entraînement et la visualisation de Multi-Layer Perceptrons (MLP)
34
+ avec encodage optionnel Fourier, gestion automatique des pertes, compilation Torch et outils
35
+ de traitement d'images pour l'apprentissage sur des images RGB.
36
+
37
+ ---
38
+
39
+ ## Contenu principal
40
+
41
+ ### Classes
42
+
43
+ #### MLP
44
+
45
+ Multi-Layer Perceptron (MLP) avec options avancées :
46
+
47
+ - Encodage Fourier gaussien (RFF) optionnel
48
+ - Stockage automatique des pertes
49
+ - Compilation Torch optionnelle pour accélérer l’inférence
50
+ - Gestion flexible de l’optimiseur, de la fonction de perte et de la normalisation
51
+
52
+ **Méthodes principales :**
53
+
54
+ - `MLP(layers, learning_rate, Fourier, optim, crit, norm, name, Iscompiled)`
55
+ Initialise le réseau avec toutes les options.
56
+
57
+ Les valeurs possibles de `optim` sont disponibles avec `optims()`
58
+ Les valeurs possibles de `crit` sont disponibles avec `crits()`
59
+ Les valeurs possibles de `norm` sont disponibles avec `norms()`
60
+
61
+ - `train(inputs, outputs, num_epochs, batch_size)`
62
+ Entraîne le MLP sur des données (`inputs → outputs`) en utilisant AMP et mini-batchs.
63
+
64
+ - `plot(inputs, img_array)`
65
+ Affiche l'image originale, la prédiction du MLP et la courbe des pertes.
66
+
67
+ - `params()`
68
+ Retourne tous les poids du MLP (ligne par ligne) sous forme de liste de `numpy.ndarray`.
69
+
70
+ - `nb_params()`
71
+ Calcule le nombre total de poids dans le MLP.
72
+
73
+ - `neurons()`
74
+ Retourne la liste des biais (neurones) de toutes les couches linéaires.
75
+
76
+ ---
77
+
78
+ ### Fonctions utilitaires
79
+
80
+ - `tensorise(obj)`
81
+ Convertit un objet array-like ou tensor en `torch.Tensor` float32 sur le device actif.
82
+
83
+ - `rglen(list)`
84
+ Renvoie un range correspondant aux indices d'une liste.
85
+
86
+ - `image_from_url(url, img_size)`
87
+ Télécharge une image depuis une URL, la redimensionne et génère :
88
+ - `img_array` : `np.ndarray (H, W, 3)` pour affichage.
89
+ - `inputs` : tenseur `(H*W, 2)` coordonnées normalisées.
90
+ - `outputs` : tenseur `(H*W, 3)` valeurs RGB cibles.
91
+
92
+ ---
93
+
94
+ ### Visualisation et comparaison
95
+
96
+ - `plot(img_array, inputs, *nets)`
97
+ Affiche pour chaque réseau l'image reconstruite à partir des entrées.
98
+
99
+ - `compare(img_array, inputs, *nets)`
100
+ Affiche pour chaque réseau l'erreur absolue entre l'image originale et la prédiction,
101
+ et trace également les pertes cumulées. Chaque réseau doit posséder :
102
+
103
+ ---
104
+
105
+ ### Objets et dictionnaires
106
+
107
+ #### **norms()**
108
+
109
+ | **Valeurs** | **Module PyTorch** | **Description** |
110
+ |---------------------|---------------------------|-----------------------------------------------------------------------------------------------------------|
111
+ | **"Relu"** | `nn.ReLU()` | Fonction d'activation ReLU classique (Rectified Linear Unit). |
112
+ | **"LeakyRelu"** | `nn.LeakyReLU()` | ReLU avec un petit coefficient pour les valeurs négatives (paramètre `negative_slope`). |
113
+ | **"ELU"** | `nn.ELU()` | Fonction d'activation ELU (Exponential Linear Unit), qui a une meilleure gestion des valeurs négatives. |
114
+ | **"SELU"** | `nn.SELU()` | SELU (Scaled Exponential Linear Unit), une version améliorée de l'ELU pour des réseaux auto-normalisants. |
115
+ | **"GELU"** | `nn.GELU()` | GELU (Gaussian Error Linear Unit), une activation probabiliste basée sur une fonction gaussienne. |
116
+ | **"Sigmoid"** | `nn.Sigmoid()` | Fonction d'activation Sigmoid, qui produit une sortie entre 0 et 1. |
117
+ | **"Tanh"** | `nn.Tanh()` | Fonction d'activation Tanh, avec une sortie dans l'intervalle [-1, 1]. |
118
+ | **"Hardtanh"** | `nn.Hardtanh()` | Variante de Tanh, avec des sorties limitées entre une plage spécifiée. |
119
+ | **"Softplus"** | `nn.Softplus()` | Fonction d'activation qui approxime ReLU mais de manière lissée. |
120
+ | **"Softsign"** | `nn.Softsign()` | Fonction d'activation similaire à Tanh mais plus souple, avec des valeurs dans [-1, 1]. |
121
+
122
+ ---
123
+
124
+ #### **crits()**
125
+
126
+ | **Valeurs** | **Module PyTorch** | **Description** |
127
+ |--------------------------------|-------------------------------------|----------------------------------------------------------------------------------------------------------------------------|
128
+ | **"MSE"** | `nn.MSELoss()` | Mean Squared Error Loss, utilisée pour les régressions. |
129
+ | **"L1"** | `nn.L1Loss()` | L1 Loss (erreur absolue), souvent utilisée pour la régularisation. |
130
+ | **"SmoothL1"** | `nn.SmoothL1Loss()` | Smooth L1 Loss, une combinaison de L1 et de MSE, moins sensible aux outliers. |
131
+ | **"Huber"** | `nn.HuberLoss()` | Fonction de perte Huber, une version lissée de L1 et MSE, moins affectée par les grands écarts. |
132
+ | **"CrossEntropy"** | `nn.CrossEntropyLoss()` | Perte de Cross-Entropy, utilisée pour les problèmes de classification multi-classes. |
133
+ | **"KLDiv"** | `nn.KLDivLoss()` | Perte de divergence de Kullback-Leibler, souvent utilisée pour des modèles probabilistes. |
134
+ | **"PoissonNLL"** | `nn.PoissonNLLLoss()` | Perte de log-vraisemblance pour une distribution de Poisson, utilisée pour la modélisation de comptages. |
135
+ | **"MultiLabelSoftMargin"** | `nn.MultiLabelSoftMarginLoss()` | Perte utilisée pour les problèmes de classification multi-étiquettes. |
136
+
137
+ ---
138
+
139
+ #### **optims()**
140
+
141
+ | **Valeurs** | **Module PyTorch** | **Description** |
142
+ |---------------------|--------------------------------------|------------------------------------------------------------------------------------------------------------------------------------|
143
+ | **"Adadelta"** | `optim.Adadelta()` | Optimiseur Adadelta, basé sur les gradients adaptatifs, sans nécessité de réglage du taux d'apprentissage. |
144
+ | **"Adafactor"** | `optim.Adafactor()` | Optimiseur Adafactor, variant d'Adam avec une mise à jour plus efficace de la mémoire pour de grands modèles. |
145
+ | **"Adam"** | `optim.Adam()` | Optimiseur Adam, utilisant un gradient stochastique adaptatif avec des moyennes mobiles des gradients et des carrés des gradients. |
146
+ | **"AdamW"** | `optim.AdamW()` | Optimiseur Adam avec une régularisation L2 (weight decay) distincte, plus efficace que `Adam` avec `weight_decay`. |
147
+ | **"Adamax"** | `optim.Adamax()` | Version d'Adam utilisant une norme infinie pour les gradients, plus stable pour certaines configurations. |
148
+ | **"ASGD"** | `optim.ASGD()` | Optimiseur ASGD (Averaged Stochastic Gradient Descent), utilisé pour de grandes données avec une moyenne des gradients. |
149
+ | **"NAdam"** | `optim.NAdam()` | Optimiseur NAdam, une version améliorée d'Adam avec une adaptation des moments de second ordre. |
150
+ | **"RAdam"** | `optim.RAdam()` | Optimiseur RAdam, une version robuste de l'Adam qui ajuste dynamiquement les moments pour stabiliser l'entraînement. |
151
+ | **"RMSprop"** | `optim.RMSprop()` | Optimiseur RMSprop, utilisant une moyenne mobile des carrés des gradients pour réduire les oscillations. |
152
+ | **"Rprop"** | `optim.Rprop()` | Optimiseur Rprop, basé sur les mises à jour des poids indépendantes des gradients. |
153
+ | **"SGD"** | `optim.SGD()` | Descente de gradient stochastique classique, souvent utilisée avec un taux d'apprentissage constant ou ajusté. |
154
+
155
+ ---
156
+
157
+ ### Device et configuration
158
+
159
+ #### **Apple Silicon (macOS)**
160
+ - Si le système d'exploitation est macOS (nommé `darwin` dans `platform.system()`), la fonction vérifie si l'accélérateur **Metal Performance Shaders** (MPS) est disponible sur l'appareil.
161
+ - Si MPS est disponible (`torch.backends.mps.is_available()`), l'appareil cible sera défini sur **MPS** (c'est un équivalent de CUDA pour les appareils Apple Silicon).
162
+
163
+ #### **Windows**
164
+ - Si le système d'exploitation est Windows, la fonction vérifie d'abord si **CUDA** (NVIDIA) est disponible avec `torch.cuda.is_available()`. Si c'est le cas, le périphérique sera défini sur **CUDA**.
165
+
166
+ #### **Linux**
167
+ - Si le système d'exploitation est Linux, plusieurs vérifications sont effectuées :
168
+ 1. **CUDA** (NVIDIA) : Si `torch.cuda.is_available()` renvoie `True`, le périphérique sera défini sur **CUDA**.
169
+ 2. **ROCm** (AMD) : Si le système supporte **ROCm** via `torch.backends.hip.is_available()`, l'appareil sera défini sur **CUDA** (ROCm est utilisé pour les cartes AMD dans le cadre de l'API CUDA).
170
+ 3. **Intel oneAPI / XPU** : Si le système prend en charge **Intel oneAPI** ou **XPU** via `torch.xpu.is_available()`, le périphérique sera défini sur **XPU**.
171
+
172
+ #### **Système non reconnu**
173
+ - Si aucune des conditions ci-dessus n'est remplie, la fonction retourne **CPU** comme périphérique par défaut.
174
+
175
+ ---
176
+
177
+ ### Paramètres matplotlib et PyTorch
178
+
179
+ - Style global pour fond transparent et texte gris
180
+ - Optimisations CUDA activées pour TF32, matmul et convolutions
181
+ - Autograd configuré pour privilégier les performances
182
+
183
+ ---
184
+
185
+ ### Notes générales
186
+
187
+ - Toutes les méthodes de MLP utilisent les tenseurs sur le device global (CPU ou GPU)
188
+ - Les images doivent être normalisées entre 0 et 1
189
+ - Les fonctions interactives (`plot`, `compare`) utilisent matplotlib en mode interactif
190
+ - Le module est conçu pour fonctionner dans Jupyter et scripts Python classiques
@@ -0,0 +1,160 @@
1
+ # NeuralNetworks Module
2
+
3
+ Module complet pour la création, l'entraînement et la visualisation de Multi-Layer Perceptrons (MLP)
4
+ avec encodage optionnel Fourier, gestion automatique des pertes, compilation Torch et outils
5
+ de traitement d'images pour l'apprentissage sur des images RGB.
6
+
7
+ ---
8
+
9
+ ## Contenu principal
10
+
11
+ ### Classes
12
+
13
+ #### MLP
14
+
15
+ Multi-Layer Perceptron (MLP) avec options avancées :
16
+
17
+ - Encodage Fourier gaussien (RFF) optionnel
18
+ - Stockage automatique des pertes
19
+ - Compilation Torch optionnelle pour accélérer l’inférence
20
+ - Gestion flexible de l’optimiseur, de la fonction de perte et de la normalisation
21
+
22
+ **Méthodes principales :**
23
+
24
+ - `MLP(layers, learning_rate, Fourier, optim, crit, norm, name, Iscompiled)`
25
+ Initialise le réseau avec toutes les options.
26
+
27
+ Les valeurs possibles de `optim` sont disponibles avec `optims()`
28
+ Les valeurs possibles de `crit` sont disponibles avec `crits()`
29
+ Les valeurs possibles de `norm` sont disponibles avec `norms()`
30
+
31
+ - `train(inputs, outputs, num_epochs, batch_size)`
32
+ Entraîne le MLP sur des données (`inputs → outputs`) en utilisant AMP et mini-batchs.
33
+
34
+ - `plot(inputs, img_array)`
35
+ Affiche l'image originale, la prédiction du MLP et la courbe des pertes.
36
+
37
+ - `params()`
38
+ Retourne tous les poids du MLP (ligne par ligne) sous forme de liste de `numpy.ndarray`.
39
+
40
+ - `nb_params()`
41
+ Calcule le nombre total de poids dans le MLP.
42
+
43
+ - `neurons()`
44
+ Retourne la liste des biais (neurones) de toutes les couches linéaires.
45
+
46
+ ---
47
+
48
+ ### Fonctions utilitaires
49
+
50
+ - `tensorise(obj)`
51
+ Convertit un objet array-like ou tensor en `torch.Tensor` float32 sur le device actif.
52
+
53
+ - `rglen(list)`
54
+ Renvoie un range correspondant aux indices d'une liste.
55
+
56
+ - `image_from_url(url, img_size)`
57
+ Télécharge une image depuis une URL, la redimensionne et génère :
58
+ - `img_array` : `np.ndarray (H, W, 3)` pour affichage.
59
+ - `inputs` : tenseur `(H*W, 2)` coordonnées normalisées.
60
+ - `outputs` : tenseur `(H*W, 3)` valeurs RGB cibles.
61
+
62
+ ---
63
+
64
+ ### Visualisation et comparaison
65
+
66
+ - `plot(img_array, inputs, *nets)`
67
+ Affiche pour chaque réseau l'image reconstruite à partir des entrées.
68
+
69
+ - `compare(img_array, inputs, *nets)`
70
+ Affiche pour chaque réseau l'erreur absolue entre l'image originale et la prédiction,
71
+ et trace également les pertes cumulées. Chaque réseau doit posséder :
72
+
73
+ ---
74
+
75
+ ### Objets et dictionnaires
76
+
77
+ #### **norms()**
78
+
79
+ | **Valeurs** | **Module PyTorch** | **Description** |
80
+ |---------------------|---------------------------|-----------------------------------------------------------------------------------------------------------|
81
+ | **"Relu"** | `nn.ReLU()` | Fonction d'activation ReLU classique (Rectified Linear Unit). |
82
+ | **"LeakyRelu"** | `nn.LeakyReLU()` | ReLU avec un petit coefficient pour les valeurs négatives (paramètre `negative_slope`). |
83
+ | **"ELU"** | `nn.ELU()` | Fonction d'activation ELU (Exponential Linear Unit), qui a une meilleure gestion des valeurs négatives. |
84
+ | **"SELU"** | `nn.SELU()` | SELU (Scaled Exponential Linear Unit), une version améliorée de l'ELU pour des réseaux auto-normalisants. |
85
+ | **"GELU"** | `nn.GELU()` | GELU (Gaussian Error Linear Unit), une activation probabiliste basée sur une fonction gaussienne. |
86
+ | **"Sigmoid"** | `nn.Sigmoid()` | Fonction d'activation Sigmoid, qui produit une sortie entre 0 et 1. |
87
+ | **"Tanh"** | `nn.Tanh()` | Fonction d'activation Tanh, avec une sortie dans l'intervalle [-1, 1]. |
88
+ | **"Hardtanh"** | `nn.Hardtanh()` | Variante de Tanh, avec des sorties limitées entre une plage spécifiée. |
89
+ | **"Softplus"** | `nn.Softplus()` | Fonction d'activation qui approxime ReLU mais de manière lissée. |
90
+ | **"Softsign"** | `nn.Softsign()` | Fonction d'activation similaire à Tanh mais plus souple, avec des valeurs dans [-1, 1]. |
91
+
92
+ ---
93
+
94
+ #### **crits()**
95
+
96
+ | **Valeurs** | **Module PyTorch** | **Description** |
97
+ |--------------------------------|-------------------------------------|----------------------------------------------------------------------------------------------------------------------------|
98
+ | **"MSE"** | `nn.MSELoss()` | Mean Squared Error Loss, utilisée pour les régressions. |
99
+ | **"L1"** | `nn.L1Loss()` | L1 Loss (erreur absolue), souvent utilisée pour la régularisation. |
100
+ | **"SmoothL1"** | `nn.SmoothL1Loss()` | Smooth L1 Loss, une combinaison de L1 et de MSE, moins sensible aux outliers. |
101
+ | **"Huber"** | `nn.HuberLoss()` | Fonction de perte Huber, une version lissée de L1 et MSE, moins affectée par les grands écarts. |
102
+ | **"CrossEntropy"** | `nn.CrossEntropyLoss()` | Perte de Cross-Entropy, utilisée pour les problèmes de classification multi-classes. |
103
+ | **"KLDiv"** | `nn.KLDivLoss()` | Perte de divergence de Kullback-Leibler, souvent utilisée pour des modèles probabilistes. |
104
+ | **"PoissonNLL"** | `nn.PoissonNLLLoss()` | Perte de log-vraisemblance pour une distribution de Poisson, utilisée pour la modélisation de comptages. |
105
+ | **"MultiLabelSoftMargin"** | `nn.MultiLabelSoftMarginLoss()` | Perte utilisée pour les problèmes de classification multi-étiquettes. |
106
+
107
+ ---
108
+
109
+ #### **optims()**
110
+
111
+ | **Valeurs** | **Module PyTorch** | **Description** |
112
+ |---------------------|--------------------------------------|------------------------------------------------------------------------------------------------------------------------------------|
113
+ | **"Adadelta"** | `optim.Adadelta()` | Optimiseur Adadelta, basé sur les gradients adaptatifs, sans nécessité de réglage du taux d'apprentissage. |
114
+ | **"Adafactor"** | `optim.Adafactor()` | Optimiseur Adafactor, variant d'Adam avec une mise à jour plus efficace de la mémoire pour de grands modèles. |
115
+ | **"Adam"** | `optim.Adam()` | Optimiseur Adam, utilisant un gradient stochastique adaptatif avec des moyennes mobiles des gradients et des carrés des gradients. |
116
+ | **"AdamW"** | `optim.AdamW()` | Optimiseur Adam avec une régularisation L2 (weight decay) distincte, plus efficace que `Adam` avec `weight_decay`. |
117
+ | **"Adamax"** | `optim.Adamax()` | Version d'Adam utilisant une norme infinie pour les gradients, plus stable pour certaines configurations. |
118
+ | **"ASGD"** | `optim.ASGD()` | Optimiseur ASGD (Averaged Stochastic Gradient Descent), utilisé pour de grandes données avec une moyenne des gradients. |
119
+ | **"NAdam"** | `optim.NAdam()` | Optimiseur NAdam, une version améliorée d'Adam avec une adaptation des moments de second ordre. |
120
+ | **"RAdam"** | `optim.RAdam()` | Optimiseur RAdam, une version robuste de l'Adam qui ajuste dynamiquement les moments pour stabiliser l'entraînement. |
121
+ | **"RMSprop"** | `optim.RMSprop()` | Optimiseur RMSprop, utilisant une moyenne mobile des carrés des gradients pour réduire les oscillations. |
122
+ | **"Rprop"** | `optim.Rprop()` | Optimiseur Rprop, basé sur les mises à jour des poids indépendantes des gradients. |
123
+ | **"SGD"** | `optim.SGD()` | Descente de gradient stochastique classique, souvent utilisée avec un taux d'apprentissage constant ou ajusté. |
124
+
125
+ ---
126
+
127
+ ### Device et configuration
128
+
129
+ #### **Apple Silicon (macOS)**
130
+ - Si le système d'exploitation est macOS (nommé `darwin` dans `platform.system()`), la fonction vérifie si l'accélérateur **Metal Performance Shaders** (MPS) est disponible sur l'appareil.
131
+ - Si MPS est disponible (`torch.backends.mps.is_available()`), l'appareil cible sera défini sur **MPS** (c'est un équivalent de CUDA pour les appareils Apple Silicon).
132
+
133
+ #### **Windows**
134
+ - Si le système d'exploitation est Windows, la fonction vérifie d'abord si **CUDA** (NVIDIA) est disponible avec `torch.cuda.is_available()`. Si c'est le cas, le périphérique sera défini sur **CUDA**.
135
+
136
+ #### **Linux**
137
+ - Si le système d'exploitation est Linux, plusieurs vérifications sont effectuées :
138
+ 1. **CUDA** (NVIDIA) : Si `torch.cuda.is_available()` renvoie `True`, le périphérique sera défini sur **CUDA**.
139
+ 2. **ROCm** (AMD) : Si le système supporte **ROCm** via `torch.backends.hip.is_available()`, l'appareil sera défini sur **CUDA** (ROCm est utilisé pour les cartes AMD dans le cadre de l'API CUDA).
140
+ 3. **Intel oneAPI / XPU** : Si le système prend en charge **Intel oneAPI** ou **XPU** via `torch.xpu.is_available()`, le périphérique sera défini sur **XPU**.
141
+
142
+ #### **Système non reconnu**
143
+ - Si aucune des conditions ci-dessus n'est remplie, la fonction retourne **CPU** comme périphérique par défaut.
144
+
145
+ ---
146
+
147
+ ### Paramètres matplotlib et PyTorch
148
+
149
+ - Style global pour fond transparent et texte gris
150
+ - Optimisations CUDA activées pour TF32, matmul et convolutions
151
+ - Autograd configuré pour privilégier les performances
152
+
153
+ ---
154
+
155
+ ### Notes générales
156
+
157
+ - Toutes les méthodes de MLP utilisent les tenseurs sur le device global (CPU ou GPU)
158
+ - Les images doivent être normalisées entre 0 et 1
159
+ - Les fonctions interactives (`plot`, `compare`) utilisent matplotlib en mode interactif
160
+ - Le module est conçu pour fonctionner dans Jupyter et scripts Python classiques
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
  [project]
6
6
  name = "NeuralNetworks"
7
7
  dynamic = ["version"]
8
- description = "Multi-Layer Perceptrons with Fourier encoding, visualization and PyTorch compilation"
8
+ description = "Multi-Layer Perceptrons with multi-Fourier encoding, variable learning rate, visualization and PyTorch compilation"
9
9
  authors = [
10
10
  { name = "Alexandre Brun", email = "alexandre51160@gmail.com" }
11
11
  ]
@@ -29,7 +29,10 @@ dependencies = [
29
29
  "visualtorch>=0.2",
30
30
  "random-fourier-features-pytorch>=1.0",
31
31
  "IPython>=8.16",
32
- "requests"
32
+ "requests",
33
+ "airfrans",
34
+ "scipy",
35
+ "pandas"
33
36
  ]
34
37
 
35
38
  [project.urls]
@@ -83,7 +83,7 @@ def get_best_device():
83
83
  if os_name == "darwin":
84
84
  if torch.backends.mps.is_available():
85
85
  return torch.device("mps")
86
-
86
+
87
87
  # =========== WINDOWS ===========
88
88
  if os_name == "windows":
89
89
  # 1) CUDA
@@ -236,19 +236,7 @@ def optim_list(self, learning_rate):
236
236
  "Rprop": optim.Rprop(self.model.parameters(), lr=learning_rate),
237
237
  "SGD": optim.SGD(self.model.parameters(), lr=learning_rate)
238
238
  }
239
- optims_list = [
240
- "Adadelta",
241
- "Adafactor",
242
- "Adam",
243
- "AdamW",
244
- "Adamax",
245
- "ASGD",
246
- "NAdam",
247
- "RAdam",
248
- "RMSprop",
249
- "Rprop",
250
- "SGD"
251
- ]
239
+
252
240
  optims = lambda: print("""
253
241
  "Adadelta"
254
242
  "Adafactor"
@@ -0,0 +1,51 @@
1
+ # NeuralNetworksBeta - Multi-Layer Perceptrons avec encodage Fourier
2
+ # Copyright (C) 2025 Alexandre Brun
3
+ # This program is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation, either version 3 of the License, or
6
+ # (at your option) any later version.
7
+
8
+ from .Dependances import *
9
+
10
+ class Latent(nn.Module):
11
+ def __init__(self, insize, outsize):
12
+ super().__init__()
13
+
14
+ self.insize = insize
15
+ self.outsize = outsize
16
+
17
+ # Start latent conv channels
18
+ channels = 128
19
+
20
+ # ----- Encoder -----
21
+ layers = []
22
+ for k in range(5):
23
+ layers.append(nn.Conv2d(channels, channels // 2, kernel_size=3, padding=1))
24
+ channels = channels // 2
25
+ layers.append(nn.BatchNorm2d(channels))
26
+ layers.append(nn.ReLU(inplace=True))
27
+ layers.append(nn.MaxPool2d(kernel_size=3, stride=2, padding=1))
28
+
29
+ layers.append(nn.Flatten())
30
+ layers.append(nn.Linear(channels * 1 * 1, outsize)) # adjust if spatial dims not 1x1
31
+
32
+ self.Emodel = nn.Sequential(*layers).to(device)
33
+
34
+ # ----- Decoder -----
35
+ layers = []
36
+ layers.append(nn.Linear(outsize, channels)) # output same number of channels
37
+ layers.append(nn.Unflatten(1, (channels, 1, 1)))
38
+
39
+ for k in range(5):
40
+ layers.append(nn.ConvTranspose2d(channels, channels * 2, kernel_size=3, stride=2, padding=1, output_padding=1))
41
+ channels = channels * 2
42
+ layers.append(nn.BatchNorm2d(channels))
43
+ layers.append(nn.ReLU(inplace=True))
44
+
45
+ self.Dmodel = nn.Sequential(*layers).to(device)
46
+
47
+ def encode(self, image):
48
+ return self.Emodel(image)
49
+
50
+ def decode(self, vector):
51
+ return self.Dmodel(vector)