Artikelverzeichnis
Vorwort
Diese Reihe sollte zwei Artikel enthalten, in denen hauptsächlich einige pytorch
grundlegende Verwendungs- und experimentelle Codes aufgezeichnet und aussortiert werden.
Python und Pytorch
1. Typvergleich
Python | Pytorch |
---|---|
int | Inttensor der Größe () |
schweben | floattensor der Größe () |
int Array | Inttensor der Größe [d1, d2, d3…] |
Float-Array | Floattensor der Größe [d1, d2, d3…] |
Zeichenfolge | - - |
Quest1. Wie man den String-Typ darstellt
one-hot
Das heißt: Insgesamt werden mehrere Typen durch mehrdimensionale Arrays dargestellt, es gibt jedoch zwei Nachteile. Erstens, wenn die Datendimension besonders groß ist, sind die Daten dünn (die meisten Bits sind 0), zweitens, zum Beispiel für Text, kann die semantische Relevanz des ursprünglichen Textes nach der Transformation nicht beibehalten werden.Embedding
:Word2vec
glove
2. Codebeispiel
Natürlich pytorch
gibt es nur intern auch Unterschiede zwischen cpu
Variablen und gpu
Variablen. Kombinieren Sie den folgenden Code, um mehr zu erfahren. Die Codes im ipynb-Format aller Codes befinden sich in der Github-Codebasis der gesamten Spalte. Sie können sie gerne markieren, herunterladen und verwenden
import torch
a = torch.randn(2,3) # 随机初始化一个两行三列的矩阵 randn表示N(0,1)来进行初始化
print(a)
print(a.type())
print(type(a)) # 不推荐使用python的type,不显示其详细类型
print(isinstance(a, torch.FloatTensor)) # isinstance 判断是否是已知的这个类型
tensor([[-0.4170, -0.5086, 0.0340],
[-1.8330, 0.3811, -0.3105]])
torch.FloatTensor
<class 'torch.Tensor'>
True
torch.FloatTensor
# cpu类型与gpu类型的不同
print(isinstance(a, torch.cuda.FloatTensor))
a = a.cuda()
print(isinstance(a, torch.cuda.FloatTensor))
False
True
Skalare Schaffung von Pytorch
Schauen Sie sich einfach den folgenden Code an und schreiben Sie ihn in die Anmerkungen
# pytorch的标量表示
a = torch.tensor(1.1) # 标量0维矩阵
print(a.shape)
print(len(a.shape))
print(a.size())
torch.Size([])
0
torch.Size([])
Tensorerstellung von Pytorch
Drei Erstellungsmethoden:
# 第一种创建方法,直接赋值
torch.tensor([1,2,3])
# 第二种创建方法,指定初始化的元素个数
torch.Tensor(3) # 注意要大写,区分上面的那个标量表示
# 第三种创建方法 使用numpy创建,之后引入
import numpy
data = numpy.ones(2)
data
torch.from_numpy(data)
Konzepte, die mehreren Substantiven entsprechen
Beispiel:
[[1,1],[2,2]] # 2行2列矩阵
dim
: Schreiben Sie alle Dimensionen, dh Dimensionen, die Zeilen oder Spalten entsprechensize
/shape
: Entspricht [2,2] bedeutet 2 Zeilen und 2 Spalten Matrix bei entsprechenden Datentensor
Variablenname: Bezieht sich speziell auf die oben genannten Daten
Import von Daten
Der häufigste Weg numpy
, Daten zu importieren , ist das Importieren von,
# 从numpy导入数据
import numpy,torch
a = numpy.array([2,3,3])
print(a)
b = torch.from_numpy(a)
print(b)
# 从list中导入
torch.tensor([1,2,3,4,5])
Dateninitialisierungsproblem
1. Nicht initialisierte Zuordnung
Obwohl der Großbuchstabe T auch zugewiesen werden kann, bedeutet Großbuchstaben eine nicht zugewiesene Initialisierung und Kleinbuchstaben eine Zuweisungsinitialisierung (dies kann auch als list
in einen tensor
Typ transformiert verstanden werden), um Verwirrung und Lesbarkeit des Codes zu vermeiden.
# 未初始化的api
torch.Tensor(2,2)
# 分配了内存空间之后一定要记得初始化赋值,否则可能会出现各种各样的问题,比如下面的例子,数值非常大或者非常小
Die Einstellung torch.set_default_tensor_type(torch.DoubleTensor)
dient der Verbesserung der Genauigkeit. Wenn keine Änderungen vorgenommen werden, ist der torch.FloatTensor
Typ im Allgemeinen der Typ
2. Initialisierung der Zufallszahlen
# 随机数初始化 rand / rand)like / randint
a = torch.rand(3, 3)
print(a)
b = torch.rand_like(a)
print(b)
c = torch.randint(1, 10, [3,3])
print(c)
d = 10*torch.rand(3, 3)
print(d)
Zwei Punkte der Aufmerksamkeit:
_like
Diese Art von Funktionen entspricht, umtensor
denshape
Extrakt anzugeben , der zufälligen Initialisierungsfunktion, die geworfen wird.rand
Der Initialisierungsbereich ist 0,1 undrandint
muss eine Ganzzahl sein, daher muss diefloat
Zufallszahl im Bereich durch Multiplikation initialisiert werden.
# 正太分布随机数初始化 randn / normal
a = torch.randn(3,3) # N(0,1)
print(a)
b = torch.normal(mean=torch.full([10],1.0), std=torch.arange(1, 0, -0.1))
print(b)
Hinweis:
normal
Jeder generierte Wert ist eine entsprechende N(mean,std)
generierte Zufallszahl. Ich habe 10 angegeben mean
, was eine std
ist. Schließlich werden 10 Zufallszahlen generiert, die jedoch eindimensional sind, und Sie können sie in mehrere Dimensionen unterteilen.tensor
3. Initialisieren Sie den angegebenen Wert
# 用指定值填充指定结构,dtype指定类型
print(torch.full([10],1, dtype=torch.int))
print(torch.full([2,3],1, dtype=torch.int))
print(torch.full([],1, dtype=torch.int))
torch.arange(100,90,-1)
# 等分
print(torch.linspace(0,10, steps=5))
print(torch.logspace(0,10, steps=5)) # 这个分出来还要变成10 x次方
Ps: Schließlich torch
gibt es keine shuffle
Funktion zum Lösen
# 产生随机索引,主要是为了shuffle
torch.randperm(10)
Index und Slice
a = torch.rand(4,3,28,28)
# 从最左边开始索引
print(a[0].shape)
print(a[0,0].shape)
print(a[0,0,2,4])
# 冒号索引,和python中的列表的用法差不多
print(a.shape)
print(a[:2].shape)
print(a[:1,:1].shape)
print(a[:1,1:].shape)
print(a[:1,-1:].shape)
# 隔行采样,和python也一样 start:end:step
print(a[:1,:1,0:10:2].shape)
print(a[:1,:1,::2].shape)
# 在某个维度上面选给定的几个
print(a.index_select(2, torch.arange(28)).shape)
print(a.index_select(2, torch.arange(1,8,1)).shape)
# ...的利用,其实也就是可以少写几个:
print(a[...].shape)
print(a[:,1,...].shape)
print(a[:,1,:,:].shape)
x = torch.randn(4,4)
print(x)
mark = x.ge(0.5) # 把所有大于0.5的选出来
print(mark)
print(torch.masked_select(x, mark))# 把对应标记矩阵中为true的选出来
Maßänderung
1. Irreversible Änderungen
a = torch.rand(4,1,28,28)
print(a.shape)
b = a.view(4,28*28)
print(b.shape)
b = a.reshape(4,28*28)
print(b.shape)
reshape
Es view
stimmt vollständig mit der Funktion überein. Wenn Sie diese beiden Funktionen verwenden, müssen Sie drei Punkte beachten:
- Muss so viel sein wie die ursprüngliche Gesamtdatenmenge
- Nehmen Sie keine bedeutungslosen (unverständlichen) Änderungen vor.
- Nachdem der Vorgang abgeschlossen ist, gibt es keine Möglichkeit,
reshape
zurück zu gehen , da die ursprünglichen Informationen verloren gehen. Die ursprüngliche Dimension / Speicherreihenfolge ist sehr wichtig
2. Erhöhte Abmessungen
a = torch.rand(4,32,28,28)
b = torch.rand(32)
c = b.unsqueeze(1).unsqueeze(2).unsqueeze(0)
print(a.shape)
print(b.shape)
print(c.shape)
b = torch.rand(32,2)
c = b.unsqueeze(1).unsqueeze(2).unsqueeze(0)
print(a.shape)
print(b.shape)
print(c.shape)
Das Hinzufügen einer Dimension zu einer bestimmten Dimension, wenn man den Vergleich der beiden obigen Beispiele betrachtet, ist leicht zu verstehen
3. Reduzierte Abmessungen
Hier ist c das c des vorherigen Codeschnitts
# squeeze与unsqueeze相反,将所有1的尽可能给压缩
print(c.shape)
print(c.squeeze().shape)
print(c.squeeze(0).shape)
Es ist ersichtlich, dass, wenn die Komprimierungsdimension nicht angegeben ist, alle komprimierbaren Elemente (Wert 1) direkt komprimiert werden, und wenn angegeben, entspricht dies den angegebenen Werten
4. Dimensionserweiterung
Achten Sie auf den Unterschied, der der Erweiterung unter der Unterscheidung hinzugefügt wird, und die expand
Erweiterung erfordert zwei Prämissen:
- Konsistente Abmessungen
- 1 erweitert sich zu n
Kombinieren Sie Codebeispiele, um zu verstehen
a = torch.rand(3,3)
b = torch.rand(3,1)
print(a)
print(b)
print(a.shape)
print(b.shape)
c = b.expand(3,3)
print(c)
print(c.shape)
Schauen wir uns die repeat
Erweiterung an
print(b.shape)
d = b.repeat(3,3)
e = b.repeat(1,3)
print(d.shape)
print(d)
print(e.shape)
print(e)
repeat
Die Anzahl der Kopien der entsprechenden Dimension, nicht die endgültige Dimension
4. Transponieren Sie den Betrieb
a = torch.rand(2,3)
a.t()
Hierbei ist zu beachten, dass die Transposition nur auf zweidimensionale Matrizen anwendbar ist
5. Dimensionsaustausch
# transpose 只能两两交换
a = torch.rand(1,2,3,4)
print(a.shape)
b = a.transpose(1,3)
print(b.shape)
c = a.permute(0,3,1,2)# 这里的0,1,2,3指的是之前的tensor矩阵的维度位置
print(c.shape)
transpose
Kann nur paarweise ausgetauscht werden, permute
Sie können alles auf einmal tun