NeuralNetworks 0.2.2__py3-none-any.whl → 0.2.3__py3-none-any.whl
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.
- NeuralNetworks/MLP/__init__.py +3 -3
- NeuralNetworks/__init__.py +2 -7
- neuralnetworks-0.2.3.dist-info/METADATA +172 -0
- {neuralnetworks-0.2.2.dist-info → neuralnetworks-0.2.3.dist-info}/RECORD +7 -11
- NeuralNetworks/tools/AirfRANS.py +0 -36
- NeuralNetworks/tools/MNIST.py +0 -118
- NeuralNetworks/tools/VKI-LS59.py +0 -7
- NeuralNetworks/tools/image.py +0 -249
- neuralnetworks-0.2.2.dist-info/METADATA +0 -194
- {neuralnetworks-0.2.2.dist-info → neuralnetworks-0.2.3.dist-info}/WHEEL +0 -0
- {neuralnetworks-0.2.2.dist-info → neuralnetworks-0.2.3.dist-info}/licenses/LICENSE +0 -0
- {neuralnetworks-0.2.2.dist-info → neuralnetworks-0.2.3.dist-info}/top_level.txt +0 -0
NeuralNetworks/MLP/__init__.py
CHANGED
|
@@ -52,10 +52,10 @@ class MLP (nn.Module):
|
|
|
52
52
|
super ().__init__ ()
|
|
53
53
|
|
|
54
54
|
# --- Activation ---
|
|
55
|
-
self.norm = norm_list.get (norm
|
|
55
|
+
self.norm = norm_list.get (norm)
|
|
56
56
|
if self.norm is None:
|
|
57
|
-
print (f"Warning: '{norm}' not recognized, falling back to '
|
|
58
|
-
self.norm = norm_list.get (
|
|
57
|
+
print (f"Warning: '{norm}' not recognized, falling back to 'm is'")
|
|
58
|
+
self.norm = norm_list.get ("Relu")
|
|
59
59
|
|
|
60
60
|
# --- Attributs ---
|
|
61
61
|
self.losses = []
|
NeuralNetworks/__init__.py
CHANGED
|
@@ -9,15 +9,10 @@
|
|
|
9
9
|
from .Dependances import norms, crits, optims, rglen, device, pi, e, tensorise
|
|
10
10
|
|
|
11
11
|
# Modèle MLP principal + fonction d'entraînement associée
|
|
12
|
-
from .MLP import MLP
|
|
12
|
+
from .MLP import MLP
|
|
13
13
|
|
|
14
14
|
from .Trainer import Trainer
|
|
15
15
|
|
|
16
16
|
from .UI import *
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
# Fonctions de chargement/preprocessing des images
|
|
21
|
-
from .tools import image, MNIST, AirfRANS
|
|
22
|
-
|
|
23
|
-
__version__ = "0.2.2"
|
|
18
|
+
__version__ = "0.2.3"
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: NeuralNetworks
|
|
3
|
+
Version: 0.2.3
|
|
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 et l'entraînement de [MultiLayer Perceptrons](https://en.wikipedia.org/wiki/Multilayer_perceptron) (MLP)
|
|
34
|
+
avec encodage optionnel [Fourier Features](https://en.wikipedia.org/wiki/Random_feature#Random_Fourier_feature) et gestion automatique des pertes.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Contenu principal
|
|
39
|
+
|
|
40
|
+
### Classes
|
|
41
|
+
|
|
42
|
+
#### `MLP` {#MLP}
|
|
43
|
+
|
|
44
|
+
Cette classe fournit :
|
|
45
|
+
|
|
46
|
+
- Un [MLP](https://en.wikipedia.org/wiki/Multilayer_perceptron) entièrement configurable (dimensions, activation).
|
|
47
|
+
- Option d'encodage [Fourier Features](https://en.wikipedia.org/wiki/Random_feature#Random_Fourier_feature) sur les entrées.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
##### Paramètres
|
|
52
|
+
|
|
53
|
+
| **Paramètres** | **Type** | **Optionnel** | **Description** |
|
|
54
|
+
|----------------------|--------------------------------------------------------------------------------------------------|---------------|--------------------------------------------------------------------------------|
|
|
55
|
+
| `input_size` | [`int`](https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex) | Oui | Taille des données en entrée au réseau. Default: `1` |
|
|
56
|
+
| `output_size` | [`int`](https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex) | Oui | Taille des données en sortie au réseau. Default: `1` |
|
|
57
|
+
| `hidden_layers` | [`list[int]`](https://docs.python.org/3/library/stdtypes.html#sequence-types-list-tuple-range) | Oui | Dimensions successives des couches intermédiaires du réseau. Default: `[1]` |
|
|
58
|
+
| `sigmas` | [`list[float]`](https://docs.python.org/3/library/stdtypes.html#sequence-types-list-tuple-range) | Oui | Liste de sigma pour encodages RFF. Si None : passthrough. Default: `None` |
|
|
59
|
+
| `fourier_input_size` | [`int`](https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex) | Oui | WIP. Default: `2` |
|
|
60
|
+
| `nb_fourier` | [`int`](https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex) | Oui | Nombre de fréquences utilisées pour les Fourier Features. Default: `8` |
|
|
61
|
+
| `norm` | [`norm`](#norms) | Oui | Type de normalisation / activation pour les couches cachées. Default: `'Relu'` |
|
|
62
|
+
| `name` | [`str`](https://docs.python.org/3/library/stdtypes.html#text-sequence-type-str) | Oui | Nom du réseau pour identification ou affichage. Default: `'Net'` |
|
|
63
|
+
|
|
64
|
+
##### Attributs
|
|
65
|
+
|
|
66
|
+
- `losses : list[float]` — Historique des pertes cumulées lors de l'entraînement
|
|
67
|
+
- `learnings : list[float]` — Historique des taux d'apprentissage utilisées lors de l'entraînement
|
|
68
|
+
- `model : nn.Sequential` — MLP complet construit dynamiquement
|
|
69
|
+
- `name : str` — Nom du réseau
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
#### `Trainer`
|
|
74
|
+
|
|
75
|
+
Cette classe fournit :
|
|
76
|
+
|
|
77
|
+
- Méthode pour entraîner des réseaux avec mini-batchs et [Automatic Mixed Precision](https://docs.pytorch.org/tutorials/recipes/recipes/amp_recipe.html)
|
|
78
|
+
|
|
79
|
+
##### Paramètres
|
|
80
|
+
|
|
81
|
+
| **Paramètres** | **Type** | **Optionnel** | **Description** |
|
|
82
|
+
|----------------|-------------------------------------------------------------------------------------------------|---------------|-----------------------------------------------------------------------------------------------------------------|
|
|
83
|
+
| `*nets` | [`MLP`](#MLP) | Non | Réseaux pour lesquels le trainer va entrainer. |
|
|
84
|
+
| `inputs` | [`numpy.array(list[float])`](https://numpy.org/doc/stable/reference/generated/numpy.array.html) | Non | Données en entrée au réseau. |
|
|
85
|
+
| `outputs` | [`numpy.array(list[float])`](https://numpy.org/doc/stable/reference/generated/numpy.array.html) | Non | Données en sortie au réseau. |
|
|
86
|
+
| `test_size` | [`float`](https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex) | Oui | Proportion des données à utiliser pendant l'entrainement. Si None : utilise toutes les données. Default: `None` |
|
|
87
|
+
| `optim` | [`optim`](#optims) | Oui | Nom de l’optimiseur à utiliser (doit exister dans `optims()`). Default: `'Adam'` |
|
|
88
|
+
| `init_lr` | [`float`](https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex) | Oui | Taux d’apprentissage initial pour l’optimiseur. Default: `1e-3` |
|
|
89
|
+
| `crit` | [`crit`](#crits) | Oui | Fonction de perte à utiliser (doit exister dans `crits()`). Default: `MSE'` |
|
|
90
|
+
| `batch_size` | [`int`](https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex) | Oui | Taille des minibatchs. Default: `1024` |
|
|
91
|
+
|
|
92
|
+
##### `Trainer.train`
|
|
93
|
+
|
|
94
|
+
Lancement d'un entrainement avec le trainer définit
|
|
95
|
+
|
|
96
|
+
| **Paramètres** | **Type** | **Optionnel** | **Description** |
|
|
97
|
+
|-----------------|------------------------------------------------------------------------------------------|---------------|-----------------------------------------|
|
|
98
|
+
| `num_epochs` | [`int`](https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex) | Oui | Nombres d'itérations à effectuer. |
|
|
99
|
+
| `activate_tqdm` | [`boolean`](https://docs.python.org/3/library/stdtypes.html#boolean-type-bool) | Oui | Utilisation d'une barre de progression. |
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
### Dictionnaires
|
|
104
|
+
|
|
105
|
+
#### `norms()` {#norms}
|
|
106
|
+
|
|
107
|
+
| **Valeurs** | **Module PyTorch** | **Description** |
|
|
108
|
+
|---------------|--------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------|
|
|
109
|
+
| `'ReLU'` | [`nn.ReLU()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.ReLU.html) | Fonction d'activation ReLU classique (Rectified Linear Unit). |
|
|
110
|
+
| `'LeakyReLU'` | [`nn.LeakyReLU()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.LeakyReLU.html) | ReLU avec un petit coefficient pour les valeurs négatives (paramètre `negative_slope`). |
|
|
111
|
+
| `'ELU'` | [`nn.ELU()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.ELU.html) | Fonction d'activation ELU (Exponential Linear Unit), qui a une meilleure gestion des valeurs négatives. |
|
|
112
|
+
| `'SELU'` | [`nn.SELU()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.SELU.html) | SELU (Scaled Exponential Linear Unit), une version améliorée de l'ELU pour des réseaux auto-normalisants. |
|
|
113
|
+
| `'GELU'` | [`nn.GELU()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.GELU.html) | GELU (Gaussian Error Linear Unit), une activation probabiliste basée sur une fonction gaussienne. |
|
|
114
|
+
| `'Mish'` | [`nn.Mish()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.Mish.html) | ReLU différentiable en tout points avec passage négatif. |
|
|
115
|
+
| `'Softplus'` | [`nn.Softplus()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.Softplus.html) | Fonction d'activation qui approxime ReLU mais de manière lissée. |
|
|
116
|
+
| `'Sigmoid'` | [`nn.Sigmoid()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.Sigmoid.html) | Fonction d'activation Sigmoid, qui produit une sortie entre 0 et 1. |
|
|
117
|
+
| `'Tanh'` | [`nn.Tanh()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.Tanh.html) | Fonction d'activation Tanh, avec une sortie dans l'intervalle [-1, 1]. |
|
|
118
|
+
| `'Hardtanh'` | [`nn.Hardtanh()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.Hardtanh.html) | Variante de Tanh, avec des sorties limitées entre une plage spécifiée. |
|
|
119
|
+
| `'Softsign'` | [`nn.Softsign()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.Softsign.html) | Fonction d'activation similaire à Tanh mais plus souple, avec des valeurs dans [-1, 1]. |
|
|
120
|
+
|
|
121
|
+
#### `crits()` {#crits}
|
|
122
|
+
|
|
123
|
+
| **Valeurs** | **Module PyTorch** | **Description** |
|
|
124
|
+
|--------------------------|--------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------|
|
|
125
|
+
| `'MSE'` | [`nn.MSELoss`](https://pytorch.org/docs/stable/generated/torch.nn.MSELoss.html) | Perte utilisée pour les régressions. |
|
|
126
|
+
| `'L1'` | [`nn.L1Loss()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.L1Loss.html) | Perte utilisée pour la régularisation. |
|
|
127
|
+
| `'SmoothL1'` | [`nn.SmoothL1Loss()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.SmoothL1Loss.html) | Perte moins sensible aux outliers. |
|
|
128
|
+
| `'Huber'` | [`nn.HuberLoss()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.HuberLoss.html) | Perte moins affectée par les grands écarts. |
|
|
129
|
+
| `'CrossEntropy'` | [`nn.CrossEntropyLoss()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html) | Perte utilisée pour les problèmes de classification multi-classes. |
|
|
130
|
+
| `'KLDiv'` | [`nn.KLDivLoss()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.KLDivLoss.html) | Perte utilisée pour des modèles probabilistes. |
|
|
131
|
+
| `'PoissonNLL'` | [`nn.PoissonNLLLoss()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.PoissonNLLLoss.html) | Perte utilisée pour la modélisation de comptages. |
|
|
132
|
+
| `'MultiLabelSoftMargin'` | [`nn.MultiLabelSoftMarginLoss()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.MultiLabelSoftMarginLoss.html) | Perte utilisée pour les problèmes de classification multi-étiquettes. |
|
|
133
|
+
|
|
134
|
+
#### `optims()` {#optims}
|
|
135
|
+
|
|
136
|
+
| **Valeurs** | **Module PyTorch** | **Description** |
|
|
137
|
+
|---------------|--------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------|
|
|
138
|
+
| `'Adadelta'` | [`optim.Adadelta()`](https://docs.pytorch.org/docs/stable/generated/torch.optim.Adadelta.html) | Optimiseur basé sur les gradients adaptatifs, sans nécessité de réglage du taux d'apprentissage. |
|
|
139
|
+
| `'Adafactor'` | [`optim.Adafactor()`](https://docs.pytorch.org/docs/stable/generated/torch.optim.Adafactor.html) | Optimiseur variant d'Adam avec une mise à jour plus efficace de la mémoire pour de grands modèles. |
|
|
140
|
+
| `'Adam'` | [`optim.Adam()`](https://docs.pytorch.org/docs/stable/generated/torch.optim.Adam.html) | Optimiseur utilisant un gradient stochastique adaptatif avec des moyennes mobiles des gradients. |
|
|
141
|
+
| `'AdamW'` | [`optim.AdamW()`](https://docs.pytorch.org/docs/stable/generated/torch.optim.AdamW.html) | Optimiseur avec une régularisation L2 (weight decay) distincte. |
|
|
142
|
+
| `'Adamax'` | [`optim.Adamax()`](https://docs.pytorch.org/docs/stable/generated/torch.optim.Adamax.html) | Optimiseur utilisant une norme infinie pour les gradients, plus stable pour certaines configurations. |
|
|
143
|
+
| `'ASGD'` | [`optim.ASGD()`](https://docs.pytorch.org/docs/stable/generated/torch.optim.ASGD.html) | Optimiseur utilisé pour de grandes données avec une moyenne des gradients. |
|
|
144
|
+
| `'NAdam'` | [`optim.NAdam()`](https://docs.pytorch.org/docs/stable/generated/torch.optim.NAdam.html) | Optimiseur avec une adaptation des moments de second ordre. |
|
|
145
|
+
| `'RAdam'` | [`optim.RAdam()`](https://docs.pytorch.org/docs/stable/generated/torch.optim.RAdam.html) | Optimiseur qui ajuste dynamiquement les moments pour stabiliser l'entraînement. |
|
|
146
|
+
| `'RMSprop'` | [`optim.RMSprop()`](https://docs.pytorch.org/docs/stable/generated/torch.optim.RMSprop.html) | Optimiseur utilisant une moyenne mobile des carrés des gradients pour réduire les oscillations. |
|
|
147
|
+
| `'Rprop'` | [`optim.Rprop()`](https://docs.pytorch.org/docs/stable/generated/torch.optim.Rprop.html) | Optimiseur basé sur les mises à jour des poids indépendantes des gradients. |
|
|
148
|
+
| `'SGD'` | [`optim.SGD()`](https://docs.pytorch.org/docs/stable/generated/torch.optim.SGD.html) | Optimiseur souvent utilisée avec un taux d'apprentissage constant ou ajusté. |
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
### `device`
|
|
153
|
+
|
|
154
|
+
variable principale d'allocation des performances
|
|
155
|
+
|
|
156
|
+
#### **Apple Silicon (macOS)**
|
|
157
|
+
- 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.
|
|
158
|
+
- 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).
|
|
159
|
+
|
|
160
|
+
#### **Windows**
|
|
161
|
+
- 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**.
|
|
162
|
+
|
|
163
|
+
#### **Linux**
|
|
164
|
+
- Si le système d'exploitation est Linux, plusieurs vérifications sont effectuées :
|
|
165
|
+
1. **CUDA** (NVIDIA) : Si `torch.cuda.is_available()` renvoie `True`, le périphérique sera défini sur `'CUDA'`.
|
|
166
|
+
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).
|
|
167
|
+
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**.
|
|
168
|
+
|
|
169
|
+
#### **Système non reconnu**
|
|
170
|
+
- Si aucune des conditions ci-dessus n'est remplie, la fonction retourne `'CPU'` comme périphérique par défaut.
|
|
171
|
+
|
|
172
|
+
---
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
NeuralNetworks/__init__.py,sha256=
|
|
1
|
+
NeuralNetworks/__init__.py,sha256=fheTarkDt5IAOzXWTYDY9Jt9jg4heUVbIQ6H7RgwrCc,668
|
|
2
2
|
NeuralNetworks/Dependances/__init__.py,sha256=qEpDbSD8cCq-E5XVisNUVf3kZOYopDnQWToyRefPgKE,1227
|
|
3
3
|
NeuralNetworks/Dependances/matplot.py,sha256=elS8u6DZHYP-8mHEpYNOw3jDzhCAWTld9tm3OAD46zw,957
|
|
4
4
|
NeuralNetworks/Dependances/pytorch.py,sha256=RQlSV3-8uHAoEgK0FBae7O4Mdug7h_MY--sN1fK59qw,3329
|
|
5
5
|
NeuralNetworks/MLP/FourierFeatures.py,sha256=klgRM1HK09oA2NRMDxQMjJJ-WoUd5hV1ip5hHe9rHjI,3250
|
|
6
6
|
NeuralNetworks/MLP/Layers.py,sha256=WAksXsiMxaClyYTxPhlyQbwwj9qTtXs3EWCO1RqjUHY,945
|
|
7
|
-
NeuralNetworks/MLP/__init__.py,sha256=
|
|
7
|
+
NeuralNetworks/MLP/__init__.py,sha256=Q9VvDPArSbxP1Idrog7FWh-qba3rDoVl_K6kw9sSnvk,3052
|
|
8
8
|
NeuralNetworks/MLP/inference.py,sha256=9aL7pUx1LTVvrc6UYHX049UjODTgHY6cweFcp2gequQ,853
|
|
9
9
|
NeuralNetworks/Trainer/__init__.py,sha256=v0qKqx9XkYWkuouNNy0jTHQ_cZqYhFj98qrwSXlDXy0,1711
|
|
10
10
|
NeuralNetworks/Trainer/dynamic_learning_rate.py,sha256=1JAD-k0cjdL_71zGeeCUFOa61H4PzFITDjZ2nK0TzXU,2340
|
|
@@ -13,12 +13,8 @@ NeuralNetworks/Trainer/train.py,sha256=NAbHFKg4hl96OXq_i63lcRYwrPHiuKu7ihexakhpg
|
|
|
13
13
|
NeuralNetworks/UI/Learnings.py,sha256=4TBR5pcjyoBeL7eikNKM6xn25jnqL-mWT7hbrt9q-Gw,1418
|
|
14
14
|
NeuralNetworks/UI/Losses.py,sha256=Tu5xuDiutR9a4xcZKpyWN_tzSDu3_fImEf8FbAEehio,1378
|
|
15
15
|
NeuralNetworks/UI/__init__.py,sha256=L96xwQZJ-HoqqOGxaheosiDKHR3mRopuXkif--rO1J4,409
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
neuralnetworks-0.2.
|
|
21
|
-
neuralnetworks-0.2.2.dist-info/METADATA,sha256=x5PCHM2idxDoVvJBqOfH21bzNZbhwwojuPPEuStgQb0,15176
|
|
22
|
-
neuralnetworks-0.2.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
23
|
-
neuralnetworks-0.2.2.dist-info/top_level.txt,sha256=h18nmC1BX7avyAAwKh0OQWezxgXmOpmVtbFq-8Mcbms,15
|
|
24
|
-
neuralnetworks-0.2.2.dist-info/RECORD,,
|
|
16
|
+
neuralnetworks-0.2.3.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
17
|
+
neuralnetworks-0.2.3.dist-info/METADATA,sha256=NBOkoMO48dNjlelcIFSt5n7MAQ6wFCVHjcLZNoBZmvw,17339
|
|
18
|
+
neuralnetworks-0.2.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
19
|
+
neuralnetworks-0.2.3.dist-info/top_level.txt,sha256=h18nmC1BX7avyAAwKh0OQWezxgXmOpmVtbFq-8Mcbms,15
|
|
20
|
+
neuralnetworks-0.2.3.dist-info/RECORD,,
|
NeuralNetworks/tools/AirfRANS.py
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
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
|
-
from airfrans import *
|
|
10
|
-
|
|
11
|
-
def download(path,unzip = True, OpenFOAM = False):
|
|
12
|
-
"""
|
|
13
|
-
Télécharge le dataset AirfRANS dans le dossier spécifié.
|
|
14
|
-
|
|
15
|
-
Cette fonction est un simple wrapper autour :
|
|
16
|
-
dataset.download(root=path, file_name='AirfRANS', unzip=True, OpenFOAM=True)
|
|
17
|
-
|
|
18
|
-
Les arguments `unzip` et `OpenFOAM` sont actuellement ignorés par la fonction
|
|
19
|
-
et forcés à True dans l’appel interne.
|
|
20
|
-
|
|
21
|
-
Parameters
|
|
22
|
-
----------
|
|
23
|
-
path : str
|
|
24
|
-
Chemin du dossier dans lequel le dataset doit être téléchargé.
|
|
25
|
-
unzip : bool, optional
|
|
26
|
-
Paramètre non utilisé. Le téléchargement interne force `unzip=True`.
|
|
27
|
-
OpenFOAM : bool, optional
|
|
28
|
-
Paramètre non utilisé. Le téléchargement interne force `OpenFOAM=True`.
|
|
29
|
-
|
|
30
|
-
Notes
|
|
31
|
-
-----
|
|
32
|
-
- Le fichier téléchargé s’appelle `'AirfRANS'`.
|
|
33
|
-
- Le dataset est automatiquement décompressé.
|
|
34
|
-
- Le format OpenFOAM est toujours inclus.
|
|
35
|
-
"""
|
|
36
|
-
dataset.download(root = path, file_name = 'AirfRANS', unzip = True, OpenFOAM = True)
|
NeuralNetworks/tools/MNIST.py
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
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
|
-
from torchvision.datasets import MNIST
|
|
10
|
-
|
|
11
|
-
def data(path):
|
|
12
|
-
"""
|
|
13
|
-
Charge le dataset MNIST depuis `path`, applique une transformation en tenseur,
|
|
14
|
-
puis convertit les images en vecteurs numpy aplatis et les labels en tenseur PyTorch.
|
|
15
|
-
|
|
16
|
-
Parameters
|
|
17
|
-
----------
|
|
18
|
-
path : str
|
|
19
|
-
Chemin du dossier où MNIST sera téléchargé ou chargé.
|
|
20
|
-
|
|
21
|
-
Returns
|
|
22
|
-
-------
|
|
23
|
-
inputs : np.ndarray
|
|
24
|
-
Tableau numpy de shape (N, 784) contenant les images MNIST aplaties.
|
|
25
|
-
Chaque pixel est normalisé dans [0, 1] via `ToTensor()`.
|
|
26
|
-
outputs : torch.Tensor
|
|
27
|
-
Tenseur PyTorch de shape (N, 1) contenant les labels entiers (0–9).
|
|
28
|
-
|
|
29
|
-
Notes
|
|
30
|
-
-----
|
|
31
|
-
- Le dataset MNIST est téléchargé si absent.
|
|
32
|
-
- Chaque image 28×28 est convertie via `ToTensor()` puis aplatie en vecteur de 784 valeurs.
|
|
33
|
-
- Les labels sont convertis en tenseur long et remis dans une dimension (N, 1)
|
|
34
|
-
pour compatibilité avec un MLP produisant une sortie scalaire.
|
|
35
|
-
"""
|
|
36
|
-
transform = Compose([ToTensor()])
|
|
37
|
-
dataset = MNIST(path, transform=transform, download=True)
|
|
38
|
-
|
|
39
|
-
inputs, outputs = [], []
|
|
40
|
-
for data in dataset:
|
|
41
|
-
outputs.append(data[1])
|
|
42
|
-
value= data[0].numpy().flatten()
|
|
43
|
-
inputs.append(value)
|
|
44
|
-
outputs = torch.tensor(np.array(outputs)) # convert list → tensor
|
|
45
|
-
outputs = outputs.unsqueeze(1)
|
|
46
|
-
inputs = np.array(inputs)
|
|
47
|
-
|
|
48
|
-
return inputs, outputs
|
|
49
|
-
|
|
50
|
-
def evaluate (inputs, *nets):
|
|
51
|
-
"""
|
|
52
|
-
Évalue visuellement un ou plusieurs réseaux sur un échantillon MNIST choisi
|
|
53
|
-
aléatoirement. La fonction affiche simultanément :
|
|
54
|
-
|
|
55
|
-
- l'image d'entrée (28×28),
|
|
56
|
-
- les courbes de perte de chaque réseau (échelle logarithmique),
|
|
57
|
-
- la prédiction de chaque réseau imprimée dans la console.
|
|
58
|
-
|
|
59
|
-
Parameters
|
|
60
|
-
----------
|
|
61
|
-
inputs : np.ndarray
|
|
62
|
-
Tableau numpy contenant les images aplaties (N, 784).
|
|
63
|
-
Une image sera choisie aléatoirement parmi celles-ci.
|
|
64
|
-
nets : MLP
|
|
65
|
-
Un ou plusieurs réseaux entraînés, chacun possédant :
|
|
66
|
-
- net.losses : liste des pertes par époque,
|
|
67
|
-
- net.name : nom du modèle,
|
|
68
|
-
- net(x) : méthode d'inférence retournant une valeur prédite.
|
|
69
|
-
|
|
70
|
-
Notes
|
|
71
|
-
-----
|
|
72
|
-
- L'image affichée est l'entrée sélectionnée, remise en forme en 28×28.
|
|
73
|
-
- Les pertes sont tracées pour chaque réseau sur une échelle Y logarithmique.
|
|
74
|
-
- Les prédictions sont arrondies et converties en entiers pour un affichage clair.
|
|
75
|
-
- Une figure matplotlib avec deux sous-graphiques est générée via GridSpec :
|
|
76
|
-
* à gauche : l'image MNIST,
|
|
77
|
-
* à droite : les courbes de pertes.
|
|
78
|
-
- Les résultats (prédictions) sont également affichés dans la console.
|
|
79
|
-
"""
|
|
80
|
-
|
|
81
|
-
# --- Configuration de la grille de figure ---
|
|
82
|
-
fig = plt.figure(figsize=(10, 5))
|
|
83
|
-
gs = GridSpec(1, 2, figure=fig)
|
|
84
|
-
|
|
85
|
-
index = np.random.randint(0,len(inputs)-1)
|
|
86
|
-
|
|
87
|
-
# --- Préparation du subplot pour les courbes de pertes ---
|
|
88
|
-
ax_loss = fig.add_subplot(gs[0, 1])
|
|
89
|
-
ax_loss.set_yscale('log', nonpositive='mask')
|
|
90
|
-
all_losses = [[loss for loss in net.losses] for net in nets]
|
|
91
|
-
if max(len(lst) for lst in all_losses) == 1:
|
|
92
|
-
lenlosses = 2
|
|
93
|
-
else:
|
|
94
|
-
lenlosses = max(len(lst) for lst in all_losses)
|
|
95
|
-
ax_loss.set_xlim(1, lenlosses)
|
|
96
|
-
|
|
97
|
-
preds = []
|
|
98
|
-
for k, net in enumerate(nets):
|
|
99
|
-
preds.append(int(np.round(net(inputs[index]))))
|
|
100
|
-
# Tracé des pertes cumulées
|
|
101
|
-
ax_loss.plot(np.arange(1, len(all_losses[k])+1), all_losses[k],label = net.name)
|
|
102
|
-
ax_loss.legend()
|
|
103
|
-
|
|
104
|
-
# --- Affichage de l'image originale ---
|
|
105
|
-
ax_orig = fig.add_subplot(gs[0, 0])
|
|
106
|
-
ax_orig.axis('off')
|
|
107
|
-
ax_orig.set_title("input")
|
|
108
|
-
show = inputs[index].reshape(28,28)
|
|
109
|
-
ax_orig.imshow(255*show)
|
|
110
|
-
|
|
111
|
-
# --- Affichage final ---
|
|
112
|
-
fig.canvas.draw_idle()
|
|
113
|
-
plt.tight_layout()
|
|
114
|
-
plt.ion()
|
|
115
|
-
plt.show()
|
|
116
|
-
|
|
117
|
-
for k in rglen(preds):
|
|
118
|
-
print(f"{nets[k].name} output : {preds[k]}")
|
NeuralNetworks/tools/VKI-LS59.py
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
|
NeuralNetworks/tools/image.py
DELETED
|
@@ -1,249 +0,0 @@
|
|
|
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
|
-
def url(url, img_size=256):
|
|
11
|
-
"""
|
|
12
|
-
Télécharge une image depuis une URL, la redimensionne et prépare les
|
|
13
|
-
données pour l'entraînement d'un MLP pixel-wise.
|
|
14
|
-
|
|
15
|
-
Cette fonction retourne :
|
|
16
|
-
- `img_array` : image RGB sous forme de tableau NumPy (H, W, 3), pour affichage.
|
|
17
|
-
- `inputs` : coordonnées normalisées (x, y) de chaque pixel, sous forme de tenseur (H*W, 2).
|
|
18
|
-
- `outputs` : valeurs RGB cibles pour chaque pixel, sous forme de tenseur (H*W, 3).
|
|
19
|
-
|
|
20
|
-
Paramètres
|
|
21
|
-
----------
|
|
22
|
-
url : str
|
|
23
|
-
URL de l'image à télécharger.
|
|
24
|
-
img_size : int, optionnel
|
|
25
|
-
Taille finale carrée de l'image (img_size x img_size). Par défaut 256.
|
|
26
|
-
|
|
27
|
-
Retours
|
|
28
|
-
-------
|
|
29
|
-
img_array : numpy.ndarray of shape (H, W, 3)
|
|
30
|
-
Image sous forme de tableau NumPy, valeurs normalisées entre 0 et 1.
|
|
31
|
-
inputs : torch.Tensor of shape (H*W, 2)
|
|
32
|
-
Coordonnées normalisées des pixels pour l'entrée du MLP.
|
|
33
|
-
outputs : torch.Tensor of shape (H*W, 3)
|
|
34
|
-
Valeurs RGB cibles pour chaque pixel, pour la sortie du MLP.
|
|
35
|
-
|
|
36
|
-
Notes
|
|
37
|
-
-----
|
|
38
|
-
- La fonction utilise `PIL` pour le traitement de l'image et `torchvision.transforms`
|
|
39
|
-
pour la conversion en tenseur normalisé.
|
|
40
|
-
- Les coordonnées sont normalisées dans [0, 1] pour une utilisation optimale
|
|
41
|
-
avec des MLP utilisant Fourier Features ou activations standard.
|
|
42
|
-
- Les tenseurs `inputs` et `outputs` sont prêts à être envoyés sur GPU si nécessaire.
|
|
43
|
-
"""
|
|
44
|
-
|
|
45
|
-
# --- Téléchargement et ouverture de l'image ---
|
|
46
|
-
response = requests.get(url)
|
|
47
|
-
img = Image.open(BytesIO(response.content)).convert("RGB")
|
|
48
|
-
|
|
49
|
-
# --- Redimensionnement et conversion en tenseur normalisé ---
|
|
50
|
-
transform = Compose([
|
|
51
|
-
Resize((img_size, img_size)),
|
|
52
|
-
ToTensor() # Donne un tenseur (3, H, W) normalisé entre 0 et 1
|
|
53
|
-
])
|
|
54
|
-
img_tensor = transform(img)
|
|
55
|
-
|
|
56
|
-
# Récupération de la hauteur et largeur
|
|
57
|
-
h, w = img_tensor.shape[1:]
|
|
58
|
-
|
|
59
|
-
# Conversion en tableau NumPy (H, W, 3) pour affichage
|
|
60
|
-
img_array = img_tensor.permute(1, 2, 0).numpy()
|
|
61
|
-
|
|
62
|
-
# --- Création d'une grille normalisée des coordonnées des pixels ---
|
|
63
|
-
x_coords = torch.linspace(0, 1, w)
|
|
64
|
-
y_coords = torch.linspace(0, 1, h)
|
|
65
|
-
x_grid, y_grid = torch.meshgrid(x_coords, y_coords, indexing="ij")
|
|
66
|
-
|
|
67
|
-
# Flatten de la grille pour former les entrées du MLP : shape (H*W, 2)
|
|
68
|
-
inputs = torch.stack([x_grid.flatten(), y_grid.flatten()], dim=-1)
|
|
69
|
-
|
|
70
|
-
# Extraction des valeurs RGB comme sorties cibles : shape (H*W, 3)
|
|
71
|
-
outputs = img_tensor.view(3, -1).permute(1, 0)
|
|
72
|
-
|
|
73
|
-
return img_array, inputs, outputs
|
|
74
|
-
url.help = fPrintDoc(url)
|
|
75
|
-
|
|
76
|
-
def reshape(img_array, array):
|
|
77
|
-
"""
|
|
78
|
-
Reshape un tenseur plat de prédiction en image (H, W, 3) en utilisant
|
|
79
|
-
les dimensions de l’image originale.
|
|
80
|
-
|
|
81
|
-
Parameters
|
|
82
|
-
----------
|
|
83
|
-
img_array : np.ndarray of shape (H, W, 3)
|
|
84
|
-
Image originale servant de référence pour récupérer la hauteur (H)
|
|
85
|
-
et la largeur (W).
|
|
86
|
-
array : tensor-like or ndarray of shape (H*W, 3)
|
|
87
|
-
Tableau plat contenant les valeurs RGB prédites pour chaque pixel.
|
|
88
|
-
|
|
89
|
-
Returns
|
|
90
|
-
-------
|
|
91
|
-
np.ndarray of shape (H, W, 3)
|
|
92
|
-
Image reconstruite à partir du tableau plat.
|
|
93
|
-
|
|
94
|
-
Notes
|
|
95
|
-
-----
|
|
96
|
-
- Cette fonction ne modifie pas les valeurs, elle fait uniquement un reshape.
|
|
97
|
-
- Utile après une prédiction de type MLP qui renvoie un tableau (N, 3).
|
|
98
|
-
"""
|
|
99
|
-
|
|
100
|
-
# Récupération de la hauteur et largeur à partir de l’image originale
|
|
101
|
-
h, w = img_array.shape[:2]
|
|
102
|
-
|
|
103
|
-
# Reconstruction en image RGB
|
|
104
|
-
return array.reshape(h, w, 3)
|
|
105
|
-
reshape.help = fPrintDoc(reshape)
|
|
106
|
-
|
|
107
|
-
def compare(img_array, inputs, *nets):
|
|
108
|
-
"""
|
|
109
|
-
Affiche, pour chaque réseau, l’erreur absolue entre l’image originale
|
|
110
|
-
et l’image reconstruite par le réseau.
|
|
111
|
-
|
|
112
|
-
Chaque réseau doit posséder :
|
|
113
|
-
- une méthode `encoding(x)` (si RFF activé),
|
|
114
|
-
- un module `model` retournant un tenseur de shape (N, 3),
|
|
115
|
-
- une reconstruction compatible avec (H, W, 3).
|
|
116
|
-
|
|
117
|
-
Parameters
|
|
118
|
-
----------
|
|
119
|
-
img_array : np.ndarray of shape (H, W, 3)
|
|
120
|
-
Image originale servant de référence.
|
|
121
|
-
inputs : tensor-like of shape (H*W, 2)
|
|
122
|
-
Coordonnées normalisées des pixels correspondant à chaque point de l'image.
|
|
123
|
-
*nets : *MLP
|
|
124
|
-
Un ou plusieurs réseaux.
|
|
125
|
-
|
|
126
|
-
Notes
|
|
127
|
-
-----
|
|
128
|
-
- L’affichage montre la différence absolue entre l’image originale et la prédiction du réseau.
|
|
129
|
-
- Les pertes cumulées sont également tracées pour chaque réseau.
|
|
130
|
-
- Utilise matplotlib en mode interactif.
|
|
131
|
-
"""
|
|
132
|
-
|
|
133
|
-
# --- Conversion des inputs en tensor et récupération du nombre d'échantillons ---
|
|
134
|
-
inputs, n_samples = tensorise(inputs), inputs.size(0)
|
|
135
|
-
h, w = img_array.shape[:2]
|
|
136
|
-
|
|
137
|
-
# --- Configuration de la grille de figure ---
|
|
138
|
-
grid_length = 2 if len(nets) == 1 else len(nets)
|
|
139
|
-
fig = plt.figure(figsize=(5*grid_length, 10))
|
|
140
|
-
gs = GridSpec(2, grid_length, figure=fig)
|
|
141
|
-
|
|
142
|
-
# --- Affichage de l'image originale ---
|
|
143
|
-
ax_orig = fig.add_subplot(gs[0, 0])
|
|
144
|
-
ax_orig.axis('off')
|
|
145
|
-
ax_orig.set_title("Original Image")
|
|
146
|
-
ax_orig.imshow(img_array)
|
|
147
|
-
|
|
148
|
-
# --- Préparation du subplot pour les courbes de pertes ---
|
|
149
|
-
ax_loss = fig.add_subplot(gs[0, 1])
|
|
150
|
-
all_losses = [[loss for loss in net.losses] for net in nets]
|
|
151
|
-
if max(len(lst) for lst in all_losses) == 1:
|
|
152
|
-
lenlosses = 2
|
|
153
|
-
else:
|
|
154
|
-
lenlosses = max(len(lst) for lst in all_losses)
|
|
155
|
-
ax_loss.set_xlim(1, lenlosses)
|
|
156
|
-
ax_loss.set_yscale('log', nonpositive='mask')
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
# --- Boucle sur chaque réseau pour afficher l'erreur et les pertes ---
|
|
160
|
-
for k, net in enumerate(nets):
|
|
161
|
-
# Subplot pour l'erreur absolue
|
|
162
|
-
ax = fig.add_subplot(gs[1, k])
|
|
163
|
-
ax.axis('off')
|
|
164
|
-
ax.set_title(net.name)
|
|
165
|
-
|
|
166
|
-
# Prédiction et reconstruction de l'image
|
|
167
|
-
pred_img = net(inputs).reshape(h, w, 3)
|
|
168
|
-
|
|
169
|
-
# Tracé des pertes cumulées
|
|
170
|
-
ax_loss.plot(np.arange(1, len(all_losses[k])+1), all_losses[k],label = net.name)
|
|
171
|
-
|
|
172
|
-
# Affichage de l'erreur absolue
|
|
173
|
-
ax.imshow(np.abs(img_array - pred_img))
|
|
174
|
-
ax_loss.legend()
|
|
175
|
-
|
|
176
|
-
# --- Affichage final ---
|
|
177
|
-
fig.canvas.draw_idle()
|
|
178
|
-
plt.tight_layout()
|
|
179
|
-
plt.ion()
|
|
180
|
-
plt.show()
|
|
181
|
-
compare.help = fPrintDoc(compare)
|
|
182
|
-
|
|
183
|
-
def plot(img_array, inputs, *nets):
|
|
184
|
-
"""
|
|
185
|
-
Affiche, pour chaque réseau, l’image reconstruite à partir de ses prédictions.
|
|
186
|
-
|
|
187
|
-
Parameters
|
|
188
|
-
----------
|
|
189
|
-
img_array : np.ndarray of shape (H, W, 3)
|
|
190
|
-
Image originale, utilisée pour connaître les dimensions de reconstruction.
|
|
191
|
-
inputs : tensor-like of shape (H*W, 2)
|
|
192
|
-
Coordonnées normalisées des pixels correspondant à chaque point de l'image.
|
|
193
|
-
*nets : *MLP
|
|
194
|
-
Un ou plusieurs réseaux.
|
|
195
|
-
Notes
|
|
196
|
-
-----
|
|
197
|
-
- Cette fonction affiche la prédiction brute.
|
|
198
|
-
- Les pertes cumulées sont également tracées pour chaque réseau.
|
|
199
|
-
- Utilise matplotlib en mode interactif.
|
|
200
|
-
"""
|
|
201
|
-
|
|
202
|
-
# --- Conversion des inputs en tensor et récupération du nombre d'échantillons ---
|
|
203
|
-
inputs, n_samples = tensorise(inputs), inputs.size(0)
|
|
204
|
-
h, w = img_array.shape[:2]
|
|
205
|
-
|
|
206
|
-
# --- Configuration de la grille de figure ---
|
|
207
|
-
grid_length = 2 if len(nets) == 1 else len(nets)
|
|
208
|
-
fig = plt.figure(figsize=(5*grid_length, 10))
|
|
209
|
-
gs = GridSpec(2, grid_length, figure=fig)
|
|
210
|
-
|
|
211
|
-
# --- Affichage de l'image originale ---
|
|
212
|
-
ax_orig = fig.add_subplot(gs[0, 0])
|
|
213
|
-
ax_orig.axis('off')
|
|
214
|
-
ax_orig.set_title("Original Image")
|
|
215
|
-
ax_orig.imshow(img_array)
|
|
216
|
-
|
|
217
|
-
# --- Préparation du subplot pour les courbes de pertes ---
|
|
218
|
-
ax_loss = fig.add_subplot(gs[0, 1])
|
|
219
|
-
all_losses = [[loss for loss in net.losses] for net in nets]
|
|
220
|
-
if max(len(lst) for lst in all_losses) == 1:
|
|
221
|
-
lenlosses = 2
|
|
222
|
-
else:
|
|
223
|
-
lenlosses = max(len(lst) for lst in all_losses)
|
|
224
|
-
ax_loss.set_xlim(1, lenlosses)
|
|
225
|
-
|
|
226
|
-
# --- Boucle sur chaque réseau pour afficher les prédictions et pertes ---
|
|
227
|
-
for k, net in enumerate(nets):
|
|
228
|
-
# Subplot pour l'image reconstruite
|
|
229
|
-
ax = fig.add_subplot(gs[1, k])
|
|
230
|
-
ax.axis('off')
|
|
231
|
-
ax.set_title(net.name)
|
|
232
|
-
|
|
233
|
-
# Prédiction et reconstruction de l'image
|
|
234
|
-
pred_img = net(inputs).reshape(h, w, 3)
|
|
235
|
-
|
|
236
|
-
# Tracé des pertes cumulées
|
|
237
|
-
ax_loss.plot(np.arange(1, len(all_losses[k])+1), all_losses[k],label = net.name)
|
|
238
|
-
ax_loss.set_yscale('log', nonpositive='mask')
|
|
239
|
-
|
|
240
|
-
# Affichage de l'image prédite
|
|
241
|
-
ax.imshow(pred_img)
|
|
242
|
-
ax_loss.legend()
|
|
243
|
-
|
|
244
|
-
# --- Affichage final ---
|
|
245
|
-
fig.canvas.draw_idle()
|
|
246
|
-
plt.tight_layout()
|
|
247
|
-
plt.ion()
|
|
248
|
-
plt.show()
|
|
249
|
-
plot.help = fPrintDoc(plot)
|
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: NeuralNetworks
|
|
3
|
-
Version: 0.2.2
|
|
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 encodage optionnel Fourier (RFF),
|
|
46
|
-
suivi automatique des pertes, visualisation et compilation PyTorch.
|
|
47
|
-
|
|
48
|
-
Cette classe fournit :
|
|
49
|
-
|
|
50
|
-
- Un MLP entièrement configurable (dimensions, normalisation, activation)
|
|
51
|
-
- Option d'encodage Fourier (Random Fourier Features) sur les entrées
|
|
52
|
-
- Méthodes pour entraîner le réseau avec mini-batchs et AMP (Automatic Mixed Precision)
|
|
53
|
-
- Visualisation de l'architecture via visualtorch
|
|
54
|
-
- Suivi et affichage de la perte d'entraînement
|
|
55
|
-
- Accès aux poids, biais et nombre de paramètres
|
|
56
|
-
|
|
57
|
-
---
|
|
58
|
-
|
|
59
|
-
##### Parameters
|
|
60
|
-
|
|
61
|
-
| Parameter | Type | Optional | Description |
|
|
62
|
-
|----------------------|---------------|----------|-----------------------------------------------------------------------------------------------|
|
|
63
|
-
| `input_size` | int | Yes | Taille des données en entrée au réseau. Default: `1` |
|
|
64
|
-
| `output_size` | int | Yes | Taille des données en sortie au réseau. Default: `1` |
|
|
65
|
-
| `hidden_layers` | list[int] | Yes | Dimensions successives des couches intermédiaires du réseau. Default: `[1]` |
|
|
66
|
-
| `sigmas` | list[float] | Yes | Liste de sigma pour encodages RFF. Si None : passthrough. Default: `None` |
|
|
67
|
-
| `fourier_input_size` | int | Yes | WIP. Default: `2` |
|
|
68
|
-
| `nb_fourier` | int | Yes | Nombre de fréquences utilisées pour les Fourier Features. Default: `8` |
|
|
69
|
-
| `norm` | str | Yes | Type de normalisation / activation pour les couches cachées (ex: `"Relu"`). Default: `"Relu"` |
|
|
70
|
-
| `name` | str | Yes | Nom du réseau pour identification ou affichage. Default: `"Net"` |
|
|
71
|
-
|
|
72
|
-
---
|
|
73
|
-
|
|
74
|
-
##### Attributes
|
|
75
|
-
|
|
76
|
-
- `losses : list[float]` — Historique des pertes cumulées lors de l'entraînement
|
|
77
|
-
- `learnings : list[float]` — Historique des taux d'apprentissage utilisées lors de l'entraînement
|
|
78
|
-
- `model : nn.Sequential` — MLP complet construit dynamiquement
|
|
79
|
-
- `name : str` — Nom du réseau
|
|
80
|
-
|
|
81
|
-
---
|
|
82
|
-
|
|
83
|
-
#### `Trainer`
|
|
84
|
-
|
|
85
|
-
---
|
|
86
|
-
|
|
87
|
-
##### Parameters
|
|
88
|
-
|
|
89
|
-
| Parameter | Type | Optional | Description |
|
|
90
|
-
|--------------|-----------------|----------|-----------------------------------------------------------------------------------------------------------------|
|
|
91
|
-
| `*nets` | *MLP | No | Réseaux pour lesquels le trainer va entrainer. |
|
|
92
|
-
| `inputs` | np.array(float) | No | Données en entrée au réseau. |
|
|
93
|
-
| `outputs` | np.array(float) | No | Données en sortie au réseau. |
|
|
94
|
-
| `test_size` | float | Yes | Proportion des données à utiliser pendant l'entrainement. Si None : utilise toutes les données. Default: `None` |
|
|
95
|
-
| `optim` | str | Yes | Nom de l’optimiseur à utiliser (doit exister dans `optims()`). Default: `"Adam"` |
|
|
96
|
-
| `init_lr` | float | Yes | Taux d’apprentissage initial pour l’optimiseur. Default: `1e-3` |
|
|
97
|
-
| `crit` | str | Yes | Fonction de perte à utiliser (doit exister dans `crits()`). Default: `"MSE"` |
|
|
98
|
-
| `batch_size` | float | Yes | Taille des minibatchs. Default: `1024` |
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
##### `Trainer.train`
|
|
103
|
-
|
|
104
|
-
Lancement d'un entrainement avec le trainer définit
|
|
105
|
-
|
|
106
|
-
| Parameter | Type | Optional | Description |
|
|
107
|
-
|-----------------|---------|----------|-----------------------------------------|
|
|
108
|
-
| `num_epochs` | int | Yes | Nombres d'itérations à effectuer. |
|
|
109
|
-
| `activate_tqdm` | boolean | Yes | Utilisation d'une barre de progression. |
|
|
110
|
-
|
|
111
|
-
---
|
|
112
|
-
|
|
113
|
-
### Dictionnaires
|
|
114
|
-
|
|
115
|
-
#### `norms()`
|
|
116
|
-
|
|
117
|
-
| **Valeurs** | **Module PyTorch** | **Description** |
|
|
118
|
-
|---------------------|--------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------|
|
|
119
|
-
| **"ReLU"** | [`nn.ReLU()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.ReLU.html) | Fonction d'activation ReLU classique (Rectified Linear Unit). |
|
|
120
|
-
| **"LeakyReLU"** | [`nn.LeakyReLU()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.LeakyReLU.html) | ReLU avec un petit coefficient pour les valeurs négatives (paramètre `negative_slope`). |
|
|
121
|
-
| **"ELU"** | [`nn.ELU()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.ELU.html) | Fonction d'activation ELU (Exponential Linear Unit), qui a une meilleure gestion des valeurs négatives. |
|
|
122
|
-
| **"SELU"** | [`nn.SELU()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.SELU.html) | SELU (Scaled Exponential Linear Unit), une version améliorée de l'ELU pour des réseaux auto-normalisants. |
|
|
123
|
-
| **"GELU"** | [`nn.GELU()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.GELU.html) | GELU (Gaussian Error Linear Unit), une activation probabiliste basée sur une fonction gaussienne. |
|
|
124
|
-
| **"Mish"** | [`nn.Mish()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.Mish.html) | ReLU différentiable en tout points avec passage négatif. |
|
|
125
|
-
| **"Softplus"** | [`nn.Softplus()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.Softplus.html) | Fonction d'activation qui approxime ReLU mais de manière lissée. |
|
|
126
|
-
| **"Sigmoid"** | [`nn.Sigmoid()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.Sigmoid.html) | Fonction d'activation Sigmoid, qui produit une sortie entre 0 et 1. |
|
|
127
|
-
| **"Tanh"** | [`nn.Tanh()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.Tanh.html) | Fonction d'activation Tanh, avec une sortie dans l'intervalle [-1, 1]. |
|
|
128
|
-
| **"Hardtanh"** | [`nn.Hardtanh()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.Hardtanh.html) | Variante de Tanh, avec des sorties limitées entre une plage spécifiée. |
|
|
129
|
-
| **"Softsign"** | [`nn.Softsign()`](https://docs.pytorch.org/docs/stable/generated/torch.nn.Softsign.html) | Fonction d'activation similaire à Tanh mais plus souple, avec des valeurs dans [-1, 1]. |
|
|
130
|
-
|
|
131
|
-
---
|
|
132
|
-
|
|
133
|
-
#### `crits()`
|
|
134
|
-
|
|
135
|
-
| **Valeurs** | **Module PyTorch** | **Description** |
|
|
136
|
-
|--------------------------------|-------------------------------------|----------------------------------------------------------------------------------------------------------------------------|
|
|
137
|
-
| **"MSE"** | [`nn.MSELoss`](https://pytorch.org/docs/stable/generated/torch.nn.MSELoss.html) | Mean Squared Error Loss, utilisée pour les régressions. |
|
|
138
|
-
| **"L1"** | `nn.L1Loss()` | L1 Loss (erreur absolue), souvent utilisée pour la régularisation. |
|
|
139
|
-
| **"SmoothL1"** | `nn.SmoothL1Loss()` | Smooth L1 Loss, une combinaison de L1 et de MSE, moins sensible aux outliers. |
|
|
140
|
-
| **"Huber"** | `nn.HuberLoss()` | Fonction de perte Huber, une version lissée de L1 et MSE, moins affectée par les grands écarts. |
|
|
141
|
-
| **"CrossEntropy"** | `nn.CrossEntropyLoss()` | Perte de Cross-Entropy, utilisée pour les problèmes de classification multi-classes. |
|
|
142
|
-
| **"KLDiv"** | `nn.KLDivLoss()` | Perte de divergence de Kullback-Leibler, souvent utilisée pour des modèles probabilistes. |
|
|
143
|
-
| **"PoissonNLL"** | `nn.PoissonNLLLoss()` | Perte de log-vraisemblance pour une distribution de Poisson, utilisée pour la modélisation de comptages. |
|
|
144
|
-
| **"MultiLabelSoftMargin"** | `nn.MultiLabelSoftMarginLoss()` | Perte utilisée pour les problèmes de classification multi-étiquettes. |
|
|
145
|
-
|
|
146
|
-
---
|
|
147
|
-
|
|
148
|
-
#### `optims()`
|
|
149
|
-
|
|
150
|
-
| **Valeurs** | **Module PyTorch** | **Description** |
|
|
151
|
-
|---------------------|--------------------------------------|------------------------------------------------------------------------------------------------------------------------------------|
|
|
152
|
-
| **"Adadelta"** | `optim.Adadelta()` | Optimiseur Adadelta, basé sur les gradients adaptatifs, sans nécessité de réglage du taux d'apprentissage. |
|
|
153
|
-
| **"Adafactor"** | `optim.Adafactor()` | Optimiseur Adafactor, variant d'Adam avec une mise à jour plus efficace de la mémoire pour de grands modèles. |
|
|
154
|
-
| **"Adam"** | `optim.Adam()` | Optimiseur Adam, utilisant un gradient stochastique adaptatif avec des moyennes mobiles des gradients et des carrés des gradients. |
|
|
155
|
-
| **"AdamW"** | `optim.AdamW()` | Optimiseur Adam avec une régularisation L2 (weight decay) distincte, plus efficace que `Adam` avec `weight_decay`. |
|
|
156
|
-
| **"Adamax"** | `optim.Adamax()` | Version d'Adam utilisant une norme infinie pour les gradients, plus stable pour certaines configurations. |
|
|
157
|
-
| **"ASGD"** | `optim.ASGD()` | Optimiseur ASGD (Averaged Stochastic Gradient Descent), utilisé pour de grandes données avec une moyenne des gradients. |
|
|
158
|
-
| **"NAdam"** | `optim.NAdam()` | Optimiseur NAdam, une version améliorée d'Adam avec une adaptation des moments de second ordre. |
|
|
159
|
-
| **"RAdam"** | `optim.RAdam()` | Optimiseur RAdam, une version robuste de l'Adam qui ajuste dynamiquement les moments pour stabiliser l'entraînement. |
|
|
160
|
-
| **"RMSprop"** | `optim.RMSprop()` | Optimiseur RMSprop, utilisant une moyenne mobile des carrés des gradients pour réduire les oscillations. |
|
|
161
|
-
| **"Rprop"** | `optim.Rprop()` | Optimiseur Rprop, basé sur les mises à jour des poids indépendantes des gradients. |
|
|
162
|
-
| **"SGD"** | `optim.SGD()` | Descente de gradient stochastique classique, souvent utilisée avec un taux d'apprentissage constant ou ajusté. |
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
### `device`
|
|
167
|
-
|
|
168
|
-
variable principale d'allocation des performances
|
|
169
|
-
|
|
170
|
-
#### **Apple Silicon (macOS)**
|
|
171
|
-
- 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.
|
|
172
|
-
- 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).
|
|
173
|
-
|
|
174
|
-
#### **Windows**
|
|
175
|
-
- 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**.
|
|
176
|
-
|
|
177
|
-
#### **Linux**
|
|
178
|
-
- Si le système d'exploitation est Linux, plusieurs vérifications sont effectuées :
|
|
179
|
-
1. **CUDA** (NVIDIA) : Si `torch.cuda.is_available()` renvoie `True`, le périphérique sera défini sur **CUDA**.
|
|
180
|
-
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).
|
|
181
|
-
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**.
|
|
182
|
-
|
|
183
|
-
#### **Système non reconnu**
|
|
184
|
-
- Si aucune des conditions ci-dessus n'est remplie, la fonction retourne **CPU** comme périphérique par défaut.
|
|
185
|
-
|
|
186
|
-
---
|
|
187
|
-
|
|
188
|
-
### Paramètres matplotlib et PyTorch
|
|
189
|
-
|
|
190
|
-
- Style global pour fond transparent et texte gris
|
|
191
|
-
- Optimisations CUDA activées pour TF32, matmul et convolutions
|
|
192
|
-
- Autograd configuré pour privilégier les performances
|
|
193
|
-
|
|
194
|
-
---
|
|
File without changes
|
|
File without changes
|
|
File without changes
|