[PYTHON] J'ai essayé de mettre en œuvre un apprentissage en profondeur qui n'est pas profond avec uniquement NumPy

Afin de comprendre l'essence de l'apprentissage en profondeur, il est important de partir de zéro, mais MNIST est difficile à mettre en œuvre CNN et il faut du temps pour apprendre. Donc, cette fois, j'ai utilisé l'ensemble de données Iris pour implémenter très facilement un apprentissage en profondeur "non profond" à trois couches (une couche lorsque compté dans la couche intermédiaire), c'est-à-dire juste un réseau de neurones. C'est l'apprentissage par lots, pas par mini-lots, mais il inclut à la fois la descente de gradient et la rétropropagation d'erreur (mais pas de manière probabiliste). Concernant la théorie de l'apprentissage en profondeur, mon livre préféré [Deep Learning from scratch](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%] 8B% E3% 82% 89% E4% BD% 9C% E3% 82% 8BApprentissage en profondeur-% E2% 80% 95Python% E3% 81% A7% E5% AD% A6% E3% 81% B6% E3% 83 % 87% E3% 82% A3% E3% 83% BC% E3% 83% 97% E3% 83% A9% E3% 83% BC% E3% 83% 8B% E3% 83% B3% E3% 82% B0 % E3% 81% AE% E7% 90% 86% E8% AB% 96% E3% 81% A8% E5% AE% 9F% E8% A3% 85-% E6% 96% 8E% E8% 97% A4- Veuillez lire% E5% BA% B7% E6% AF% 85 / dp / 4873117585). C'est le meilleur livre qui soit vraiment facile à comprendre.

Détails

Je ne suis pas doué pour dessiner des diagrammes sur un ordinateur, donc je suis désolé pour l'écriture manuscrite. Je voudrais la source principale. De plus, les données Iris sont triées aléatoirement parmi celles répertoriées dans Version anglaise de Wikipedia. DSC_0457.JPG DSC_0461.JPG

Code source

La source peut être trouvée sur github. Python3.

Seul le code python est également publié ici. Téléchargez les données Iris depuis github.

iris.py


# coding: utf-8

import numpy as np

#Hyper paramètres
TRAIN_DATA_SIZE = 50  #TRAIN sur 150 données_DATA_SIZE est utilisé comme données d'entraînement. Le reste est utilisé comme données sur les enseignants.
HIDDEN_LAYER_SIZE = 6  #Couche intermédiaire(Couche cachée)Taille(Cette fois, la couche intermédiaire est une couche, donc scalaire)
LEARNING_RATE = 0.1  #Taux d'apprentissage
ITERS_NUM = 1000  #Nombre de répétitions

#Lire les données
#Par défaut'#'Est conçu pour sauter la ligne
x = np.loadtxt('iris.tsv', delimiter='\t', usecols=(0, 1, 2, 3))
raw_t = np.loadtxt('iris.tsv', dtype=int, delimiter='\t', usecols=(4,))
onehot_t = np.zeros([150, 3])
for i in range(150):
    onehot_t[i][raw_t[i]] = 1

train_x = x[:TRAIN_DATA_SIZE]
train_t = onehot_t[:TRAIN_DATA_SIZE]
test_x = x[TRAIN_DATA_SIZE:]
test_t = onehot_t[TRAIN_DATA_SIZE:]

#Initialisation poids / biais
W1 = np.random.randn(4, HIDDEN_LAYER_SIZE) * np.sqrt(2 / 4)  #Valeur initiale de He(Utilisez ceci pour ReLU)
W2 = np.random.randn(HIDDEN_LAYER_SIZE, 3) * np.sqrt(2 / HIDDEN_LAYER_SIZE)
b1 = np.zeros(HIDDEN_LAYER_SIZE)  #La valeur initiale est zéro * Je ne connais pas la raison car je regarde le Deep Learning fait de zéro
b2 = np.zeros(3)

#Fonction ReLU
def relu(x):
    return np.maximum(x, 0)

#Fonction Softmax * Je ne sais pas comment implémenter cette fonction car je n'ai vu que le net.
def softmax(x):
    e = np.exp(x - np.max(x))
    if e.ndim == 1:
        return e / np.sum(e, axis=0)
    elif e.ndim == 2:
        return e / np.array([np.sum(e, axis=1)]).T
    else:
        raise ValueError

#Erreur d'entropie croisée
def cross_entropy_error(y, t):
    if y.shape != t.shape:
        raise ValueError
    if y.ndim == 1:
        return - (t * np.log(y)).sum()
    elif y.ndim == 2:
        return - (t * np.log(y)).sum() / y.shape[0]
    else:
        raise ValueError

#Propagation vers l'avant
def forward(x):
    global W1, W2, b1, b2
    return softmax(np.dot(relu(np.dot(x, W1) + b1), W2) + b2)

#Résultats des données de test
test_y = forward(test_x)
print((test_y.argmax(axis=1) == test_t.argmax(axis=1)).sum(), '/', 150 - TRAIN_DATA_SIZE)

