(*Przykład jest zaczerpnięty z dokumentacji: tutorial/NeuralNetworksOverview*)

(*Import danych zawierających próbki pisma (cyferki 0 .. 9) wraz właściwą cyfrę. Najpierw importujemy dane do szkolenia sieci neuronowej:*)

trainingData=ResourceData["MNIST","TrainingData"];

(*Teraz zaimportujemy dane do veryfikacji - czy nasza sieć została prawidłowo przeszkolona?*)

testData=ResourceData["MNIST","TestData"];

(*Wypiszmy sobie jeden przykład z testData, RandomChoice wybiera losowo jeden element listy:*)

sample = RandomChoice[testData]

(*Teraz zaimportujemy sieć "LeNet". Uwaga wagi oraz bias (uprzedzenia) nie są jeszcze zainicjalizowane (uninitialized). Można nacisnąć symbol + aby zobaczyć strukturę sieci:*)

model = NetModel["LeNet"]

(*Następnym krokiem jest szkolenie modelu. W każdej iteracji algorytmu wagi oraz uprzedzenia będą podlegały drobnym zmianom. Te zmiany parametrów sieci są wykonywane w bardzo sprytny sposób - ich celem jest minimalizacja tzw funkcji straty. W naszym wypadku im sieć gorzej sobie radzi z klasyfikowaniem próbbek ręcznego pisma do odpowiedniej cyferki - tym większa funkcja straty. Dodatkowym parametrem jest ValidationSet. Dane podane do ValidationSet, testData, nie są wykorzystywane w szkoleniu ale dzięki nim można na bierząco sprawdzić jak dobrze, w kolejnych iteracjach, radzi sobie sieć. Dlaczego w tym celu nie powinno się korzystać z trainingData? Jest to związane z problemem nadmiernego dopasowania. Zachęcam aby poczytać więcej o tym problemie.*)

trainedModel = NetTrain[model , trainingData ,ValidationSet->testData]

(*sprawdźmy jak wyszkolona sieć radzi sobie z losowym przykładem:*)

{trainedModel[sample[[1]]] , sample[[2]]}

(*Narysujmy jeszcze macierz pomyłek. Bardzo proszę policzyć tą macierz innym sposobem:*)

ClassifierMeasurements[trainedModel , testData , "ConfusionMatrixPlot"]