Erste Schritte mit Pytorch: Operationen auf Tensor

Inhaltsverzeichnis

Vorwort

1. Erstellen

Listenerstellung

Numpy erstellen

Fülle die Schöpfung

Initialisierung

regelmäßige Änderungen

Erstellen Sie einen angegebenen Typ

Geben Sie den Datentyp an

Datentyp konvertieren

2. Index

direkter Index

Scheibe

Verwenden Sie ..., um anzugeben, dass multiple weggelassen wird

3. Dimensionstransformation

Dimensionstransformation anzeigen, umformen

Abmessung des Einsatzes lösen

Squeeze entfernt Dimensionen

Kopiermaß wiederholen

Dimensionsaustausch

4. Broadcast-Mechanismus

5. Spleißen und Teilen

Nähen

aufteilen

6. Mathematische Operationen

Arithmetik

Matrix-Multiplikation

Exponent, logarithmisch

Beschränken Sie die Ober- und Untergrenzen der Daten

logische Operation

Komma

Sieben, Attributstatistik

Grundattribute

Bruchdimension

Norm

Zusammenfassen


Vorwort

In der vergangenen Zeit habe ich mich auf die Forschung in den Bereichen Bildverarbeitung und Risserkennung konzentriert. In dieser Zeit wurde kürzlich auch die zweidimensionale Erkennung von Rissen gut durchgeführt, und der Effekt ist für mich recht zufriedenstellend. In der Endphase des Projekts sind Deep Learning und die Erstellung der PyQt-UI-Schnittstelle die wichtigsten Lerninhalte. Ich muss in dieser kurzen Zeit lernen. Nehmen Sie sich Zeit, intensiv zu lernen und Ergebnisse zu erzielen.

1. Erstellen

import torch
import numpy as np

Listenerstellung

# list创建
a=torch.tensor([1,2])
b=torch.tensor([[1,2],[3,4]])

Numpy erstellen

# numpy创建
c=torch.from_numpy(np.array([1,2]))

Fülle die Schöpfung

#全1填充
print(torch.ones(2, 3))

#全0填充
print(torch.zeros(2, 3))

#full填充
print(torch.full([2, 3], 7))

#对角矩阵
print(torch.eye(3, 3))

Initialisierung

#创建但不初始化
print(torch.empty(2, 3))

#标准正态分布
print(torch.randn(2, 3))

#0-1均匀分布
print(torch.rand(2, 3))

#1-9的整数均匀分布
print(torch.randint(1, 10, [2, 3]))

Tensor([[0., 0., 0.],
            [0., 0., 0.]])
Tensor([[-1.0020, 0.6792, -1.2098],
            [-2.6513, -1.4667, -0.0785]] )
Tensor([[0.8533, 0.4675, 0.9124],
            [0.3488, 0.5822, 0.0545]])
Tensor([[2, 9, 7],
            [8, 6, 3]])

regelmäßige Änderungen

#自增数列,0到9,步长是1
print(torch.arange(0, 10, 2))

#等差数列,0到10,4个数
print(torch.linspace(0, 10, 4))

Tensor([0, 2, 4, 6, 8])
Tensor([ 0,0000, 3,3333, 6,6667, 10,0000])

Erstellen Sie einen angegebenen Typ

#指定类型的创建
torch.FloatTensor([1, 2]), torch.LongTensor([1, 2])

(Tensor([1., 2.]), Tensor([1, 2]))

Geben Sie den Datentyp an

#获取数据类型
torch.randn(2, 3).dtype

Datentyp konvertieren

#转换数据类型
torch.randn(2, 3).to(torch.float64).dtype

2. Index

Erstellen Sie Daten, die 4 Bilder, 3 Kanäle, 28*28 Pixel darstellen

import torch
a = torch.randn(4, 3, 28, 28)
print(a.shape)

Torch.Size([4, 3, 28, 28])

direkter Index

Bild 0 ansehen

print(a[0].shape)

Torch.Size([3, 28, 28])

Sehen Sie sich den 0. Kanal des 0. Bildes an

print(a[0, 0].shape)

Torch.Size([28, 28])

Zeile 2 von Kanal 0 von Bild 0 anzeigen

print(a[0, 0, 2].shape)

 Torch.Size([28])

Zeile 2, Spalte 4 von Kanal 0 von Bild 0 anzeigen

print(a[0, 0, 2, 4].shape)

