ピトーチの基本操作知識(1)

序文

このシリーズには2つの記事があり、主にいくつかのpytorch基本的な使用法と実験コードを記録および分類します。

pythonとpytorch

1.タイプ比較

python pytorch
int size()のintensor
浮く size()のfloattensor
int配列 サイズ[d1、d2、d3…]のintensor
float配列 サイズ[d1、d2、d3…]のfloattensor
ストリング

Quest1。文字列型を表す方法

  • one-hotつまり、合計でいくつかのタイプが数次元配列で表されますが、2つの欠点があります。第1に、データの次元が特に大きい場合、データはまばらです(ほとんどのビットは0です)。第2に、たとえばテキストの場合、元のテキストの意味的関連性は変換後に保持できません。
  • Embedding
    • Word2vec
    • glove

2.コード例

もちろん、pytorch内部でのみcpu変数とgpu変数の間にも違いがあります。詳細については、次のコードを組み合わせてください。すべてのコードのipynb形式コードは、列全体のgithubコードベースにあります。スターを付けてダウンロードして使用してください

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

ピトーチのスカラー作成

以下のコードを見て、備考に書いてください

# pytorch的标量表示
a = torch.tensor(1.1)  # 标量0维矩阵
print(a.shape)
print(len(a.shape))
print(a.size())


torch.Size([])
0
torch.Size([])

ピトーチのテンソル作成

3つの作成方法:

# 第一种创建方法,直接赋值
torch.tensor([1,2,3])

ここに画像の説明を挿入

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

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

ここに画像の説明を挿入

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

data = numpy.ones(2)
data

torch.from_numpy(data)

ここに画像の説明を挿入

いくつかの名詞に対応する概念

例:

[[1,1],[2,2]] # 2行2列矩阵
  • dim:行または列に対応するすべての次元、つまり次元を書き込みます
  • size/ shape:[2,2]に対応することは、データに対応する場合に2行2列の行列を意味します
  • tensor変数名:上記のデータを具体的に参照します

データのインポート

データnumpyをインポートする最も一般的な方法は、インポートすることです

# 从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])

ここに画像の説明を挿入

データの初期化の問題

1.初期化されていない割り当て

大文字のTを割り当てることもできますが、混乱とコードの読みやすさを避けるために、大文字は割り当てられていない初期化を意味し、小文字は割り当ての初期化を意味します(list変換されると理解することもできますtensor

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

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

ここに画像の説明を挿入
設定torch.set_default_tensor_type(torch.DoubleTensor)は精度を向上させるためのものです。通常、変更を加えない場合、デフォルトはtorch.FloatTensorタイプです。

2.乱数の初期化

# 随机数初始化 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)

ここに画像の説明を挿入
2つの注意点:

  1. _likeこのタイプの関数はtensorshape抽出を指定するために、ランダムな初期化関数がスローする初期化と同等です。
  2. rand初期化範囲は0、1でありrandint、整数でなければならないためfloat範囲内の乱数は乗算によって初期化する必要があります
# 正太分布随机数初始化 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)

ここに画像の説明を挿入
注:
normal生成された各値は、対応するN(mean,std)生成された乱数です。10 meanとyes stdを指定したので、最終的に10個の乱数が生成されますが、それらは1次元であり、それらを複数の次元に再分割できます。tensor

3.指定した値を初期化します

# 用指定值填充指定结构,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:最後に、解決するためtorchshuffle機能はありません

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

torch.randperm(10)

ここに画像の説明を挿入

インデックスとスライス

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的选出来

ここに画像の説明を挿入

寸法変化

1.元に戻せない変更

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これは、view機能と完全に一致しているこの2つの関数を使用する場合は、次の3つの問題に注意を払う必要があります。:

  1. 元のデータの総量と同じである必要があります
  2. 意味のない(わかりにくい)変更は行わないでください
  3. 操作が完了すると、元の情報が失われるため、元reshapeに戻す方法はありません。元のディメンション/ストレージの順序は非常に重要です

2.寸法の増加

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)

特定の次元に次元を追加し、上記の2つの例の比較を見ると、理解しやすい
ここに画像の説明を挿入

3.縮小寸法

ここでcは前のコードスライスのcです。

# squeeze与unsqueeze相反,将所有1的尽可能给压缩

print(c.shape)
print(c.squeeze().shape)
print(c.squeeze(0).shape)

ここに画像の説明を挿入
圧縮次元が指定されていない場合、すべての圧縮可能な値(値1)が直接圧縮され、指定されている場合、指定されたとおりに圧縮されます。

4.次元拡張

区別の下で拡張に追加された違いに注意してください。expand拡張には2つの前提が必要です。

  1. 一貫した寸法
  2. 1はnに展開されます

コード例を組み合わせて理解する

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)

ここに画像の説明を挿入
repeat拡張を見てみましょう

print(b.shape)

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

ここに画像の説明を挿入
repeat最終的な次元ではなく、対応する次元のコピー数

4.転置操作

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

ここに画像の説明を挿入
ここで、転置は2次元行列にのみ適用できることに注意してください。

5.寸法交換

# 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ペアでのみ交換できpermute、一度にすべて交換できます

おすすめ

転載: blog.csdn.net/wy_97/article/details/108558510