NeuralNetworks 0.1.12__py3-none-any.whl → 0.2.0__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/Plot.py DELETED
@@ -1,324 +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 compare(img_array, inputs, *nets):
11
- """
12
- Affiche, pour chaque réseau, l’erreur absolue entre l’image originale
13
- et l’image reconstruite par le réseau.
14
-
15
- Chaque réseau doit posséder :
16
- - une méthode `encoding(x)` (si RFF activé),
17
- - un module `model` retournant un tenseur de shape (N, 3),
18
- - une reconstruction compatible avec (H, W, 3).
19
-
20
- Parameters
21
- ----------
22
- img_array : np.ndarray of shape (H, W, 3)
23
- Image originale servant de référence.
24
- inputs : tensor-like of shape (H*W, 2)
25
- Coordonnées normalisées des pixels correspondant à chaque point de l'image.
26
- nets : MLP
27
- Un ou plusieurs réseaux possédant les méthodes `.encoding()` et `.model()`,
28
- et l’attribut `.losses`.
29
-
30
- Notes
31
- -----
32
- - L’affichage montre la différence absolue entre l’image originale et la prédiction du réseau.
33
- - Les pertes cumulées sont également tracées pour chaque réseau.
34
- - Utilise matplotlib en mode interactif.
35
- """
36
-
37
- # --- Conversion des inputs en tensor et récupération du nombre d'échantillons ---
38
- inputs, n_samples = tensorise(inputs), inputs.size(0)
39
- h, w = img_array.shape[:2]
40
-
41
- # --- Configuration de la grille de figure ---
42
- grid_length = 2 if len(nets) == 1 else len(nets)
43
- fig = plt.figure(figsize=(5*grid_length, 10))
44
- gs = GridSpec(2, grid_length, figure=fig)
45
-
46
- # --- Affichage de l'image originale ---
47
- ax_orig = fig.add_subplot(gs[0, 0])
48
- ax_orig.axis('off')
49
- ax_orig.set_title("Original Image")
50
- ax_orig.imshow(img_array)
51
-
52
- # --- Préparation du subplot pour les courbes de pertes ---
53
- ax_loss = fig.add_subplot(gs[0, 1])
54
- all_losses = [[loss.item() for loss in net.losses] for net in nets]
55
- if max(len(lst) for lst in all_losses) == 1:
56
- lenlosses = 2
57
- else:
58
- lenlosses = max(len(lst) for lst in all_losses)
59
- ax_loss.set_xlim(1, lenlosses)
60
- ax_loss.set_ylim(0, max(max(lst) for lst in all_losses))
61
-
62
- # --- Boucle sur chaque réseau pour afficher l'erreur et les pertes ---
63
- for k, net in enumerate(nets):
64
- # Subplot pour l'erreur absolue
65
- ax = fig.add_subplot(gs[1, k])
66
- ax.axis('off')
67
- ax.set_title(net.name)
68
-
69
- # Prédiction et reconstruction de l'image
70
- pred = net.model(net.encoding(inputs))
71
- pred_img = pred.reshape(h, w, 3).cpu().detach().numpy()
72
-
73
- # Tracé des pertes cumulées
74
- ax_loss.plot(np.arange(1, len(all_losses[k])+1), all_losses[k])
75
-
76
- # Affichage de l'erreur absolue
77
- ax.imshow(np.abs(img_array - pred_img))
78
-
79
- # --- Affichage final ---
80
- fig.canvas.draw_idle()
81
- plt.tight_layout()
82
- plt.ion()
83
- plt.show()
84
- compare.help = fPrintDoc(compare)
85
-
86
- def plot(img_array, inputs, *nets):
87
- """
88
- Affiche, pour chaque réseau, l’image reconstruite à partir de ses prédictions.
89
-
90
- Parameters
91
- ----------
92
- img_array : np.ndarray of shape (H, W, 3)
93
- Image originale, utilisée pour connaître les dimensions de reconstruction.
94
- inputs : tensor-like of shape (H*W, 2)
95
- Coordonnées normalisées des pixels correspondant à chaque point de l'image.
96
- nets : MLP
97
- Un ou plusieurs réseaux possédant les méthodes `.encoding()` et `.model()`,
98
- et l’attribut `.losses`.
99
-
100
- Notes
101
- -----
102
- - Cette fonction affiche la prédiction brute.
103
- - Les pertes cumulées sont également tracées pour chaque réseau.
104
- - Utilise matplotlib en mode interactif.
105
- """
106
-
107
- # --- Conversion des inputs en tensor et récupération du nombre d'échantillons ---
108
- inputs, n_samples = tensorise(inputs), inputs.size(0)
109
- h, w = img_array.shape[:2]
110
-
111
- # --- Configuration de la grille de figure ---
112
- grid_length = 2 if len(nets) == 1 else len(nets)
113
- fig = plt.figure(figsize=(5*grid_length, 10))
114
- gs = GridSpec(2, grid_length, figure=fig)
115
-
116
- # --- Affichage de l'image originale ---
117
- ax_orig = fig.add_subplot(gs[0, 0])
118
- ax_orig.axis('off')
119
- ax_orig.set_title("Original Image")
120
- ax_orig.imshow(img_array)
121
-
122
- # --- Préparation du subplot pour les courbes de pertes ---
123
- ax_loss = fig.add_subplot(gs[0, 1])
124
- all_losses = [[loss.item() for loss in net.losses] for net in nets]
125
- if max(len(lst) for lst in all_losses) == 1:
126
- lenlosses = 2
127
- else:
128
- lenlosses = max(len(lst) for lst in all_losses)
129
- ax_loss.set_xlim(1, lenlosses)
130
- ax_loss.set_ylim(0, max(max(lst) for lst in all_losses))
131
-
132
- # --- Boucle sur chaque réseau pour afficher les prédictions et pertes ---
133
- for k, net in enumerate(nets):
134
- # Subplot pour l'image reconstruite
135
- ax = fig.add_subplot(gs[1, k])
136
- ax.axis('off')
137
- ax.set_title(net.name)
138
-
139
- # Prédiction et reconstruction de l'image
140
- pred = net.model(net.encoding(inputs))
141
- pred_img = pred.reshape(h, w, 3).cpu().detach().numpy()
142
-
143
- # Tracé des pertes cumulées
144
- ax_loss.plot(np.arange(1, len(all_losses[k])+1), all_losses[k],label = net.name)
145
- ax_loss.legend()
146
-
147
- # Affichage de l'image prédite
148
- ax.imshow(pred_img)
149
-
150
- # --- Affichage final ---
151
- fig.canvas.draw_idle()
152
- plt.tight_layout()
153
- plt.ion()
154
- plt.show()
155
- plot.help = fPrintDoc(plot)
156
-
157
-
158
- def losses(*nets):
159
- """
160
- Affiche les courbes de pertes (training loss) de plusieurs réseaux MLP.
161
-
162
- Parameters
163
- ----------
164
- nets : MLP
165
- Un ou plusieurs réseaux possédant un attribut `.losses`
166
- contenant l'historique des pertes (liste de float).
167
-
168
- Notes
169
- -----
170
- - L’axe X correspond aux itérations (epochs ou steps).
171
- - L’axe Y correspond à la valeur de la perte.
172
- - La fonction utilise matplotlib en mode interactif pour affichage dynamique.
173
- """
174
-
175
- # --- Initialisation de la figure ---
176
- fig = plt.figure(figsize=(5, 5))
177
-
178
- # --- Définition des limites des axes ---
179
- all_losses = [[loss.item() for loss in net.losses] for net in nets]
180
- if max(len(lst) for lst in all_losses) == 1:
181
- lenlosses = 2
182
- else:
183
- lenlosses = max(len(lst) for lst in all_losses)
184
- plt.xlim(1, lenlosses)
185
- plt.ylim(0, max(max(lst) for lst in all_losses))
186
-
187
- # --- Tracé des courbes de pertes pour chaque réseau ---
188
- for k, net in enumerate(nets):
189
- steps = np.linspace(1, len(net.losses), len(net.losses)) # epochs
190
- plt.plot(np.arange(1, len(all_losses[k])+1), all_losses[k],label = net.name)
191
-
192
- # --- Affichage ---
193
- plt.legend()
194
- fig.canvas.draw_idle()
195
- plt.tight_layout()
196
- plt.ion() # mode interactif
197
- plt.show()
198
- losses.help = fPrintDoc(losses)
199
-
200
- def train(inputs, outputs, num_epochs=1500, batch_size=1024, *nets, img_array=None):
201
- """
202
- Entraîne un ou plusieurs MLP sur des paires (inputs, outputs) avec gestion optionnelle de l'affichage interactif.
203
-
204
- Affiche dynamiquement si img_array est fourni :
205
- - L'image originale (référence)
206
- - Les prédictions des MLP
207
- - L'évolution des pertes au fil des époques
208
-
209
- Parameters
210
- ----------
211
- inputs : array-like
212
- Entrées du ou des MLP (shape: [n_samples, n_features]).
213
- outputs : array-like
214
- Sorties cibles correspondantes (shape: [n_samples, output_dim]).
215
- num_epochs : int, optional
216
- Nombre d’époques pour l’entraînement (default=1500).
217
- batch_size : int, optional
218
- Taille des mini-batchs pour la descente de gradient (default=1024).
219
- *nets : MLP
220
- Un ou plusieurs objets MLP à entraîner.
221
- img_array : np.ndarray of shape (H, W, 3), optional
222
- Image de référence pour visualisation des prédictions (default=None).
223
-
224
- Notes
225
- -----
226
- - Les MLP sont entraînés indépendamment mais avec le même ordre aléatoire d'échantillons.
227
- - Utilise torch.amp.GradScaler pour l'entraînement en FP16.
228
- - La visualisation interactive utilise clear_output() et plt.ion().
229
- """
230
-
231
- # --- Conversion des données en tensors et récupération du nombre d'échantillons ---
232
- inputs, outputs, n_samples = tensorise(inputs).to(device), tensorise(outputs).to(device), inputs.size(0)
233
- for net in nets:
234
- net.model = net.model.to(device)
235
- dev = str(device)
236
- scaler = GradScaler(dev)
237
- visual = False
238
-
239
- # --- Initialisation de l'affichage interactif si une image de référence est fournie ---
240
- if img_array is not None:
241
- visual = True
242
- h, w = img_array.shape[:2]
243
- grid_length = 2 if len(nets) == 1 else len(nets)
244
- fig = plt.figure(figsize=(5*grid_length, 10))
245
- gs = GridSpec(2, grid_length, figure=fig)
246
-
247
- # Image originale
248
- ax_orig = fig.add_subplot(gs[0, 0])
249
- ax_orig.axis('off')
250
- ax_orig.set_title("Original Image")
251
- im_orig = ax_orig.imshow(img_array)
252
-
253
- # Images des prédictions initiales des MLP
254
- ims_preds, axs_preds = [], []
255
- for k, net in enumerate(nets):
256
- ax = fig.add_subplot(gs[1, k])
257
- ax.axis('off')
258
- ax.set_title(f"Net {k+1}")
259
- im = ax.imshow(net.model(net.encoding(inputs)).reshape(h, w, 3).cpu().detach().numpy())
260
- ims_preds.append(im)
261
- axs_preds.append(ax)
262
-
263
- # Graphiques des pertes
264
- ax_loss = fig.add_subplot(gs[0, 1])
265
- lines = []
266
- for k in range(len(nets)):
267
- line, = ax_loss.plot([], [], label=f"Network {k+1}")
268
- lines.append(line)
269
- ax_loss.set_xlim(1)
270
- ax_loss.set_ylim(0, 1)
271
- ax_loss.set_xlabel("Epoch")
272
- ax_loss.set_ylabel("Loss")
273
- ax_loss.set_title("Loss per Epoch")
274
- ax_loss.legend()
275
- ax_loss.set_box_aspect(1)
276
-
277
- fig.canvas.draw_idle()
278
- plt.tight_layout()
279
- plt.ion()
280
- plt.show()
281
-
282
- # --- Boucle principale d’entraînement ---
283
- for epoch in tqdm(range(num_epochs), desc="train iter"):
284
- perm = torch.randperm(n_samples, device=device) # permutation aléatoire des indices
285
- epoch_loss = [0.0 for _ in nets] # stockage des pertes par MLP pour l'époque
286
-
287
- # --- Mini-batchs ---
288
- for k, net in enumerate(nets):
289
- for i in range(0, n_samples, batch_size):
290
- idx = perm[i:i+batch_size]
291
-
292
- def closure():
293
- """Calcul de la loss et backpropagation pour un mini-batch."""
294
- net.optim.zero_grad(set_to_none=True)
295
- with autocast(dev):
296
- loss = net.crit(net.model(net.encoding(inputs[idx])), outputs[idx])
297
- scaler.scale(loss).backward()
298
- return loss
299
-
300
- loss = closure()
301
- scaler.step(net.optim)
302
- scaler.update()
303
- epoch_loss[k] += loss
304
-
305
- # --- Stockage des pertes de l'époque ---
306
- net.losses.append(epoch_loss[k])
307
-
308
- # --- Mise à jour visuelle si mode interactif ---
309
- if visual:
310
- with torch.no_grad():
311
- # Mise à jour des images prédictions
312
- [im.set_data(nets[k](inputs).reshape(h, w, 3)) for k, im in enumerate(ims_preds)]
313
- # Mise à jour des courbes de pertes
314
- all_losses = [[loss.item() for loss in net.losses] for net in nets]
315
- [line.set_data(np.arange(1, len(all_losses[k])+1), all_losses[k]) for k, line in enumerate(lines)]
316
- ax_loss.set_xlim(1, max(len(lst) for lst in all_losses))
317
- ax_loss.set_ylim(0, max(max(lst) for lst in all_losses))
318
- clear_output(wait=True)
319
- display(fig)
320
-
321
- # --- Fin du mode interactif ---
322
- if visual:
323
- plt.ioff()
324
- train.help = fPrintDoc(train)
@@ -1,10 +0,0 @@
1
- NeuralNetworks/Dependances.py,sha256=gtuEuktxDL9fHwPET58k2vGSqWJd7AAZCHW4DPHyc18,8508
2
- NeuralNetworks/Image.py,sha256=qhTYBTCOO8_8_vYH9Su9luH9iq96ovDfZw9mTKifKVY,4013
3
- NeuralNetworks/MLP.py,sha256=A86dJTxizUbJleKi-Cvp1W5sySUXZmn8FFvMzkwXR7E,22438
4
- NeuralNetworks/Plot.py,sha256=yQc1JaQftvkzzT6sLfW9N41v-7lmVq463IZYiKDEzfs,12017
5
- NeuralNetworks/__init__.py,sha256=d6Fww0fIZKZtc7N4i3UZFQhhLRAwXskXwzBC8MOFcrA,4742
6
- neuralnetworks-0.1.12.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
7
- neuralnetworks-0.1.12.dist-info/METADATA,sha256=kDpS5DM8Hdc02MWff8ars_zyEqSF6s1y1EDC5jGArOU,11974
8
- neuralnetworks-0.1.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
9
- neuralnetworks-0.1.12.dist-info/top_level.txt,sha256=h18nmC1BX7avyAAwKh0OQWezxgXmOpmVtbFq-8Mcbms,15
10
- neuralnetworks-0.1.12.dist-info/RECORD,,