-
Notifications
You must be signed in to change notification settings - Fork 0
/
mnist
179 lines (133 loc) · 6.87 KB
/
mnist
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
##############################################################################################
# KI > Supervised Learning > Künstliche Neuronale Netze
##############################################################################################
# lade Pakete
using Flux, Images, MLDatasets, Plots, ProgressMeter
# brauchen spezielle Funktionen aus Flux
using Flux: crossentropy, onecold, onehotbatch, train!
# brauchen Paket aus dem Standumfang von Julia
using LinearAlgebra, Random, Statistics
# setzen Zufallsgrundwert (Random seed), um Beispiel reproduzierbar zu machen
Random.seed!(1)
################################################################################################
# Laden des Datensatzes
################################################################################################
X_train_raw, Y_train_raw = MLDatasets.MNIST(split=:train)[:];
################################################################################################
# Laden des Testdatensatzes
################################################################################################
X_test_raw, Y_test_raw = MLDatasets.MNIST(split=:test)[:];
################################################################################################
# Wir haben 60.000 Trainingsbilder mit 28x28-Pixel
################################################################################################
size(X_train_raw)
################################################################################################
# Wie wird das Bild dargestellt? --> Zahlen zwischen 0 und 1
################################################################################################################################
index = 1;
X_train_raw[:,:,index]
scatter(X_train_raw[:,:,index]',legend=false)
################################################################################################
# ein Bild sieht folgendermaßen aus
################################################################################################
img = X_train_raw[:,:,index];
colorview(Gray,img')
################################################################################################
# Welche Zahl ist das? -> Label für Bild, d.h. Zahl, die auf Bild gezeigt wird
################################################################################################
Y_train_raw[index]
################################################################################################
# Testdatensatze --> 10.000 Testbilder
################################################################################################
size(X_test_raw)
test_img = X_test_raw[:,:,1];
colorview(Gray,test_img')
Y_test_raw[1]
################################################################################################
# Vorbereitungsschritte
################################################################################################
# jedes Bild (Matrix) wird in einen Vektor transformiert
x_train = Flux.flatten(X_train_raw)
x_test = Flux.flatten(X_test_raw)
# aus Speichergründen führt man Label ein one-hot-Encoding ein
y_train = onehotbatch(Y_train_raw,0:9)
y_test = onehotbatch(Y_test_raw,0:9)
################################################################################################
# Flux ist ein Deeplearning Toolkit
################################################################################################
model = Chain(
Dense(28 * 28, 32, relu),
Dense(32, 10),
softmax
)
################################################################################################
# Definition der Verlust-Funktion
################################################################################################
loss(x,y) = crossentropy(model(x),y)
################################################################################################
# Initialisierung der Parameter
################################################################################################
ps = Flux.params(model)
################################################################################################
# Wahl des Optimierungsansatzes
# ADAM = adaptive moment estimation
################################################################################################
learning_rate = 0.01
opt = ADAM(learning_rate)
################################################################################################
# Trainieren des Modelles
################################################################################################
loss_history = []
epochs = 500
#@showprogress
for epoch in 1:epochs
# trainieren des Modelles
train!(loss,ps,[(x_train,y_train)], opt)
# Ausgabe
train_loss = loss(x_train,y_train)
push!(loss_history, train_loss)
print("Epoche= $epoch : Verlust = $train_loss")
end
################################################################################################
# Vorhersage mittels des Modelles
################################################################################################
y_predicted_raw = model(x_test)
################################################################################################
# Konvertiere Index-Zahlen in Label
################################################################################################
y_predicted = onecold(y_predicted_raw).-1
################################################################################################
# Vergleiche vorgesagte Label mit Testdatensatzen Label
################################################################################################
result = y_predicted .== Y_test_raw
################################################################################################
# Berechne der Durchschnitt der korrekt vorhergesagten Label
################################################################################################
mean(result)
################################################################################################
#
index = collect(1:length(Y_test_raw))
checkdisplay = [index y_predicted Y_test_raw result]
vscodedisplay(checkdisplay)
################################################################################################
# Falsch erkannt ist zum Beispiel Eintrag 9
################################################################################################
index_falsch_erkannt = 9
img_falsch_erkannt = X_test_raw[:,:,index_falsch_erkannt];
colorview(Gray,img_falsch_erkannt')
# Laut Datensatz ist es eine
Y_test_raw[index_falsch_erkannt]
# laut Model ist es eine
y_predicted[index_falsch_erkannt]
################################################################################################
# Verlust-Kurve
################################################################################################
gr(size = (600,600))
p_l_curve = plot(1:epochs, loss_history,
xlabel = "Epochen",
ylabel = "Verlust",
title = "Lernkurve",
legend = false,
color = :blue,
linewidth = 2
)