Erstellen Sie ein Deep-Learning-Framework von Grund auf
Einführung
Tensor ist ein Begriff, der je nach Fachgebiet unterschiedlich verwendet wird. Physiker und Mathematiker definieren es auf eine Art und Weise, während Datenwissenschaftler andere Definitionen verwenden. Daher kann es zu Verwirrung kommen. In diesem Artikel werden wir dieses Wort diskutieren und seine Eigenschaften und Operationen kennenlernen, die darauf angewendet werden. Wir müssen die Tensoren tiefgreifend verstehen, um sie von Grund auf aufzubauen. Beginnen wir nun mit der Definition.
Was sind Tensoren?
Mathematiker definieren Tensoren als ein mathematisches Objekt, das n Indizes und m^n Komponenten hat und bestimmten Transformationsregeln gehorcht. Klingt ein wenig interessant, lassen Sie es uns anhand einiger Programmierbeispiele ein wenig klären.
A = [1,2,3,4] # 1D array
B = [[5,6,7],
[8,9,10]] # 2D array
C = [[[1,2],[3,4]],
[[5,6],[7,8]]] # 3D array
Dimension ist ein Begriff, der angibt, wie viele Achsen ein Objekt hat. Für die Linie hat sie eine Länge, also 1 Achse, aber für den Würfel sind es 3 Achsen Länge, Breite und Höhe.
Features sind Elemente mit demselben Datentyp in einer bestimmten Dimension.
Aber eine wichtige Sache bei der Bezeichnung Tensor ist, dass er homogen sein sollte und alle Dimensionen die gleiche Anzahl von Dimensionen mit demselben Datentyp haben. Was ist also ein Tensor?
Tensor ist ein homogenes nD-Array
Tensorattribute
Tensoren haben einige grundlegende Attribute (Eigenschaften), beginnend mit Rang, Achse und Form.
Rang ist die Menge an Informationen, um eine bestimmte Komponente zu finden. Welche Bedeutung hat es? Es sagt uns, wie viele Schritte (Indizes) erforderlich sind, um auf ein bestimmtes Datenelement zuzugreifen. Angenommen, Sie haben einen Tensor A. Um auf die Zahl 5 zuzugreifen, müssen Sie wissen, wie viele Indizes Sie benötigen, um darauf zuzugreifen. Wir benötigen also drei Arten von Informationen, um darauf zuzugreifen.
E = [[[1,2],[3,4]],
[[5,6],[7,8]]]
E[1][0][0]
F = [[5,6],[7,8]]
# 2 rows and 3 Colums
# axis 0 is the rows and 1 is columns
Die Form ist die Anzahl der Elemente in jeder Dimension. Im gleichen Beispiel oben hat E 2 Elemente auf Achse 0 und 2 Elemente auf Achse 1, daher ist seine Form (2,2).
Tensoren speichern
Sie fragen sich vielleicht. Speicherung? Es ist nur ein ND-Array. Weist die Variable dafür nicht ausreichend zu?
Sehen wir uns nun einen Vergleich zwischen 1D- und 2D-Arrays an, um den Unterschied zu verstehen. Um etwas im RAM zu speichern, sollte es einen Ort zum Speichern mit einer bestimmten Adresse und einem Zeiger darauf geben. Arrays werden nacheinander im Speicher gespeichert, mit einem Zeiger auf den Startindex des Arrays.
Im 2D-Array wird es jedoch nicht sequentiell im Speicher gespeichert, sondern an verschiedenen Orten mit einem nD-Array von Adressen für jedes Array.
Das Speichern eines nD-Arrays in Form eines nD-Arrays ist bei der Speicherzuweisung effizienter.
Um ein nD-Array in Form eines 1D-Arrays zu speichern, können Sie eines von zwei Layouts „ Spalten-Major“ oder „Zeilen-Major“ verwenden, diese beiden Konzepte aus den Sprachen Fortran und C.
Colum-Major
Speichert Elemente des nD-Arrays spaltenweise, beginnend von links oben bis zum Ende des Arrays
Row-Major
Speichert Elemente des nD-Arrays Zeile für Zeile, beginnend von links oben bis zum Ende des Arrays
3D-Beispiel mit Hauptzeile
Wenn man die beiden Methoden vergleicht, gibt es keine bessere Möglichkeit, je nach Szenario beide zu verwenden, oder noch wichtiger: Sie können eine hybride Art der Mischung zwischen den beiden Methoden verwenden.
Ein weiterer erwähnenswerter Hinweis ist, dass sich Zahlen im Speicher nicht ändern, wenn Sie eine Array-Transformation durchführen. Stellen Sie sich vor, Sie haben ein nD-Array mit großen Zahlen wie mehr als 8 Bytes, wobei jedes Bild es umformt. Oh mein Gott, es ist überhaupt nicht effizient, diese Zahlen im Speicher zu verschieben, aber wenn man einfach die Indizes neu anordnet, wäre es einfach.
1D_array = [100000,5642000,89874131]
indices = [0,1,2]
# reverse the indices
indices = [2,1,0]
for i in indices:
print(1D_array[i])
# the array is reversed without moving
Abschluss
In diesem Teil verstehen wir das Tensorkonzept in der Theorie, seine Attribute und wie man es speichert. Im nächsten Teil werden wir uns mit Code die Hände schmutzig machen. Erstellen Sie zunächst Schritt für Schritt ein Tensorobjekt, abhängig von der Hauptreihenfolge, um unser endgültiges Ziel zu erreichen und darauf ein Deep-Learning-Framework aufzubauen.
Verweise
Was sind Tensoren?
Die Gilde zu NumPy
1D- vs. 2D-Array-Leistung
Speicherlayout eines mehrdimensionalen Arrays

![Was ist überhaupt eine verknüpfte Liste? [Teil 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































