Keras à partir de rien 3e

Cliquez ici pour la loterie de Keras à partir de rien [http://qiita.com/Ishotihadus/items/6ecf5684c2cbaaa6a5ef)

Dernier examen

La dernière fois a fait un ensemble de données approximatif et l'a formé approximativement.

L'entrée est de 5 dimensions et chaque élément est supérieur ou égal à 0 et inférieur à 1. La sortie est unidimensionnelle, -1 si la somme des éléments d'entrée est de 2,5 ou moins, 1 si elle est supérieure à 2,5. Faites ce qu'on appelle la «classification à deux classes».

L'ensemble de données a été créé comme suit. La sortie est 0 ou 1, puis multipliée par 2 à -1 (elle devient -1 ou 1).

data = np.random.rand(250,5)
labels = (np.sum(data, axis=1) > 2.5) * 2 - 1

Le modèle était le suivant. Pour la fonction d'activation, nous avons utilisé tanh, qui a une plage de valeurs de -1 à 1, et pour la perte, nous avons utilisé la perte de charnière, ce qui est bon pour le signe.

model = Sequential([Dense(20, input_dim=5, activation='tanh'), Dense(1, activation='tanh')])
model.compile('adam', 'hinge', metrics=['accuracy'])

Qu'est-ce qu'un modèle séquentiel?

Comme mentionné dans la Partie 1, le modèle séquentiel met simplement des flèches sur chaque nœud de la couche actuelle de tous les nœuds de la couche précédente. C'est une image qui tire. Bien sûr, cela fonctionne toujours comme un réseau de neurones, mais c'est un peu inintéressant.

L'API fonctionnelle résout ce problème. Vous pouvez faire des choses assez compliquées, comme mettre en sortie deux réseaux de neurones ou partager des couches.

Qu'est-ce que l'API fonctionnelle?

Créons un réseau de neurones de la même forme que la dernière fois. Puisqu'il a la même forme, il semble insignifiant de le faire, mais c'est de la pratique.

L'API fonctionnelle est simplement "vous pouvez gâcher la façon dont les flèches sont connectées". Dans le modèle séquentiel, cela ne pouvait être fait que sous la forme de A → B → C. Mais avec l'API fonctionnelle

A  ↘   C → D → E  ↗ B

Vous pourrez faire quelque chose comme ça. Je ne le ferai pas cette fois.

Utiliser l'API fonctionnelle

Couche d'entrée

Le premier est la couche d'entrée.

from keras.layers import Input, Dense
from keras.models import Model

inputs = Input(shape=(5,))

Cette couche s'appelle Input, mais malheureusement il n'y a pas de documentation.

shape représente la dimension de l'entrée. La notation (5,) ressemble à quelque chose que vous ne connaissez pas sur Python, mais c'est juste un Tuple (comme un tableau) qui n'a que l'élément 5. Il semble qu'il y ait plusieurs éléments à cause de la virgule, mais il n'y a qu'un seul élément. C'est parce qu'il est impossible de le distinguer d'un nombre sans virgule, mais je pense que c'est vraiment une putain de notation. Python n'aime pas ça.

Couche cachée

x = Dense(20, activation='tanh')(inputs)

Une couche avec 20 nœuds et entrées "entrées".

Dense signifie «dense», mais je pense que c'est dense dans ce sens car il tire toutes les flèches de tous les nœuds de la couche précédente vers tous les nœuds de cette couche.

Couche de sortie

predictions = Dense(1, activation='tanh')(x)

C'est presque le même que le calque caché. Aucune explication nécessaire.

Implications fonctionnelles de l'API

Que signifie fonctionnel?

Si vous regardez attentivement, vous pouvez voir que «Dense» appelle cette instance en tant que fonction. La documentation indique que l'appel d'une instance de couche en tant que fonction renverra un tenseur.

En premier lieu, un réseau de neurones est à peu près un produit tensoriel (ou un produit matriciel d'une manière plus simple). Multiplier le vecteur d'entrée par une matrice, puis le multiplier par une matrice ... est l'essentiel en premier lieu. Passer par une seule couche équivaut à peu près à exécuter une seule matrice. L'image de multiplication de la matrice (tenseur) est comparée à l'appel de fonction.

Lorsqu'une fonction est appelée, le tenseur d'entrée est transformé avec la signification spécifiée et sorti à nouveau en tant que tenseur. Je pense que c'est facile à comprendre si vous le capturez avec ce genre d'image.

Je ne dis rien exactement, alors c'est tout.

Au fait, seule la couche ʻInput` retourne un tenseur en premier lieu (donc aucun appel de fonction n'est nécessaire).

Résumé de ce programme

import numpy as np
from keras.layers import Input, Dense
from keras.models import Model

data = np.random.rand(250,5)
labels = (np.sum(data, axis=1) > 2.5) * 2 - 1

inputs = Input(shape=(5,))
x = Dense(20, activation='tanh')(inputs)
predictions = Dense(1, activation='tanh')(x)

model = Model(input=inputs, output=predictions)
model.compile('adam', 'hinge', metrics=['accuracy'])
model.fit(data, labels, nb_epoch=150, validation_split=0.2)

test = np.random.rand(200, 5)
predict = np.sign(model.predict(test).flatten())
real = (np.sum(test, axis=1) > 2.5) * 2 - 1
print(sum(predict == real) / 200.0)

À part la façon de l'écrire, c'est exactement la même chose que la partie 2, donc je pense qu'elle aura presque la même précision.

Recommended Posts

Keras à partir de rien 3e
Keras à partir de rien 5ème
Keras à partir de rien 1er
Keras à partir de rien 4e
Keras à partir de rien 2e
Django à partir de zéro (partie: 2)
Django à partir de zéro (partie: 1)
Analyse ChIP-seq à partir de zéro
Techniques de dépannage de (presque) rien
[Introduction] De l'installation de kibana au démarrage
Code wars kata à partir de zéro