『Pytorchニューラルネットワーク効率入門チュートリアル』ノート


前にもpytorch入門チュートリアルのノートを書いたことがありますが、久しぶりに自分で書いたのは少し忘れました.今回は公式チュートリアルでは話さなかったことをたくさん話しましたが、覚えておく価値があります.
1、GPU初探
(1)テンソルをGPUに移す:*.Cuda()eg.t=t.cuda()(2)GPUは特定のタスクにのみ適しており、例えば複数の小さなタスクに分解して並列計算できるほか、計算をGPUに移行しても少なからぬオーバーヘッドがあるので、簡単なタスクはそのままCPUで行えばよい
2、Tensor初探
tensorの3つのプロパティ:t.dtype:データ型t.device:デバイス(gpu/cpu)t.layout:デフォルトstrided注意:異なるタイプ/デバイスのtensorは演算できません
3、Numpy arrayをtensorに変換する
data = np.array([1,2,3])
(1)t1 = torch.Tensor(data)               # 
(2)t2 = torch.tensor(data)               # 
(3)t3 = torch.as_tensor(data)            # 
(4)t4 = torch.from_numpy(data)           # 

(1)デフォルトで入力データをfloat 32(2)(3)(4)は入力データの種類から出力データを推定するタイプ(ここではint 32)もちろん入力時に出力タイプt5 = torch.tensor(np.array([1,2,3]), dtype=torch.float64)を直接設定してもよいが構造関数はこのように設定できないNote:(3)と(4)変換時にポインタをコピーしただけで、つまりメモリを共有し、numpyを変更してもtensorがどの関数を使用するかを変更する?一、通常torchを使用する.tensor()は、エラーが発生しにくい2、性能調整時にtorchを使用する.as_tensor()はなぜtorchを適用しないのか.from_numpy()? numpyデータ型のみを受信するため、他のタイプは受信しません.
4、Reshape
(1)tensorを取得する要素数t.numel()(2)squeezeとunsqueeze
torch.squeeze(a)  # a 1 axis
torch.unsqueeze(a,2)  # a index=2 axis 1, 

(3)flatten扁平は実はt.reshape(1,-1)を先にして、それからt.squeeze()は1の軸を取り除いてtorchが実現したのにすぎない:torch.flatten(t)5、Element-wise操作
ここでは主にaxisの理解が重要である.
t = torch.tensor([
                  [1,1,1,1],
                  [2,2,2,2],
                  [3,3,3,3]],dtype=int32)
t.sum(dim=0)
out:tensor[6,6,6,6]

この「dim=0」とはどういう意味ですか?dim=0は0軸単位で演算され、0軸単位で演算されるという意味ですか?つまりsumが[0]+t[1]+t[2]またはt[0,:]+t[1,:]+t[2,:] dim=1になった場合、t[:,0]+t[:,1]+t[:,2]+t[:,3]Note!
演算後の次元すなわちこの軸を取り除いた次元eg.t.shape=[2,3,4]ならt.sum(dim=0).shape=[3,4]この方法でどのように演算したのかを推定してもよい