記事ディレクトリ
序文
このシリーズには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つの注意点:
_like
このタイプの関数はtensor
、shape
抽出を指定するために、ランダムな初期化関数がスローする初期化と同等です。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:最後に、解決するためtorch
のshuffle
機能はありません
# 产生随机索引,主要是为了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つの問題に注意を払う必要があります。:
- 元のデータの総量と同じである必要があります
- 意味のない(わかりにくい)変更は行わないでください
- 操作が完了すると、元の情報が失われるため、元
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は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
、一度にすべて交換できます