#Boucle d'apprentissage
for i in range(ITERS_NUM):
    #Propagation vers l'avant avec stockage de données
    y1 = np.dot(train_x, W1) + b1
    y2 = relu(y1)
    train_y = softmax(np.dot(y2, W2) + b2)

    #Calcul de la fonction de perte
    L = cross_entropy_error(train_y, train_t)

    if i % 100 == 0:
        print(L)

    #Calcul du gradient
    #Utilisez la formule obtenue à partir du graphique de calcul
    a1 = (train_y - train_t) / TRAIN_DATA_SIZE
    b2_gradient = a1.sum(axis=0)
    W2_gradient = np.dot(y2.T, a1)
    a2 = np.dot(a1, W2.T)
    a2[y1 <= 0.0] = 0
    b1_gradient = a2.sum(axis=0)
    W1_gradient = np.dot(train_x.T, a2)

    #Mise à jour des paramètres
    W1 = W1 - LEARNING_RATE * W1_gradient
    W2 = W2 - LEARNING_RATE * W2_gradient
    b1 = b1 - LEARNING_RATE * b1_gradient
    b2 = b2 - LEARNING_RATE * b2_gradient

#Affichage des résultats

#Valeur L des données d'entraînement finales
L = cross_entropy_error(forward(train_x), train_t)
print(L)

#Résultats des données de test
test_y = forward(test_x)
print((test_y.argmax(axis=1) == test_t.argmax(axis=1)).sum(), '/', 150 - TRAIN_DATA_SIZE)

Recommended Posts

J'ai essayé de mettre en œuvre un apprentissage en profondeur qui n'est pas profond avec uniquement NumPy
J'ai essayé d'implémenter Cifar10 avec la bibliothèque SONY Deep Learning NNabla [Nippon Hurray]
J'ai essayé d'implémenter Deep VQE
J'ai essayé d'implémenter ListNet d'apprentissage de rang avec Chainer
J'ai essayé d'implémenter Perceptron Part 1 [Deep Learning from scratch]
J'ai essayé d'écrire dans un modèle de langage profondément appris
J'ai essayé d'implémenter Autoencoder avec TensorFlow
J'ai essayé d'implémenter CVAE avec PyTorch
J'ai essayé de rendre le deep learning évolutif avec Spark × Keras × Docker
J'ai essayé de faire d'Othello AI que j'ai appris 7,2 millions de mains par apprentissage profond avec Chainer
J'ai essayé d'implémenter la lecture de Dataset avec PyTorch
J'ai essayé de mettre en œuvre une blockchain qui fonctionne réellement avec environ 170 lignes
[Deep Learning from scratch] J'ai essayé d'implémenter la couche sigmoïde et la couche Relu
J'ai essayé le deep learning
[Python] Deep Learning: J'ai essayé d'implémenter Deep Learning (DBN, SDA) sans utiliser de bibliothèque.
J'ai essayé d'extraire le dessin au trait de l'image avec Deep Learning
J'ai essayé de rendre le deep learning évolutif avec Spark × Keras × Docker 2 Multi-host edition
J'ai essayé de déplacer l'apprentissage automatique (détection d'objet) avec TouchDesigner
J'ai essayé d'implémenter et d'apprendre DCGAN avec PyTorch
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
J'ai essayé d'implémenter le perceptron artificiel avec python
J'ai essayé d'implémenter Grad-CAM avec keras et tensorflow
[Deep Learning from scratch] J'ai essayé d'expliquer le décrochage
J'ai essayé d'implémenter SSD avec PyTorch maintenant (Dataset)
J'ai essayé d'implémenter PCANet
J'ai essayé d'implémenter StarGAN (1)
"Deep Learning from scratch" Mémo d'auto-apprentissage (n ° 16) J'ai essayé de créer SimpleConvNet avec Keras
"Deep Learning from scratch" Mémo d'auto-apprentissage (n ° 17) J'ai essayé de créer DeepConvNet avec Keras
J'ai essayé d'implémenter une ligne moyenne mobile de volume avec Quantx
J'ai essayé d'implémenter la détection d'anomalies par apprentissage de structure clairsemée
J'ai essayé de mettre en œuvre une évasion (type d'évitement de tromperie) avec Quantx
Mayungo's Python Learning Episode 3: J'ai essayé d'imprimer des nombres
J'ai essayé de mettre en œuvre le chapeau de regroupement de Harry Potter avec CNN
J'ai capturé le projet Toho avec Deep Learning ... je le voulais.
J'ai essayé d'implémenter SSD avec PyTorch maintenant (édition du modèle)
[1 hour challenge] J'ai essayé de créer un site de bonne aventure qui soit trop adapté à Python
J'ai essayé l'apprentissage automatique avec liblinear
J'ai essayé de mettre en place une validation contradictoire
J'ai essayé l'apprentissage en profondeur avec Theano
J'ai essayé d'implémenter Realness GAN
J'ai essayé d'apprendre LightGBM avec Yellowbrick
J'ai essayé de créer un système qui ne récupère que les tweets supprimés
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai essayé l'apprentissage par renforcement profond (Double DQN) avec ChainerRL
J'ai essayé de savoir si ReDoS est possible avec Python
J'ai essayé d'implémenter la classification des phrases par Self Attention avec PyTorch
On m'a dit que je ne pouvais pas trouver XML_SetHashSalt lorsque j'ai essayé d'utiliser pip avec python.
J'ai essayé d'implémenter PLSA en Python
J'ai essayé d'implémenter la permutation en Python
J'ai essayé de visualiser AutoEncoder avec TensorFlow
J'ai essayé de commencer avec Hy
J'ai essayé d'implémenter PLSA dans Python 2
J'ai essayé d'apprendre avec le Titanic de Kaggle (kaggle②)
J'ai essayé d'implémenter ADALINE en Python
J'ai essayé d'implémenter PPO en Python
J'ai essayé de résoudre TSP avec QAOA
Avec PEP8 et PEP257, un codage Python qui n'est pas gênant à montrer aux gens!
Mayungo's Python Learning Episode 2: J'ai essayé de mettre des caractères avec des variables