""" ................................................ Számjegyfelismerés MLP-vel (MNIST, scikit-learn) ................................................ """ print(__doc__) import matplotlib.pyplot as plt from sklearn.datasets import fetch_mldata from sklearn.neural_network import MLPClassifier from sklearn.metrics import confusion_matrix import numpy as np import time mnist = fetch_mldata('MNIST original') X,y = mnist.data/255 , mnist.target X_train, X_test = X[:60000], X[60000:] # első 60ezer sor: training points, utolsó 10ezer: test points y_train, y_test = y[:60000], y[60000:] # egy kép ábrázolása v=mnist.data[7000,:] plt.matshow(v.reshape(28,28),cmap=plt.cm.gray) plt.show() # hálózat megszerkesztése mlp = MLPClassifier(hidden_layer_sizes=(100,100), max_iter=30,solver='sgd', verbose=True,learning_rate_init=.1, early_stopping=True,validation_fraction=0.3) # early_stopping: beállít egy validáló halmazt (itt 30%), és ha ezen csökken a pontosság, leállítja a tanítást # tanítás start_time = time.time() mlp.fit(X_train, y_train) print('A tanítás befejeződött!') print('Ennyi ideig tartott: {0} mp'.format(time.time()-start_time)) print('Pontosság a tanítóhalmazon: {0}%'.format(mlp.score(X_train, y_train)*100)) print('Pontosság a teszthalmazon: {0}%'.format(mlp.score(X_test, y_test)*100)) # egy súly ábrázolása w=mlp.coefs_[0][:,20] plt.matshow(w.reshape(28,28),cmap=plt.cm.gray) plt.show() # több súly ábrázolása fig, axes = plt.subplots(4, 4) for coef, ax in zip(mlp.coefs_[0].T, axes.ravel()): ax.matshow(coef.reshape(28, 28), cmap=plt.cm.gray) ax.set_xticks(()) ax.set_yticks(()) plt.show() # tévesztési mátrix y_true = y_test y_pred = mlp.predict(X_test) print(confusion_matrix(y_true, y_pred)) # hibásan osztályozott képek indexei rosszak=np.empty(0,dtype=int) for i in range(10000): if mlp.predict([X_test[i,:]])!=y_test[i]: rosszak=np.append(rosszak,i) print(rosszak) # hibásan osztályozott képek indexei print(len(rosszak)) # az előző vektor hossza: hány hibás osztályozás van a 10.000 tesztpontból? # kirajzoltatunk egy hibásan osztályozott képet i=4280 # ide egy olyan index kell, ami a "rosszak" vektor egy eleme v=X_test[i,:] # a 10ezer elemű teszthalmaz i. eleme plt.matshow(v.reshape(28,28),cmap=plt.cm.gray) # ezt a képet ábrázoljuk plt.show() print('A fenti kép a hálózat szerint:', mlp.predict([X_test[i,:]])[0]) print('Igazából:', y_test[i])