Grundlegende Betriebskenntnisse in Pytorch (1)

Vorwort

Diese Reihe sollte zwei Artikel enthalten, in denen hauptsächlich einige pytorchgrundlegende 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-hotDas 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 pytorchgibt es nur intern auch Unterschiede zwischen cpuVariablen und gpuVariablen. 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])

Fügen Sie hier eine Bildbeschreibung ein

# 第二种创建方法,指定初始化的元素个数

torch.Tensor(3)   # 注意要大写,区分上面的那个标量表示

Fügen Sie hier eine Bildbeschreibung ein

# 第三种创建方法 使用numpy创建,之后引入
import numpy

data = numpy.ones(2)
data

torch.from_numpy(data)

Fügen Sie hier eine Bildbeschreibung ein

Konzepte, die mehreren Substantiven entsprechen

Beispiel:

[[1,1],[2,2]] # 2行2列矩阵
  • dim: Schreiben Sie alle Dimensionen, dh Dimensionen, die Zeilen oder Spalten entsprechen
  • size/ shape: Entspricht [2,2] bedeutet 2 Zeilen und 2 Spalten Matrix bei entsprechenden Daten
  • tensorVariablenname: 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])

Fügen Sie hier eine Bildbeschreibung ein

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 listin einen tensorTyp transformiert verstanden werden), um Verwirrung und Lesbarkeit des Codes zu vermeiden.

# 未初始化的api
torch.Tensor(2,2)

# 分配了内存空间之后一定要记得初始化赋值,否则可能会出现各种各样的问题,比如下面的例子,数值非常大或者非常小

Fügen Sie hier eine Bildbeschreibung ein
Die Einstellung torch.set_default_tensor_type(torch.DoubleTensor)dient der Verbesserung der Genauigkeit. Wenn keine Änderungen vorgenommen werden, ist der torch.FloatTensorTyp 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)

Fügen Sie hier eine Bildbeschreibung ein
Zwei Punkte der Aufmerksamkeit:

  1. _likeDiese Art von Funktionen entspricht, um tensorden shapeExtrakt anzugeben , der zufälligen Initialisierungsfunktion, die geworfen wird.
  2. randDer Initialisierungsbereich ist 0,1 und randintmuss eine Ganzzahl sein, daher muss die floatZufallszahl 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)

Fügen Sie hier eine Bildbeschreibung ein
Hinweis:
normalJeder generierte Wert ist eine entsprechende N(mean,std)generierte Zufallszahl. Ich habe 10 angegeben mean, was eine stdist. 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)

Fügen Sie hier eine Bildbeschreibung ein

# 等分

print(torch.linspace(0,10, steps=5))
print(torch.logspace(0,10, steps=5)) # 这个分出来还要变成10 x次方

Fügen Sie hier eine Bildbeschreibung ein

Ps: Schließlich torchgibt es keine shuffleFunktion zum Lösen

# 产生随机索引,主要是为了shuffle

torch.randperm(10)

Fügen Sie hier eine Bildbeschreibung ein

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)

Fügen Sie hier eine Bildbeschreibung ein

# 在某个维度上面选给定的几个

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)

Fügen Sie hier eine Bildbeschreibung ein

x = torch.randn(4,4)
print(x)
mark = x.ge(0.5) # 把所有大于0.5的选出来
print(mark)
print(torch.masked_select(x, mark))# 把对应标记矩阵中为true的选出来

Fügen Sie hier eine Bildbeschreibung ein

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)

Fügen Sie hier eine Bildbeschreibung ein
reshapeEs viewstimmt vollständig mit der Funktion überein. Wenn Sie diese beiden Funktionen verwenden, müssen Sie drei Punkte beachten:

  1. Muss so viel sein wie die ursprüngliche Gesamtdatenmenge
  2. Nehmen Sie keine bedeutungslosen (unverständlichen) Änderungen vor.
  3. Nachdem der Vorgang abgeschlossen ist, gibt es keine Möglichkeit, reshapezurü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
Fügen Sie hier eine Bildbeschreibung ein

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)

Fügen Sie hier eine Bildbeschreibung ein
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 expandErweiterung erfordert zwei Prämissen:

  1. Konsistente Abmessungen
  2. 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)

Fügen Sie hier eine Bildbeschreibung ein
Schauen wir uns die repeatErweiterung an

print(b.shape)

d = b.repeat(3,3)
e = b.repeat(1,3)
print(d.shape)
print(d)
print(e.shape)
print(e)

Fügen Sie hier eine Bildbeschreibung ein
repeatDie Anzahl der Kopien der entsprechenden Dimension, nicht die endgültige Dimension

4. Transponieren Sie den Betrieb

a = torch.rand(2,3)
a.t()

Fügen Sie hier eine Bildbeschreibung ein
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)

transposeKann nur paarweise ausgetauscht werden, permuteSie können alles auf einmal tun

Ich denke du magst

Origin blog.csdn.net/wy_97/article/details/108558510
Empfohlen
Rangfolge