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.
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.
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
La méthode de confirmation est la suivante, en supposant que le traitement dans Keras peut être imaginé.
Créez un modèle de Keras pour effectuer de l'arithmétique
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.
concat Concaténez la liste des tenseurs le long de l'axe spécifié.
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]])]))
[[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.
# 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]])]))
[[[10. 20.]
[20. 5.]]
[[20. 30.]
[30. 2.]]]
expand_dims Ajoutez une dimension de taille 1 avec l'indice "axe".
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]])]))
[[[10.]]
[[20.]]
[[30.]]]
squeeze Le contraire de expand_dims, en excluant la dimension unique avec l'indice "axis" du tenseur.
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]]])]))
[[10.]
[20.]
[30.]]
reduce_max Calculez la valeur maximale d'un élément sur les dimensions du tenseur.
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]]])]))
[[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.
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]]])]))
[[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.
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]]])]))
[[[50.]]]
slice Pour le tenseur, spécifiez la position de départ et la taille d'extraction, puis extrayez une partie du tenseur.
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]])]))
[8.]
gather Spécifiez l'index du tenseur et récupérez l'élément de l'index.
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]]])]))
[[[1. 4.]
[8. 3.]]]
«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.
Recommended Posts