<jupyter_start><jupyter_text>「PyTorch入門  1. テンソル」===============================================================【原題】TENSORS【原著】[<NAME>](https://github.com/suraj813)、[<NAME>](https://github.com/sethjuarez/) 、[<NAME>](https://github.com/cassieview/) 、[<NAME>](https://soshnikov.com/)、[<NAME>](https://github.com/aribornstein/) 【元URL】https://pytorch.org/tutorials/beginner/basics/tensorqs_tutorial.html【翻訳】電通国際情報サービスISID AIトランスフォーメーションセンター　小川 雄太郎【日付】2021年03月20日【チュトーリアル概要】本チュートリアルでは、PyTorchの基本データ型である、Tensor（テンソル）について解説を行います。 テンソル：Tensors ==========================テンソルは特殊なデータ構造で、配列や行列によく似ています。PyTorchではテンソル型の変数を使用して、モデルの入力と出力、そしてモデルのパラメータを表現します。 テンソルは[NumPy](https://numpy.org/)のndarraysに似ていますが、違いとしてGPUや他のハードウェアアクセラレータ上で動作させることができます。テンソルとNumPyの配列は基本的には同じメモリを共有することができるため、2つの型間での変換時にはデータをコピーする必要がありません。 テンソルはその他に、自動微分に最適化されています（この点については、後ほど5. 自動微分にて、詳しく説明します）。NumPyのndarraysに慣れている人は、Tensor APIをすぐに使いこなせると思います。そうでない場合には、本チュートリアルを通してぜひ習得してください。<jupyter_code>%matplotlib inline
import torch
import numpy as np<jupyter_output><empty_output><jupyter_text>テンソルの初期化=======================テンソルは様々な手法で初期化できます。以下に例を示します。 **データから直接テンソルに変換**データから直接テンソルを作ることができます。その際、データ型は自動的に推測されます。<jupyter_code>#1
torch.manual_seed(1)
x0 = torch.tensor(1)
x0<jupyter_output><empty_output><jupyter_text>**NumPy arrayからテンソルに変換**テンソルとNumpy arraysは相互に変換可能です。<jupyter_code>#2
x_numpy = np.random.randn(10)
x_numpy = x_numpy.astype(np.float32)
x_tensor = torch.from_numpy(x_numpy).clone()<jupyter_output><empty_output><jupyter_text>**他のテンソルから作成**他のテンソルから新しいテンソルを作成する場合、明示的に上書きされない限り、引数のテンソルのプロパティ（形状、データ型）を保持します。<jupyter_code>#3
x_one = torch.ones_like(x0) # 引数の時性を維持
print(x_one)

x_rand = torch.rand_like(x0, dtype=torch.float) #引数のdatatypeを上書き更新
print(x_rand)<jupyter_output>tensor(1)
tensor(0.2793)<jupyter_text>**ランダム値や定数のテンソルの作成**``shape``は、テンソルの次元を示すタプルです。以下の例では、shapeからテンソルのサイズを決めています。<jupyter_code><jupyter_output>Random Tensor: 
 tensor([[0.8638, 0.0139, 0.6148],
        [0.6302, 0.3649, 0.0683]]) 

Ones Tensor: 
 tensor([[1., 1., 1.],
        [1., 1., 1.]]) 

Zeros Tensor: 
 tensor([[0., 0., 0.],
        [0., 0., 0.]])<jupyter_text>-------------- テンソルの属性変数==================テンソルは属性変数として、その形状、データの型、保存されているデバイスを保持しています。<jupyter_code><jupyter_output>Shape of tensor: torch.Size([3, 4])
Datatype of tensor: torch.float32
Device tensor is stored on: cpu<jupyter_text>-------------- テンソルの操作==================PyTorchでは、算術、線形代数、行列操作（転置、インデックス、スライス）など、100種類以上のテンソル演算が可能です。種々操作の詳細は[こちら]((https://pytorch.org/docs/stable/torch.html))をご覧ください。 各操作はGPU上で実行可能です（一般的にCPUの場合より高速です）。Google Colaboratoryを使用している場合は、GPUを使用できるように設定してください。（Runtime > Change runtime type > GPU） デフォルトではテンソルはCPU上で作られます。そのため、明示的に、``.to``メソッドを使用して、テンソルをGPU上へと移動させます。大きなテンソルをデバイス間でコピーすると、時間とメモリの面でコストがかかる点にご注意ください。<jupyter_code># GPUが使用可能であれば、GPU上にテンソルを移動させる<jupyter_output><empty_output><jupyter_text>テンソル操作の中からいくつかを試してみましょう。NumPy APIに慣れていれば、Tensor APIも簡単に使えるようになると思います。 **numpy-likeなindexingとslicing:**<jupyter_code><jupyter_output>First row:  tensor([1., 1., 1., 1.])
First column:  tensor([1., 1., 1., 1.])
Last column: tensor([1., 1., 1., 1.])
tensor([[1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.]])<jupyter_text>**テンソルの結合** ``torch.cat``を使用することで、テンソルを特定の次元に沿って結合させることができます（詳細は[こちら](https://pytorch.org/docs/stable/generated/torch.stack.html)をご覧ください）。``torch.cat``とは微妙に異なるテンソル結合演算である[``torch.stack``](https://pytorch.org/docs/stable/generated/torch.stack.html)も確認しておいてください。<jupyter_code><jupyter_output>tensor([[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
        [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
        [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
        [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.]])<jupyter_text>**算術演算**<jupyter_code># 2つのテンソル行列のかけ算です。 y1, y2, y3 は同じ結果になります。


# こちらは、要素ごとの積を求めます。 z1, z2, z3 は同じ値になります。<jupyter_output><empty_output><jupyter_text>**1要素のテンソル** 1要素のテンソル（テンソルの全要素を足し算する等をした結果生まれます）を扱う場合には、``.item()``を使用することでPythonの数値型変数に変換できます。<jupyter_code><jupyter_output>12.0 <class 'float'><jupyter_text>**インプレース操作**演算結果をオペランドに格納する演算をインプレースと呼びます。メソッドの最後、接尾辞として操作名に、 ``_`` が付きます。例えば、``x.copy_(y)``, ``x.t_()``であり、``x``の内容そのものを更新します。<jupyter_code><jupyter_output>tensor([[1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.]]) 

tensor([[6., 5., 6., 6.],
        [6., 5., 6., 6.],
        [6., 5., 6., 6.],
        [6., 5., 6., 6.]])<jupyter_text>【注意】インプレース操作はメモリを節約できますが、演算履歴が失われてしまうため、微分を計算する際には問題となります。そのため、そのような微分を求める場面ではインプレース操作の使用は推奨されていません。 -------------- NumPyとの変換=========================CPU上のテンソルとNumpy arraysは同じメモリを共有することができ、相互変換が容易です。 **Tensor to NumPy array**<jupyter_code><jupyter_output>t: tensor([1., 1., 1., 1., 1.])
n: [1. 1. 1. 1. 1.]<jupyter_text>この際、テンソルが変化すると、Numpy側も変化します。<jupyter_code><jupyter_output>t: tensor([2., 2., 2., 2., 2.])
n: [2. 2. 2. 2. 2.]<jupyter_text>**NumPy array to Tensor**<jupyter_code><jupyter_output><empty_output><jupyter_text>NumPy arrayの変化はテンソル側にも反映されます。<jupyter_code><jupyter_output>t: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
n: [2. 2. 2. 2. 2.]
{'fraction_non_alphanumeric': 0.2249950874435056, 'fraction_numerical': 0.04598152878758106, 'mean_word_length': 6.271428571428571, 'pattern_counts': {'":': 0, '<': 61, '<?xml version=': 0, '>': 63, 'https://': 10, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 12, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '16', 'dir': 'jupyter-structured-clean-dedup', 'id': '576663', 'license': 'zlib-acknowledgement', 'n_tokens_mistral': 3263, 'n_tokens_neox': 3045, 'n_words': 266, 'path': 'notebook/0_Learn the Basics/study_0_1_tensors_tutorial_js.ipynb', 'repo_name': 'shige-ta/pytorch_tutorials_jp', 'size': '5129'}