{"cells":[{"metadata":{"_uuid":"2ab3cfab33dc24617b18938419fef1ea046d6222"},"cell_type":"markdown","source":"Dies ist ein Kernel, das an der Competition Digit Recognizer teilnimmt. \n\nEinzelne Schritte werden in Textzellen zwischen dem Code erklärt."},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"_kg_hide-input":false,"_kg_hide-output":false},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Activation, Dropout\nfrom keras.utils.np_utils import to_categorical\n\n# Input data files are available in the \"../input/\" directory.\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"2d806bdfd1062baa73d3080c9623e383b04ed1fd"},"cell_type":"markdown","source":"Im Input-Ordner kann das Dataset der Competition abgespeichert werden. Danach hat man hier Zugriff darauf.\n\nZunächst werden diese Daten geladen.\nEin Datensatz in diesen CSV-Dateien repräsentiert ein Bild von einer handgeschriebenen Zahl von Null bis Neun. Ein Bild hat die Größe 28x28 Pixel, also 784 gesamt. Das Bild liegt in Graustufen vor und dehalb hat jeder Pixel einen entsprechenden Wert.\nEin Datensatz ist also eine Liste an Werten für jeden der 784 Pixel."},{"metadata":{"_kg_hide-input":false,"trusted":true,"_uuid":"5a8de066f401029a05f93a37326290154d6d1832"},"cell_type":"code","source":"# Load Train and Test data\ntrain = pd.read_csv('../input/train.csv')\ntest = pd.read_csv('../input/test.csv')","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":false,"_uuid":"4b3d259fde76c02d702ebe5d2a2c91931984f5a3"},"cell_type":"markdown","source":"Der Trainingsdatensatz hat 42000 Zeilen und 785 Spalten.\nUrsprünglich beinhalten die Datensätze eine weitere Zeile. Diese Kopfzeile gibt die Namen für die Spalten an und wird bei pd.read_csv bereits rausgefiltert (Standardverhalten ist header=0, was bedeutet, dass die erste Zeile der Header ist. Mit header=none würde diese Zeile mit eingelesen werden.)\n\nDer Testdatensatz hat 28000 Zeilen und 784 Spalten. \n\nDer Trainingsdatensatz hat eine Spalte mehr, da die erste Spalte für die Labels gedacht ist. Die Label beinhalten die Zahl, die auf dem Bild zu sehen ist. Somit kann man beim Trainingsprozess prüfen, ob die richtige Zahl erkannt wurde."},{"metadata":{"_kg_hide-output":false,"_kg_hide-input":false,"trusted":true,"_uuid":"ac25718455a5e989bdab8e52bc5bb5f9f1957315"},"cell_type":"code","source":"print(\"Trainings-Datensatz: (Zeilen, Spalten)\")\nprint(train.shape)\n\nprint(\"Test-Datensatz: (Zeilen, Spalten)\")\nprint(test.shape)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"c49d06370b64bd61bc2caf51b31a87b1b3f4a49f"},"cell_type":"markdown","source":"Als nächstes werden die Labels aus dem Trainingsdatensatz separat abgespeichert und anschließend aus dem Trainingsdatensatz entfernt."},{"metadata":{"trusted":true,"_uuid":"78d50e6d21d26208d69018f918168597025e9367"},"cell_type":"code","source":"# separting 'label' column from train dataset\ntrain_label = train[\"label\"]\n\n# dropping 'Label' column \n## axis = 1 gibt an, dass die gesamte Spalte von \"label\" genommen wird\n## .values erstellt eine Numpy-Repräsentation der Daten\ntrain = train.drop(\"label\", axis = 1).values","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"3acb4e41ad740bfbb4f4f64482efedaf56f3c8fc"},"cell_type":"markdown","source":"Dann werden die Daten normalisiert. \nEin Pixel-Wert ist eine Zahl zwischen 0 und 255.\nSchränkt man die Spanne der Werte ein, wird das Maschinenlernen dadurch vereinfacht.\nAlle Werte werden durch 255 geteilt, damit nur noch Werte zwischen 0 und 1 vorkommen."},{"metadata":{"trusted":true,"_uuid":"658eae45d99570b02117239f0b54b912096eb1d8"},"cell_type":"code","source":"# Normalizing the data\ntrain = train/255.0\ntest= test/255.0","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"c676e1fe82e30b5c6bb729d9f73afc7f47ee3715"},"cell_type":"markdown","source":"Jede Zeile der Labels gibt den Wert der Zahl auf dem Bild an. Das ist unvorteilhaft, da zum Beispiel Beziehungen zwischen den Zahlen gezogen werden können, die unerwünscht sind ( 5 ist größer als 2 etc).\nDie Daten werden in eine Matrix umgewandelt. Jede Zeile entspricht einem Datensatz und jede Spalte einen Wert, der angenommen werden kann (0-9). Hatte das Label vorher den Wert 5 wird dies durch eine 1 in der fünften Spalte dargestellt. Die restlichen Zellen in der Zeile sind mit Nullen gefüllt.\n\nBsp:\n\n*0  1  2  3  4  5  6  7  8  9*\n\n0  0  0  0  0  0  1  0  0\n\n0  0  1  0  0  0  0  0  0\n\n0  0  0  1  0  0  0  0  0\n\n0  1  0  0  0  0  0  0  0\n\n0  0  0  0  0  1  0  0  0\n\n1  0  0  0  0  0  0  0  0\n"},{"metadata":{"trusted":true,"_uuid":"0bdc20f88fd0562d8536f92bfde684cb3f1d3df2"},"cell_type":"code","source":"# label encoding of train_label dataset which has category of 0 to 9 values using one hot encoding\ntrain_label = to_categorical(train_label)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"4738c148c2023e78d7c889bde953de55c41261f0"},"cell_type":"markdown","source":"Nun wird das neuronale Netz gebaut.\n\nMLP = Multilayer Perzeptron\n\n-> \"Das Perzeptron (nach engl. perception, „Wahrnehmung“) ist ein vereinfachtes künstliches neuronales Netz, ...\" *-Wikipedia*\n-> Mehrlagiges Perzeptron: Neuronales Netz mit mehreren Ebenen. Jedes Element einer Ebene ist mit jedem Element der nächsten Ebene verbunden.\n\nSequential --> linearer Stack von Layern\nDense --> =fully connected    Jeder Knoten eines Layers ist mit jedem Knoten aus dem nächsten Layer verbunden.\n128 Knoten\nInput_dim --> Anzahl der zu erwartenden Eingangswerte (hier 784)\n\nAktivierungsfunktion relu : ReLu (Rectified Linear Unit) (stückweise lineare Funktion)\nÄndert das Aktivierungslevel des Knotens, welcher dann auch weitergegeben wird. Das Aktivierungslevel bestimmt dann auch die Gewichtung, die dieser Knoten dann als Input für den nächsten Knoten hat.\n\nDropout: dünnt das Neuronale Netz aus, indem einzelne Knoten entfernt werden. damit wird Overfitting (Überanpassung) vermieden (Verschlechterung der Vorhersage, da sich das Netz an zu nah an einen Datensatz annähert und damit schlechter bei neuen Datensätzen abschneidet).\n\nDie Softmax-Funktion eignet sich besonders, wenn nur ein Ergebnis aus mehreren Möglichen erwartet wird. Softmax gibt an, welches Ergebnis am wahrscheinlichsten ist. Die Summe aller Wahrscheinlichkeiten ist 1."},{"metadata":{"trusted":true,"_uuid":"a2b1765be091743112b88bd346f3ea200e261d05"},"cell_type":"code","source":"# Here's a Deep Dumb MLP (DDMLP)\nmodel = Sequential()\nmodel.add(Dense(128, input_dim = 784))\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.10))\nmodel.add(Dense(128))\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.10))\n\nmodel.add(Dense(10))\nmodel.add(Activation('softmax'))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"4d1d36fe662794f9ee1aba83644e01c62342e200"},"cell_type":"markdown","source":"Die loss-Funktion gibt an, wie weit das Ergebnis von der richtigen Lösung auseinander liegt. Diese Funktion soll minimiert werden.\n\ncategorical_crossentropy hat einen logarithmischen Funktionsverlauf\n![](https://ml-cheatsheet.readthedocs.io/en/latest/_images/cross_entropy.png)\n\noptimizer passt die Lernrate an, damit das Lernen optimiert wird."},{"metadata":{"trusted":true,"_uuid":"851ab35340c3e6f3bba3e0d2d4abe774ff12a900"},"cell_type":"code","source":"# we'll use categorical xent for the loss, and RMSprop as the optimizer\nmodel.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"621446cdcdecf01bd716f232bf90d6334390c2ee"},"cell_type":"markdown","source":"epochs: Anzahl an Durchgängen des kompletten Datensatzes durchs Netz.\nbatch-size: gibt an, wie viele Datensätze am Stück durchs Netz gehen. Danach wird die Gewichtung angepasst und der nächste Satz durchgeschickt. Es werden 42000/64 Iterationen gebraucht, um eine Epoche zu durchlaufen.\nvalidation_split gibt an, wie viel Prozent des Trainingsdatensatzes zur Überprüfung des Trainings benutzt werden."},{"metadata":{"trusted":true,"scrolled":true,"_uuid":"48ea4149d608e3b1259975a5566bcecc6998fc3f"},"cell_type":"code","source":"print(\"Training...\")\nmodel.fit(train, train_label, epochs=20, batch_size=64, validation_split=0.2, verbose=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"971f0c57da90e137d8c38cfede0459e0efeef353"},"cell_type":"code","source":"print(\"Generating test predictions...\")\npreds = model.predict_classes(test, verbose=1)\n\ndef write_preds(preds, fname):\n    pd.DataFrame({\"ImageId\": list(range(1,len(preds)+1)), \"Label\": preds}).to_csv(fname, index=False, header=True)\n\nwrite_preds(preds, \"keras-mlp.csv\")\nprint(\"done\")","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"86b5b3a6f83828c30d0b7076afc3368da2870539"},"cell_type":"raw","source":""}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}