====== Une I.A. en 50 lignes de code ======
**{{tagpage>ia|Intelligence Artificielle}}** **[[http://translate.google.com/translate?hl=&sl=auto&tl=en&u=https%3A%2F%2Fressources.labomedia.org%2Funeiaen50lignesdecode|English Version]]**
**[[les_pages_intelligence_artificielle_en_details|Les Pages Intelligence Artificielle en détails]]**
Une **intelligence artificielle** qui reconnaît les chiffres manuscrits avec un **taux de succès de 95%**, en **50 lignes de Python** seulement, possible ?
(sans tricher avec une librairie comme Tensorflow qui ferait le travail à notre place)
=====Possible ? Oui!=====
L'exécution prend 3 minutes environ, et parcourt les 60 000 chiffres manuscrits de la base de données [[https://en.wikipedia.org/wiki/MNIST_database|MNIST]] (provenant de la Poste américaine IIRC) à télécharger auparavant: [[http://gget.it/in1c/mnist.npz|mnist.npz]].
Résultat:
> 59994
> 59995
> 59996
> 59997
> 59998
> 59999
> Testing...
> Accuracy: 95.5 %
La structure du réseau de neurones est la suivante: 4 couches:
* couche d'entrée: 784 (=une image 28x28 pixels)
* couche cachée: 100
* couche cachée: 100
* couche de sortie: 10 (la valeur la plus élevée donne le chiffre prédit par l'I.A.)
import numpy as np, cv2
def sigmoid(x): return 1 / (1 + np.exp(-x))
def sigmoid_prime(z): return z * (1 - z)
def relu(x): return np.maximum(0, x)
def relu_prime(z): return np.asarray(z > 0, dtype=np.float32)
layers = [784, 100, 100, 10]
activations, learningrate = [relu, relu, sigmoid], 0.1
if __name__ == "__main__":
f = np.load('mnist.npz')
x_train, y_train = f['x_train'], f['y_train']
x_test, y_test = f['x_test'], f['y_test']
x_train = x_train.reshape(60000, 784) / 255.0
x_test = x_test.reshape(10000, 784) / 255.0
s = np.arange(len(x_train))
np.random.shuffle(s)
x_train, y_train = x_train[s], y_train[s]
Y = np.eye(10, 10)
activations_prime = [globals()[f.__name__ + '_prime'] for f in activations]
A = {}
W = [np.random.randn(layers[k+1], layers[k]) / np.sqrt(layers[k]) for k in range(len(layers)-1)]
print("Training...")
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
for i, (a, d) in enumerate(zip(x_train, y_train)):
print(i)
cv2.imshow("img", a.reshape(28,28))
cv2.waitKey(1)
a = np.array(a, ndmin=2).T
A[0] = a
for k in range(len(layers)-1):
z = np.dot(W[k], a)
a = activations[k](z)
A[k+1] = a
da = a - Y[:,[d]]
for k in range(len(layers)-2, -1, -1): # la fameuse "backpropagation"
dz = da * activations_prime[k](A[k+1])
dW = np.dot(dz, A[k].T)
da = np.dot(W[k].T, dz)
W[k] -= learningrate * dW
print("Testing...")
S = 0
for a, d in zip(x_test, y_test):
for k in range(len(layers)-1):
a = activations[k](np.dot(W[k], a))
if np.argmax(a) == d:
S += 1
print("Accuracy: %.1f %%" % (100.0 * S / len(x_test)))
np.save('weights', W)
===== Comment tester cette I.A. sur votre propre chiffre scanné/photographié/dessiné ? =====
A venir si ça intéresse des gens :)
{{tag> digitrecognition ia joseph numpy opensource python }}