theano est une bibliothèque typée très stricte.
Il n'y a pas d'inférence de type puissante comme python, vous voudrez bien sûr profiter de la distribution.
Le cast de theano est implémenté par theano.tensor.cast ().
Utilisons cast immédiatement. Par défaut, une matrice définie comme type float64 est convertie en type int32.
python
import theano.tensor as T
x = T.matrix()
x_as_int = T.cast(x, 'int32')
type(x), type(x_as_int)
Résultat de sortie
(theano.tensor.var.TensorVariable, theano.tensor.var.TensorVariable)
Dans les résultats ci-dessus, les deux affichent le même type (TensorVariable).
En effet, la spécification de Theano définit les symboles comme des variables plutôt que comme des valeurs.
Utilisez theano.printing.debugprint () pour voir le type du contenu du symbole.
type de x
import theano
theano.printing.debugprint(x)
Résultat de sortie
<TensorType(float64, matrix)> [id A]
x_as_type int
theano.printing.debugprint(x_as_int)
Résultat de sortie
Elemwise{Cast{int32}} [id A] ''
|<TensorType(float64, matrix)> [id B]
Je vois, c'était à l'origine un type float64, mais il semble qu'il soit converti en int32 dans x_as_int.
Entrons réellement la valeur et vérifions le comportement.
Pour mettre une valeur dans un symbole, vous devez définir une fonction.
En définissant une formule en utilisant des symboles comme fonction et en entrant une valeur dans cette fonction, le résultat du traitement de la formule est renvoyé comme valeur de retour de la fonction.
À ce stade, le type de la valeur d'entrée dépend du type du symbole.
Si vous entrez un type inapproprié, vous obtiendrez une erreur, donc
Si vous définissez le symbole de type int32 x_as_int comme entrée, vous devriez obtenir une erreur si vous entrez une fraction.
Définition des fonctions
import numpy as np
mat = np.array([[1.0, 0.0], [0.0, 1.0]], dtype="float64")
mat_int = np.array([[1, 0], [0, 1]], dtype="int32")
y = x * 2
f = theano.function(inputs=[x], outputs=y)
y_as_int = x_as_int * 2
f_as_int = theano.function(inputs=[x_as_int], outputs=y_as_int)
f(x)
f(mat)
Résultat d'exécution
array([[ 2., 0.],
[ 0., 2.]])
f(x_as_int)
f(mat_int)
Résultat d'exécution
array([[ 2., 0.],
[ 0., 2.]])
f_as_int(x)
f_as_int(mat)
Résultat d'exécution
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-56-31692f0163e9> in <module>()
----> 1 f_as_int(mat)
/home/ubuntu/anaconda3/lib/python3.5/site-packages/theano/compile/function_module.py in __call__(self, *args, **kwargs)
786 s.storage[0] = s.type.filter(
787 arg, strict=s.strict,
--> 788 allow_downcast=s.allow_downcast)
789
790 except Exception as e:
/home/ubuntu/anaconda3/lib/python3.5/site-packages/theano/tensor/type.py in filter(self, data, strict, allow_downcast)
138 '"function".'
139 % (self, data.dtype, self.dtype))
--> 140 raise TypeError(err_msg, data)
141 elif (allow_downcast is None and
142 type(data) is float and
TypeError: ('Bad input argument to theano function with name "<ipython-input-54-50af382d0dd4>:2" at index 0 (0-based)', 'TensorType(int32, matrix) cannot store a value of dtype float64 without risking loss of precision. If you do not mind this loss, you can: 1) explicitly cast your data to int32, or 2) set "allow_input_downcast=True" when calling "function".', array([[ 1., 0.],
[ 0., 1.]]))
f_as_int(x_as_int)
array([[2, 0],
[0, 2]], dtype=int32)
Comme prévu, f_as_int (mat), qui spécifiait le type int32 comme symbole d'entrée et la valeur d'entrée comme type float64, a généré une erreur.
Vous pouvez maintenant voir le mouvement de la distribution dans le cinéma en toute sécurité.
Recommended Posts