Forse dovrei impostare le aspettative corrette all'inizio: la soluzione migliore potrebbe non essere orientata agli oggetti (OO). Dovresti usare quello che è il più appropriato, non quello che è l'idea OO più pura.
Lavori principalmente in Python o in uno dei linguaggi specifici del dominio (DSL) utilizzati per l'addestramento alla rete neurale?
Puoi provare a rifattorizzare il codice da ad es. totale 150 linee, suddiviso in diverse funzioni. Queste funzioni sono riutilizzabili tra le tue varianti di programmi. Dopo aver effettuato il refactoring (funzioni riutilizzabili estratte), discuti con i membri del tuo team in modo che tutti sappiano che hai fornito loro queste funzioni, in modo che possano usarle. Le funzioni riutilizzabili condivise all'interno di una squadra richiedono uno sforzo moderato nella manutenzione del codice.
Alcune tecniche necessarie per risolvere il problema (come "polimorfismo", "interfaccia / implementazione", "funzioni di ordine superiore" o semplicemente exec()
/ eval()
), dipendono dal fatto che siano consentite linguaggio. La maggior parte delle lingue proverà a fornire almeno un modo per risolvere questo particolare problema, tuttavia i DSL potrebbero non fornirne alcuno. (Ad esempio, i linguaggi di programmazione GPU non ne hanno.) In tal caso, potresti dover fare parte della programmazione (il ciclo esterno) in Python, chiamando nel DSL per piccoli pezzi di attività.
In altri casi, potresti dover usare Python per generare il codice sorgente per il DSL, formattando e concatenando le stringhe e scrivendole in un file di testo che può essere usato come un file sorgente per il DSL.
Per dare risposte più utili e specifiche, prova a spiegare meglio la tua situazione. Prova a spiegare con lo pseudo-codice. Sarà anche specifico per la lingua. Direi che Python è progettato per risolvere questo particolare problema per gli scienziati meglio di altri linguaggi.
Un esempio di caricamento e salvataggio ai punti di controllo intermedi assomiglia a questo:
(Pseudo-codice)
// code for step 7
if (min_step <= 7) and (max_step >= 7)
if (input_for_step_7 == null)
if (step_7_input_filename == null)
throw error ("either need execute step 6 or need input file for step 7")
else
input_for_step_7 = load_input_for_step_7(step_7_input_filename)
end
end
assert(input_for_step_7 != null)
output_for_step_7 = execute_step_7(input_for_step_7)
save_output_step_7(output_for_step_7)
end // min_step, max_step
Nell'addestramento della rete neurale, "registra e riproduci" sono ancora utili, ma hanno i loro limiti.
Questo perché le modifiche di un passo dell'algoritmo cambieranno fondamentalmente le caratteristiche del suo output. Pertanto, per testare gli effetti della modifica di un passo dell'algoritmo, l'intera catena di passaggi dell'algoritmo deve essere rieseguita. Quindi, l'idea di "provare in isolamento" è utile solo in senso limitato.