[PYTHON] Comprendre les images de diverses opérations matricielles utilisées dans Keras (Tensorflow) avec des exemples

introduction

Lorsque vous lirez le code de Keras, vous rencontrerez diverses opérations matricielles. Il est très difficile de lire sans connaître le contenu de ces opérations. Cette fois, je partagerai le code que j'ai lu, car j'ai confirmé les opérations matricielles qui apparaissent souvent dans Keras sur la base d'exemples réels.

environnement

Même s'il s'agit de Keras, l'environnement confirmé cette fois-ci est une ancienne version de l'époque où il faisait partie de tensorflow. Cependant, je ne pense pas que les opérations matricielles soient très différentes de ce qu'elles sont actuellement.

Précautions lors de l'utilisation de l'échantillon

Le code source de cet article suppose les importations suivantes: Veuillez le copier et le coller si vous voulez qu'il fonctionne.

import numpy as np
import warnings
import os
warnings.simplefilter('ignore')

import tensorflow as tf
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Dense, Input, Dropout, BatchNormalization

Méthode de confirmation

La méthode de confirmation est la suivante, en supposant que le traitement dans Keras peut être imaginé.

  1. Créez un modèle de Keras pour effectuer de l'arithmétique

  2. Confirmez le contenu du calcul en donnant une entrée à la méthode de prédiction du modèle et en sortant le résultat.

essayons

concat Concaténez la liste des tenseurs le long de l'axe spécifié.

La source

    input1 = Input(shape=(2,))
    input2 = Input(shape=(2,))
    output = tf.concat(axis=1, values=[input1, input2])
    model = Model(inputs=[input1, input2], outputs=[output])
    print(model.summary())
    print(model.predict(x=[np.array([[10, 20], [20, 30]]), np.array([[20, 5], [30, 2]])]))

résultat

[[10. 20. 20.  5.]
 [20. 30. 30.  2.]]

stack Empilez la liste des tenseurs de rang R en tenseurs de rang R + 1. La grande différence avec concat est qu'il n'est pas connecté tel quel, mais il est connecté après l'ajout d'un axe, et il est possible de récupérer les informations avant la connexion même après la connexion.

La source

    # stack
    input1 = Input(shape=(2,))
    input2 = Input(shape=(2,))
    output = tf.stack(axis=1, values=[input1, input2])
    model = Model(inputs=[input1, input2], outputs=[output])
    print(model.summary())
    print(model.predict(x=[np.array([[10, 20], [20, 30]]), np.array([[20, 5], [30, 2]])]))

résultat

[[[10. 20.]
  [20.  5.]]
 [[20. 30.]
  [30.  2.]]]

expand_dims Ajoutez une dimension de taille 1 avec l'indice "axe".

La source

    input1 = Input(shape=(1,))
    output = tf.expand_dims(input1, axis=1)
    model = Model(inputs=[input1], outputs=[output])
    print(model.summary())
    print(model.predict(x=[np.array([[10], [20], [30]])]))

résultat

[[[10.]]
 [[20.]]
 [[30.]]]

squeeze Le contraire de expand_dims, en excluant la dimension unique avec l'indice "axis" du tenseur.

La source

    input1 = Input(shape=(1,1,))
    output = tf.squeeze(input1, axis=1)
    model = Model(inputs=[input1], outputs=[output])
    print(model.summary())
    print(model.predict(x=[np.array([[[10]], [[20]], [[30]]])]))

résultat

[[10.]
 [20.]
 [30.]]

reduce_max Calculez la valeur maximale d'un élément sur les dimensions du tenseur.

La source

Ce qui suit est une matrice 3x2 calculée en dimensions 0, 1 et 2. Il est intéressant que dans la 0ème dimension, le résultat soit diffusé tel quel, dans la 1ère dimension, le résultat est exactement le même, et dans la 2ème dimension, l'ordre est réduit.

    input1 = Input(shape=(1,2))
    output = tf.reduce_max(input1, axis=0)
    model = Model(inputs=[input1], outputs=[output])
    print(model.summary())
    print(model.predict(x=[np.array([[[10, 20]], [[20, 5]], [[30, 4]]])]))

    input1 = Input(shape=(1,2))
    output = tf.reduce_max(input1, axis=1)
    model = Model(inputs=[input1], outputs=[output])
    print(model.summary())
    print(model.predict(x=[np.array([[[10, 20]], [[20, 5]], [[30, 4]]])]))

    input1 = Input(shape=(1,2))
    output = tf.reduce_max(input1, axis=2)
    model = Model(inputs=[input1], outputs=[output])
    print(model.summary())
    print(model.predict(x=[np.array([[[10, 20]], [[20, 5]], [[30, 4]]])]))

résultat

[[30. 20.]
 [30. 20.]
 [30. 20.]]


[[10. 20.]
 [20.  5.]
 [30.  4.]]

[[20.]
 [20.]
 [30.]]

reduce_sum Calculez la somme des éléments de toute la dimension du tenseur. De même, j'ai essayé de calculer la source en 0 dimension, 1 dimension et 2 dimensions pour une matrice 3x2. L'idée est la même que pour réduire_max.

