theano ist eine sehr streng typisierte Bibliothek.
Es gibt keine leistungsstarke Typinferenz wie Python, daher sollten Sie natürlich die Besetzung nutzen.
Die Besetzung von theano wird von theano.tensor.cast () implementiert.
Verwenden wir sofort cast. Standardmäßig wird eine als float64-Typ definierte Matrix in den int32-Typ konvertiert.
python
import theano.tensor as T
x = T.matrix()
x_as_int = T.cast(x, 'int32')
type(x), type(x_as_int)
Ausgabeergebnis
(theano.tensor.var.TensorVariable, theano.tensor.var.TensorVariable)
In den obigen Ergebnissen zeigen beide den gleichen Typ (TensorVariable).
Dies liegt daran, dass die Theano-Spezifikation Symbole eher als Variablen als als Werte definiert.
Verwenden Sie theano.printing.debugprint (), um den Typ des Symbolinhalts anzuzeigen.
Art von x
import theano
theano.printing.debugprint(x)
Ausgabeergebnis
<TensorType(float64, matrix)> [id A]
x_as_int type
theano.printing.debugprint(x_as_int)
Ausgabeergebnis
Elemwise{Cast{int32}} [id A] ''
|<TensorType(float64, matrix)> [id B]
Ich sehe, es war ursprünglich ein float64-Typ, aber es scheint, dass er in x_as_int in int32 umgewandelt wird.
Geben Sie den Wert ein und überprüfen Sie das Verhalten.
Um einen Wert in ein Symbol einzufügen, müssen Sie eine Funktion definieren.
Durch Definieren einer Formel unter Verwendung von Symbolen als Funktion und Eingeben eines Werts in diese Funktion wird das Verarbeitungsergebnis der Formel als Rückgabewert der Funktion zurückgegeben.
Zu diesem Zeitpunkt hängt der Typ des Eingabewerts vom Typ des Symbols ab.
Wenn Sie einen unangemessenen Typ eingeben, wird eine Fehlermeldung angezeigt
Wenn Sie das int32-Typensymbol x_as_int als Eingabe festlegen, sollte eine Fehlermeldung angezeigt werden, wenn Sie einen Bruch eingeben.
Funktionsdefinition
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)
Ausführungsergebnis
array([[ 2., 0.],
[ 0., 2.]])
f(x_as_int)
f(mat_int)
Ausführungsergebnis
array([[ 2., 0.],
[ 0., 2.]])
f_as_int(x)
f_as_int(mat)
Ausführungsergebnis
---------------------------------------------------------------------------
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)
Wie erwartet hat f_as_int (mat), das den Typ int32 als Eingabesymbol und den Eingabewert als Typ float64 angegeben hat, einen Fehler ausgegeben.
Jetzt können Sie die Zauberbewegung in theano sicher sehen.
Recommended Posts