Torch.Size([]) #Ausgabe ist ein Skalarwert, keine Form

Scheibe

Die Syntax der Slice-Operation lautet start:stop:step: wobei startdie Startposition, stopdie Endposition (exklusiv) und stepdie Schrittgröße angegeben sind.

#查看0-1张图片
print(a[:2].shape)
#查看0-1张图片的0-1通道
print(a[:2, :2].shape)
#查看0-1张图片的所有通道的倒数5-正数24行
print(a[:2, :, -5:25].shape)
#有间隔的索引
print(a[:, :, :, ::2].shape)

Torch.Size([2, 3, 28, 28])
Torch.Size([2, 2, 28, 28])
Torch.Size([2, 3, 2, 28])
Torch.Size([4, 3 , 28, 14])

Verwenden Sie ..., um anzugeben, dass multiple weggelassen wird

#取所有图片的第0-2列
print(a[..., :2].shape)

#取所有图片的第0-2行
print(a[..., :2, :].shape)

#取第2张图片
print(a[2, ...].shape)

Torch.Size([4, 3, 28, 2])
Torch.Size([4, 3, 2, 28])
Torch.Size([3, 28, 28])

3. Dimensionstransformation

Dimensionstransformation anzeigen, umformen

#4张图片,单通道,28*28像素
a = torch.randn(4, 1, 28, 28)
print(a.shape)

#转换为4,784维度,相当于打平了
print(a.reshape(4, 784).shape)

#转换为4,28,28维度,相当于重新展开
print((a.reshape(4, 784)).reshape(4, 28, 28).shape)

#view的用法和reshape不作区分
print(a.view(4, 784).shape)

Torch.Size([4, 1, 28, 28])
Torch.Size([4, 784])
Torch.Size([4, 28, 28])
Torch.Size([4, 784])

Abmessung des Einsatzes lösen

#2*2的tensor
a = torch.randn(2, 2)
print(a.shape)

#插入维度在第0维
print(a.unsqueeze(0).shape)

#插入维度在倒数第1维
print(a.unsqueeze(-1).shape)

Torch.Size([2, 2])
Torch.Size([1, 2, 2])
Torch.Size([2, 2, 1])

Squeeze entfernt Dimensionen

Es können nur Dimensionen mit dem Wert 1 gelöscht werden

#1*2*2*1的tensor
a = torch.randn(1, 2, 2, 1)
print(a.shape)

#删除第0维
print(a.squeeze(0).shape)

#删除倒数第1维
print(a.squeeze(-1).shape)

#删除所有为1的维度
print(a.squeeze().shape)

Torch.Size([1, 2, 2, 1])
Torch.Size([2, 2, 1])
Torch.Size([1, 2, 2])
Torch.Size([2, 2])

Kopiermaß wiederholen

#分别复制2次和3次
print(torch.randn(2, 2).repeat(2, 3).shape)

Torch.Size([4, 6])

Dimensionsaustausch

# t转置,只能操作2维tensor
print(torch.randn(1, 2).t().shape)
# transpose维度交换,指定要转换的维度,只能两两交换
print(torch.randn(1, 2, 3).transpose(0, 1).shape)
# permute维度交换,输入维度的顺序
print(torch.rand(1, 2, 3).permute(2, 1, 0).shape)

Torch.Size([2, 1])
Torch.Size([2, 1, 3])
Torch.Size([3, 2, 1])

4. Broadcast-Mechanismus

import torch

a = torch.randn(2, 3)
b = torch.randn(1, 3)
c = torch.randn(1)

print((a + b).shape)
print((a + c).shape)

#手动boradcast
print(b.expand_as(a).shape)
print(c.expand_as(a).shape)

Die Ausgänge sind alle Torch.Size([2, 3])

5. Spleißen und Teilen

Nähen

import torch

a = torch.rand(4, 32, 8)
b = torch.rand(5, 32, 8)

torch.cat([a, b], dim=0).shape

Torch.Size([9, 32, 8])

Cat-Spleißen, dim = 0 dient zur Angabe der zu spleißenden Dimension.

a = torch.rand(4, 32, 8)
b = torch.rand(4, 32, 8)

torch.stack([a, b], dim=0).shape

Torch.Size([2, 4, 32, 8])

Durch die Stapelkombination entsteht eine neue Dimension zur Unterscheidung der beiden kombinierten Tensoren.

aufteilen

a = torch.rand(4, 32, 8)

