Acest proiect implementează o rețea neurală pentru recunoașterea cifrelor scrise de mână din dataset-ul MNIST, folosind JavaFX pentru interfața grafică și o implementare proprie de rețea neurală. Aplicația permite crearea, antrenarea și testarea modelelor de rețele neurale cu arhitecturi configurabile.
- Java 17 - Limbajul de programare principal
- JavaFX 17 - Framework pentru interfața grafică
- DeepLearning4J - Pentru încărcarea și procesarea dataset-ului MNIST
- Jackson - Pentru serializarea/deserializarea modelelor în format JSON
- Maven - Build tool și dependency management
src/
├── main/
│ ├── java/org/example/mnistann/
│ │ ├── Main.java # Clasa principală de lansare
│ │ ├── controllers/ # Controllere JavaFX
│ │ │ ├── ApplicationController.java # Controller pentru meniul principal
│ │ │ ├── CreateModelController.java # Controller pentru crearea modelelor
│ │ │ ├── TestModelController.java # Controller pentru testarea modelelor
│ │ │ └── HelloController.java # Controller de test
│ │ ├── neuralnetwork/ # Implementarea rețelei neurale
│ │ │ ├── ForwardNeuralNetwork.java # Clasa abstractă de bază
│ │ │ └── DigitsNN.java # Implementarea specifică pentru cifre
│ │ └── utils/ # Utilitare matematice
│ │ └── Maths.java # Funcții matematice
│ └── resources/
│ ├── org/example/fxml/ # Fișiere FXML pentru UI
│ │ ├── application-view.fxml # Meniul principal
│ │ ├── create-model-view.fxml # Interfața de creare modele
│ │ ├── test-model-view.fxml # Interfața de testare
│ │ └── hello-view.fxml # View de test
│ └── models/ # Director pentru salvarea modelelor
Locație: src/main/java/org/example/mnistann/Main.java
Clasa principală care lansează aplicația JavaFX.
public class Main extends ApplicationResponsabilități:
- Inițializarea aplicației JavaFX
- Încărcarea view-ului principal
Locație: src/main/java/org/example/mnistann/controllers/ApplicationController.java
Controller pentru meniul principal al aplicației.
Câmpuri principale:
VBox mainContainer- Container principal UIButton createModelButton- Buton pentru crearea modelelorButton testModelButton- Buton pentru testarea modelelor
Metode:
onCreateModelClick()- Navighează la interfața de creare modeleonTestModelClick()- Navighează la interfața de testareloadScene(String fxmlFile)- Încarcă o nouă scenă FXML
Locație: src/main/java/org/example/mnistann/controllers/CreateModelController.java
Controller pentru configurarea și antrenarea modelelor.
Câmpuri de configurare:
@FXML private TextField inputSizeField; // Dimensiunea input-ului
@FXML private TextField hiddenLayersField; // Numărul de straturi ascunse
@FXML private TextField hiddenSizesField; // Dimensiunile straturilor ascunse
@FXML private TextField outputSizeField; // Dimensiunea output-ului
@FXML private CheckBox initZeroCheck; // Inițializarea cu zero
@FXML private TextField epochsField; // Numărul de epoci
@FXML private TextField learningRateField; // Rata de învățare
@FXML private TextField trainSizeField; // Dimensiunea setului de antrenare
@FXML private TextField testSizeField; // Dimensiunea setului de test
@FXML private TextField batchSizeField; // Dimensiunea batch-ului
@FXML private TextArea consoleArea; // Consolă pentru outputMetode principale:
onSaveClick()- Salvează configurația introdusăonStartTrainingClick()- Începe antrenarea modelului în thread separatonBackClick()- Navighează înapoi la meniul principalsaveModelToJson(DigitsNN model, String filename)- Salvează modelul în format JSON
Tipare de denominare:
- Câmpurile UI se termină cu
FieldsauArea - Butoanele se termină cu
Button - Metodele pentru evenimente încep cu
onurmat de numele acțiunii șiClick
Locație: src/main/java/org/example/mnistann/neuralnetwork/ForwardNeuralNetwork.java
Clasa abstractă de bază pentru rețele neurale feed-forward.
Câmpuri principale:
private final int inputSize; // Dimensiunea input-ului
private final int numberOfHiddenLayers; // Numărul de straturi ascunse
private final int[] hiddenLayersSize; // Dimensiunile straturilor ascunse
private final int outputSize; // Dimensiunea output-ului
private double[][][] weights; // Matricile de greutăți [strat][neuron_intrare][neuron_ieșire]
private double[][] biases; // Vectorii de bias-uri [strat][neuron]
private Function<Double, Double>[] activationFunctions; // Funcțiile de activare
private Function<Double, Double>[] activationDerivatives; // Derivatele funcțiilor de activareConstructor:
public ForwardNeuralNetwork(int inputSize, int numberOfHiddenLayers,
int[] hiddenLayersSize, int outputSize,
Boolean initializeWith0)Metode principale:
initializeNetwork()- Inițializează structura rețeleiinitializeWeightsXavier()- Inițializează greutățile folosind metoda XavierfeedForward(double[] input)- Propagarea înaintebackpropagation(double[] input, double[] expectedOutput, double learningRate)- Algoritm de backpropagationtrain(...)- Metodă abstractă pentru antrenare
Funcții de activare:
- Straturile ascunse folosesc ReLU (Rectified Linear Unit)
- Stratul de ieșire folosește Sigmoid
Locație: src/main/java/org/example/mnistann/neuralnetwork/DigitsNN.java
Implementarea specifică pentru recunoașterea cifrelor MNIST.
Constructor:
public DigitsNN(int inputSize, int numberOfHiddenLayers,
int[] hiddenLayersSize, int outputSize,
Boolean initializeWith0)Metode de antrenare:
// Antrenare cu output în consolă
public void train(int epochs, double learningRate, int trainSize,
int testSize, int batchSize) throws IOException
// Antrenare cu output în UI TextArea
public void train(int epochs, double learningRate, int trainSize,
int testSize, int batchSize, TextArea consoleArea) throws IOExceptionMetode private:
computeAccuracy(DataSetIterator dataSetIterator, int dataSize)- Calculează acuratețea
Locație: src/main/java/org/example/mnistann/utils/Maths.java
Clasă utilitară cu funcții matematice necesare.
Metode:
public static double[] matrixMultiplication(double[] vector, double[][] matrix) // Înmulțirea matrice-vector
public static double relu(double x) // Funcția ReLU
public static double reluDerivative(double x) // Derivata ReLU
public static double sigmoid(double x) // Funcția Sigmoid
public static double sigmoidDerivative(double x) // Derivata Sigmoid- camelCase pentru variabile și metode:
inputSize,numberOfHiddenLayers - PascalCase pentru clase:
ForwardNeuralNetwork,DigitsNN - SCREAMING_SNAKE_CASE pentru constante
- Metodele pentru evenimente UI încep cu
on:onSaveClick(),onBackClick() - Câmpurile UI au sufixe descriptive:
Field,Button,Area
int- pentru dimensiuni, numere de straturi, indicidouble- pentru valori numerice (greutăți, bias-uri, rate de învățare)double[]- pentru vectori (input, output, activări)double[][]- pentru matrici de bias-uridouble[][][]- pentru tensori de greutăți (3D: [strat][neuron_intrare][neuron_ieșire])Function<Double, Double>- pentru funcții de activare și derivatele lor
IOExceptionpentru operațiile de I/ONumberFormatExceptionpentru parsing-ul input-urilor numerice- Mesajele de eroare sunt afișate în
TextArea consoleArea
- Antrenarea se face într-un thread separat pentru a nu bloca UI-ul
Platform.runLater()pentru actualizarea UI-ului din thread-uri background
- Utilizatorul completează configurația în
create-model-view.fxml CreateModelController.onSaveClick()validează și salvează configurațiaCreateModelController.onStartTrainingClick()creează unDigitsNNși începe antrenarea- Modelul antrenat este salvat în format JSON în directorul
resources/models/
{
"inputSize": 784,
"numberOfHiddenLayers": 2,
"hiddenLayersSize": [128, 64],
"outputSize": 10,
"weights": [...],
"biases": [...],
"epochs": 10,
"learningRate": 0.01,
"trainSize": 1000,
"testSize": 200,
"batchSize": 32
}- Input size: 784 (28x28 pixeli)
- Hidden layers: 2-3 straturi
- Hidden sizes: [128, 64] sau [256, 128, 64]
- Output size: 10 (cifre 0-9)
- Learning rate: 0.01 - 0.001
- Epochs: 10-50
- Batch size: 32-128
- Creează clase noi în package-urile corespunzătoare
- Respectă convențiile de denominare existente
- Adaugă documentație în stilul JavaDoc
- Testează funcționalitatea în interfața grafică
- Extinde
ForwardNeuralNetworkpentru noi arhitecturi - Adaugă noi funcții de activare în
Maths.java - Implementează noi algoritmi de optimizare
- Modifică fișierele FXML pentru aspectul vizual
- Adaugă noi controllere pentru funcționalități complexe
- Respectă pattern-ul MVC existent
Proiectul folosește următoarele dependințe principale:
org.openjfx:javafx-controls:17.0.6org.deeplearning4j:deeplearning4j-core:1.0.0-beta7org.nd4j:nd4j-native:1.0.0-beta7com.fasterxml.jackson.core:jackson-databind:2.15.2
Pentru lista completă, consultă pom.xml.
# Compilare și rulare
mvn clean javafx:run
# Doar compilare
mvn clean compile- Rețeaua folosește Xavier initialization pentru greutăți
- Algoritmul de optimizare este Gradient Descent simplu
- Dataset-ul MNIST este încărcat automat prin DeepLearning4J
- Modelele sunt salvate în format JSON pentru portabilitate
- UI-ul este responsive și oferă feedback în timp real