Ladattu: 18.2.2023, 16.25
Hyvältä näyttää! Ohjelma toimii odotetulla tavalla ja hyvin. 98%+ tarkkuus alkaa olemaan jo aika kova! Myös GUI on ollut kiva lisäys projektiin ja antaa käyttäjälle mahdollisuuden visualisoida neuroverkon forwardprop funktiota hyvin.
Muutamia kommentteja tuli mieleen:
- Datasetin hoito? Onko datasetin koneelle lataukseen jokin erityinen syy?
Komento:
poetry run invoke dowloadmnist
Ei datasettiä ainakaan itselläni lataa koneelle ja sen seurauksena en saa neuroverkon treenaamista käyntiin. Tensorflowin tf.keras.datasets funktiolla saisi suoraan nätisti datat ohjelman muistiin ja ei tarvitsisi erikseen käyttäjän koneelle latailla suurehkoja tiedostoja.
-
Projektin arkkitehtuuri on toteutettu hiukan sekavalla tavalla. Mielestäni jakamalla ohjelman luokkiin saataisiin helppolukuisempi lopputulos. Tämä ei tässä tilanteessa kovin isoa työtä vaatisi ja riittäisi vain siirtää nykyiset utility.py funktiot luokan sisään ja tehdä niistä sen luokan metodeja.
-
Itse koodissa on mielestäni parantamisen varaa. Koodissa on jonkin verran kovakoodattuja osia esim. numero 48000, joka oletettavasti kuvaa training samplesi kokoa esiintyy pariin otteeseen:
mini_batches = [data[j:j + batchsize] for j in range(0, 48000, batchsize)]
Entä jos mallia halutaan treenata eri kokoisella training setillä?
Myös gui.py filussa esiintyy seuraava line:
predictedout = activations[f'A4']
Tekee neuroverkon layerien muuttamisesta hankalaa, sillä tämä viittaa outputlayeriin, mutta olettaa, että output layer on aina samalla indeksillä.
Nämä kovakoodaukset olisi helppo fixata myös tuolla tavalla, että jaat ohjelman luokkiin, niin voit luokan initalisaatiossa spesifioida esim.
NeuralNetwork(..., training_set_size=48000)
# Sitten def __init__ seuraavanlaisesti:
self.training_set_size = training_set_size
- Koodista löytyy useita "turhia" kommentteja, varmaan unohtuneet sinne, mutta vaikeuttaa koodin lukemista. Tässä pari jotka jäi mieleen:
# hardcoded thinks that training will be with whole dataset this will not stay
#######################################################################
# ___________GRADIEN_DESC, ACCURACY, PREDICTS, MONITORING______________#
#############
# TiraLab #
# 2023/III #
# Author: #
# Juuso S #
# #
#############
Tarvitseeko seuraavan osan myöskään olla itse koodissa? Tämä sopisi enemmän mielestäni dokumentaation puolelle:
#########################################################################################################################################################
# #
# Set the wanted layers and other setable hyperparams #
# 333 ___________HIDDEN LAYERS I-III_____________ #
# | L1(in) L2 L3 L4 L5(out) | #
# Right now im experiementing with this: | 784 | 256 | 256/2 | 256/2/2 | 10 | ;model with 3 hidden layers. #
# |_________________________________________| #
# #
# these seems to get good outputs more tuning will be doned #
# #
# with alpha = 0.5 , it seems like going above 25 epoch does not change much and above 90 can be found around 10 epoch , 25 epoch yielded 0.02 better. #
# alpha 0.5 :: 15epoch = 0.9191 , 20epoch = 0.9223, 25epoch = 0.926 , 50epoch = 0.9384, 75epoch = 0.9476// 200 = 0.9517 #W TEST DATA #
# it takes about 5080 sek to train 75 epoch, with batching = sized 190 epoch 200 === testacc == 0.9601. with batching size 10 and epochs =150 tacc=0.9774 #
# #
# 0.9801 with layer above lr = 0.02 epoch 150 batching in 10 samples #
#########################################################################################################################################################
- Koodissa weights & biases tallennetaan hashmappiin. Nopeuden kannalta tämä on hyvä tapa hoitaa tallennus, mutta hashmapin avaimet on nimetty mielestäni sekavasti, esim.
gradients[f'dW{layer}'] = 1 / trainingsize * \
np.dot(derivatives[f'dZ{layer}'], activations[f'A{layer-1}'].T)
gradients[f'db{layer}'] = 1 / trainingsize * \
np.sum(derivatives[f'dZ{layer}'], axis=1, keepdims=True)
dW ja db oletettavasti viittaa delta_weights ja delta_biases, mutta selkeyden kannalta ehkä parempi olisi nimetä ne kuvailevammin.
- GUI ei tunnista numeroita, jotka piirretään GUI:n reunoille.
Tässä oli muutamia kommentteja joita itsellä heräsi mieleen koodia lukiessa, kuten sanoin projekti toimii hyvin ja kuten kuuluukin. Kiva myös, että olet lisännyt tuen sigmoidille ja relulle jolloin käyttäjä voi halutessaan kokeilla treenaamista molemmilla aktivaatiofunktioilla.
Kovakoodatut kohdat ja treenidatan händläämisen kun vielä saa fixattua niin alkaa olemaan jo hyvin käyttäjä ystävällinen projekti.