_1, _2 = a.split(2, dim=0)
print(_1.shape)
print(_2.shape)

_1, _2, _3 = a.split([1, 2, 1], dim=0)
print(_1.shape)
print(_2.shape)
print(_3.shape)

#Split Split, Split in der 0-Dimension, alle 2 Elemente 1 Split

Torch.Size([2, 32, 8])
Torch.Size([2, 32, 8])               

[1, 2, 1]#Segmentieren Sie entsprechend der Segmentierungsgröße in der 0. Dimension (Zeilendimension) . Unter diesen ist die erste Teilungsgröße 1, die zweite Teilungsgröße 2 und die dritte Teilungsgröße 1.
Torch.Size([1, 32, 8])         
Torch.Size([2, 32, 8])
Torch.Size([1, 32, 8])

a = torch.rand(4, 32, 8)

_1, _2 = a.chunk(2, dim=0)
print(_1.shape)
print(_2.shape)

Torch.Size([2, 32, 8])
Torch.Size([2, 32, 8]) #chunk geteilt, in 0-Dimension geteilt, in 2 geteilt

6. Mathematische Operationen

import torch

#测试数据
a = torch.FloatTensor([[0, 1, 2], [3, 4, 5]])
b = torch.FloatTensor([0, 1, 2])

(Tensor([[0., 1., 2.],
             [3., 4., 5.]]),
Tensor([0., 1., 2.]))

Arithmetik

print(a + b)
print(a - b)
print(a * b)
print(a / b)

Matrix-Multiplikation

print(a @ b)
print(a.matmul(b))

Berechnungsprozess 0 * 0 + 1 * 1 + 2 * 2, 0 * 3 + 1 * 4 + 2 * 5

Exponent, logarithmisch

#求指数
print(a**2)
#开根号
print(a**0.5)
#求e的n次方
print(a.exp())
#以e为底,求对数
print(a.log())
#以2为底,求对数
print(a.log2())

Beschränken Sie die Ober- und Untergrenzen der Daten

a.clamp(2, 4)

Tensor([[2., 2., 2.],
            [3., 4., 4.]])

logische Operation

#大于
print(a > b)
#小于
print(a < b)
#等于
print(a == b)
#不等于
print(a != b)

Komma

#四舍五入
c = torch.FloatTensor([3.14])
#向下取整
print(c.floor())
#向上取整
print(c.ceil())
#四舍五入
print(c.round())

Tensor([3.])
Tensor([4.])
Tensor([3.])

Sieben, Attributstatistik

import torch

#测试数据
a = torch.FloatTensor([[0., 1., 2.], [3., 4., 5.]])

Tensor([[0., 1., 2.],
            [3., 4., 5.]])

Grundattribute

#求最小
print(a.min())
#求最大
print(a.max())
#求平均
print(a.mean())
#求积
print(a.prod())
#求和
print(a.sum())
#求最大值下标
print(a.argmax())
#求最小值下标
print(a.argmin())

Tensor(0.)
Tensor(5.)
Tensor(2.5000)
Tensor(0.)
Tensor(15.)
Tensor(5)
Tensor(0)

Bruchdimension

#分维度求最大
a.max(dim=0)
#分维度求最大值下标
a.argmax(dim=0)

#求前2个最小值
a.topk(2, dim=1, largest=False)
#求第2个小的值
a.kthvalue(2, dim=1)

Torch.return_types.max(
Werte=Tensor([3., 4., 5.]),
Indizes=Tensor([1, 1, 1]))

Tensor([1, 1, 1])

Torch.return_types.topk( Werte=Tensor([[0., 1.], [3., 4.]]), Indizes=Tensor([[0, 1], [0, 1]]))

Torch.return_types.kthvalue( Werte=Tensor([1., 4.]), Indizes=Tensor([1, 1]))

Norm

#求1范数
print(a.norm(1))
print(a.norm(1, dim=0))

#求2范数
print(a.norm(2))
print(a.norm(2, dim=0))

Tensor(15.)
Tensor([3., 5., 7.])
Tensor(7.4162)
Tensor([3.0000, 4.1231, 5.3852])

Zusammenfassen

Der Hauptzweck dieses Blogs besteht darin, meine persönliche Suche nach APIs zu erleichtern und mich mit den grundlegenden Operationen von Pytorch bei ständigen Abfragen vertraut zu machen.

おすすめ

転載: blog.csdn.net/m0_62919535/article/details/131732445