La source

    input1 = Input(shape=(1,2))
    output = tf.reduce_sum(input1, axis=0)
    model = Model(inputs=[input1], outputs=[output])
    print(model.summary())
    print(model.predict(x=[np.array([[[10, 20]], [[20, 5]], [[30, 4]]])]))

    input1 = Input(shape=(1,2))
    output = tf.reduce_sum(input1, axis=1)
    model = Model(inputs=[input1], outputs=[output])
    print(model.summary())
    print(model.predict(x=[np.array([[[10, 20]], [[20, 5]], [[30, 4]]])]))

    input1 = Input(shape=(1,2))
    output = tf.reduce_sum(input1, axis=2)
    model = Model(inputs=[input1], outputs=[output])
    print(model.summary())
    print(model.predict(x=[np.array([[[10, 20]], [[20, 5]], [[30, 4]]])]))

résultat

[[60. 29.]
 [60. 29.]
 [60. 29.]]

[[10. 20.]
 [20.  5.]
 [30.  4.]]

[[30.]
 [25.]
 [34.]]

matmul Abréviation de "Multiplie la matrice", multipliant la matrice a par la matrice b pour générer a * b. Souvent utilisé pour les couches entièrement connectées.

La source

Voici un exemple dans lequel une matrice 1x1 est générée suite au calcul d'une matrice 1x2 et 2x1.

    input1 = Input(shape=(2,))
    input2 = Input(shape=(2,1))
    output = tf.matmul(input1, input2)
    model = Model(inputs=[input1, input2], outputs=[output])
    print(model.summary())
    print(model.predict(x=[np.array([[10, 20]]), np.array([[[1], [2]]])]))

résultat

[[[50.]]]

slice Pour le tenseur, spécifiez la position de départ et la taille d'extraction, puis extrayez une partie du tenseur.

La source

    input1 = Input(shape=(4,))
    input1_reshape = tf.reshape(input1, [4])
    input2 = Input(shape=(1), dtype=tf.int32)
    input2_reshape = tf.reshape(input2, [1])
    input3 = Input(shape=(1), dtype=tf.int32)
    input3_reshape = tf.reshape(input3, [1])
    output = tf.slice(input1_reshape, input2_reshape, input3_reshape)
    model = Model(inputs=[input1, input2, input3], outputs=[output])
    print(model.summary())
    print(model.predict(x=[np.array([[1, 8, 3, 4]]), np.array([[1]]), np.array([[1]])]))

résultat

[8.]

gather Spécifiez l'index du tenseur et récupérez l'élément de l'index.

La source

Pour la liste [1, 8, 3, 4], la liste avec les 0e et 3e éléments retirés et la liste avec les 1er et 2e éléments retirés sont renvoyées comme éléments. Si la forme d'entrée n'est pas corrigée, une erreur se produit, le remodelage est donc effectué de force.

    input1 = Input(shape=(4,))
    input1_reshape = tf.reshape(input1, [4])
    input2 = Input(shape=(2,2), dtype=tf.int32)
    output = tf.gather(input1_reshape, input2)
    model = Model(inputs=[input1, input2], outputs=[output])
    print(model.summary())
    print(model.predict(x=[np.array([[1, 8, 3, 4]]), np.array([[[0, 3],[1, 2]]])]))

résultat

[[[1. 4.]
  [8. 3.]]]

en conclusion

«Cette fois, seuls certains calculs sont affichés, mais j'espère que votre capacité de lecture s'est un peu améliorée. ――Même si vous le donnez à l'entrée du modèle de Keras et le laissez calculer, ce n'était pas facile en raison d'une erreur telle que le nombre de dimensions de la matrice ne correspond pas, mais c'était assez difficile, mais c'était très utile pour comprendre la matrice. ――Il est particulièrement important de faire correspondre la valeur de l'argument shape de Input avec la forme de la matrice donnée à predcit. SampleCet exemple sera également le code minimum pour créer et prédire des modèles qui prennent plusieurs entrées dans Keras, donc je pense qu'il sera utile lors de la création de modèles complexes à l'avenir.

référence

Recommended Posts

Comprendre les images de diverses opérations matricielles utilisées dans Keras (Tensorflow) avec des exemples
Résumé des différentes opérations dans Tensorflow
[Python3] Comprendre les bases des opérations sur les fichiers
Mélangez des centaines de milliers d'images uniformément avec tensorflow.
Correction des arguments de la fonction utilisée dans map
Représentation numérique des jours dans différentes langues
Examiner la relation entre TensorFlow et Keras pendant la période de transition
Utilisé depuis l'introduction de Node.js dans l'environnement WSL
Identifiez le nom de l'image de la fleur avec des keras (flux tenseur)
Bilan du premier défi du machine learning avec Keras
Comprendre la méthode Metropolitan Hasting (une des méthodes de la méthode Monte Carlo en chaîne de Markov) avec implémentation
Présentons la bibliothèque actuellement utilisée par les ingénieurs avec environ 3 ans d'expérience dans Django
Essayez de gratter les données COVID-19 Tokyo avec Python
[TensorFlow 2 / Keras] Comment exécuter l'apprentissage avec CTC Loss dans Keras
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
Apprentissage par renforcement dans les plus brefs délais avec Keras avec OpenAI Gym
Présentation du potentiel du nuage de points de Plotly avec des exemples pratiques
L'histoire de l'affichage d'images avec OpenCV ou PIL (uniquement)
[Homologie] Comptez le nombre de trous dans les données avec Python
Trouver les valeurs propres d'une vraie matrice symétrique en Python
Obtenez l'index de chaque élément de la matrice de confusion en Python
L'histoire de la rétrogradation de la version de tensorflow dans la démo de Mask R-CNN.