Giới Thiệu Tensor Là Gì - Tensor Trong Học Sâu Là Gì

      217

Dữ liệu biểu diễn bên dưới dạng số thực

Thông thường các thuật toán thù Machine Learning (ML), Deep Learning (DL) chỉ xử trí được dữ liệu dạng số thực bắt buộc những tài liệu gửi vào mô hình thường xuyên được đưa về dạng số thực.

Bạn đang xem: Giới Thiệu Tensor Là Gì - Tensor Trong Học Sâu Là Gì

Hình ảnh color (rgb) được màn biểu diễn dưới dạng 1 tensor 3 chiều


*
Tensor, nguồn.

Vector

Để truy vấn mang lại phần tử của vector cùng sửa bộ phận của vector ta dùng chỉ số index. Index sẽ được tấn công bắt đầu trường đoản cú 0 mang lại thành phần ở đầu cuối của vector.


*
Slicing

Nếu đầy đủ fan không truyền gì thì mang định start=0, stop=x.shape<0> với step=1. Ý tưởng slicing là đã lấy từ phần tử index start mang lại index (stop – 1) cùng với bước nhảy là step.

x = x[:> = x[::> = x[0:x.shape[0>:1> # mang vớ các thành phần trong xNlỗi ví dụ x<1:5:2> nghỉ ngơi bên trên thì mình vẫn rước thành phần đầu sống index 1, tiếp đến rước bộ phận sống index 3, tuy nhiên sẽ không mang thành phần sống index 5 vị tôi chỉ đem từ index start đến (stop – 1) xuất xắc từ là 1 -> 4.

x[1:5:2> # output: [2, 4>Torch tensors không cung ứng step âm như pynhỏ bé list.

Ma trận

Khác với vector là 1D, ma trận 2 chiều, màn trình diễn bên dưới dạng mặt hàng với cột, kích thước ma trận được công cụ là số sản phẩm * số cột, ví dụ ma trận ở dưới displaystyle AinmathbbR^3 imes 2. Ta rất có thể cần sử dụng nằm trong tính shape để lấy ra kích cỡ của A

A.shape # torch.Size([3, 2>)A.shape[0> # 3

*
Slicing bên trên ma trận

# A[1:, :1> # Tương đương A[1:A.shape[0>:1, 0:1:1>Mình nói là slicing cũng truyền mặt hàng trước, cột sau. Phần sản phẩm truyền 1: đề xuất vẫn lấy từ bỏ mặt hàng 1 đến khi xong, còn phần cột truyền :1 cần vẫn đọc là 0:1 và chỉ mang cột 0.

A[:, 1> # tensor([2, 4, 6>)Mình nói là slicing cũng truyền mặt hàng trước, cột sau. Phần mặt hàng truyền “:” yêu cầu hiểu là “0:A.shape<0>:1” ý là lấy vớ các mặt hàng, còn phần cột truyền 1 yêu cầu đang lấy cột 1. Do kia A<:, 1> mang ra cột index 1.

Tensor 3D

Với tensor 3 chiều thì trực thuộc tính shape vẫn đã cho ra 3 quý hiếm, tương xứng độ sâu (depth), số hàng, số cột. Để truy vấn bộ phận thì tôi cũng buộc phải chứng minh index của depth, hàng với cột. Tương từ bỏ nhằm slicing thì tôi cũng nên slicing bên trên cả 3 chiều.

Ý tưởng cùng với tensor n dimension tương tự như.

Torch Properties

Dtype

Torch tensors chỉ đựng tài liệu mẫu mã số và giao diện bool (True/False). Mỗi torch tensor nằm trong 1 hình dáng tài liệu, làm việc thuộc tính dtype. Đây là danh sách những hình dạng dữ liệu torch tensors rất có thể chứa:

torch.float32 or torch.float: 32-bit floating-pointtorch.float64 or torch.double: 64-bit, double-precision floating-pointtorch.float16 or torch.half: 16-bit, half-precision floating-pointtorch.int8: signed 8-bit integerstorch.uint8: unsigned 8-bit integerstorch.int16 or torch.short: signed 16-bit integerstorch.int32 or torch.int: signed 32-bit integerstorch.int64 or torch.long: signed 64-bit integerstorch.bool: Boolean

Bình hay khi chúng ta gán giá trị đến tensor thì torch vẫn tự động gán dtype bởi dtype của quý hiếm có mẫu mã rộng rộng trong tensor. Ví dụ: những giá trị vào tensor tất cả cả int, float thì dtype của tensor đã là float.

points = torch.tensor([7, 8, 10, 6.5>)print(points.dtype) # output: torch.float32Tuy nhiên bạn có thể khởi sinh sản vẻ bên ngoài tài liệu mang lại tensor.

points = torch.tensor([7, 8, 10, 6>)print(points.dtype) # output: torch.int64# Gán kiểu dáng tài liệu đến tensorpoints = torch.tensor([7, 8, 10, 6>, dtype=torch.short)print(points.dtype) # output: torch.int16Hoặc tôi cũng rất có thể đưa loại dữ liệu của tensor đã có knhị báo.

points = torch.tensor([7, 8, 10, 6>).short()points = torch.tensor([7, 8, 10, 6>).to(dtype=torch.short)Hàm to(dtype=…) đã kiểm tra hình dạng dữ liệu của tensor cùng gửi lịch sự dạng hình tài liệu new giả dụ cần thiết. Phần bên dưới bản thân đang sử dụng hàm to() để đưa tensor tự CPU quý phái GPU.

Torch transpose

Hàm torch.transpose(input đầu vào, dim0, dim1): Nhận input tensor cùng vẫn thay đổi vị trí dim0 và dim1 cùng nhau.

Ví dụ: với ma trận phnghiền tính transpose sẽ ship hàng và cột, rõ ràng hàng vật dụng i của A đã thành cột thiết bị i của A^T với cột vật dụng j của A sẽ thành sản phẩm sản phẩm công nghệ j của A^T, do đó AinmathbbR^3 imes 2 Rightarrow A^TinmathbbR^2 imes 3


*
Transpose tensor 3D

Mọi tín đồ thấy bản thân transpose chiều sâu cùng chiều mặt hàng, chiều cột giữ nguyên (số cột giữ lại nguyên). Vì số cột giữ nguyên, buộc phải gần như tín đồ thấy những vector sản phẩm nghỉ ngơi A với A^T ko thay đổi, chỉ đổi địa điểm. Và từng cột ở mỗi ma trận vào A được tách ra thành những phần tử cho chiều sâu.

Bên cạnh đó torch còn hỗ trợ tương đối nhiều phxay tính tân oán tương quan mang đến tensor nữa, cụ thể đông đảo tín đồ coi tại chỗ này.

Torch Storage

Phần này thuộc coi thực sự Torch lưu trữ tensor ra làm sao.

Storage

Thực ra các giá trị trong tensor sẽ tiến hành lưu lại bên trên 1 vùng ghi nhớ thường xuyên bên trên bộ nhớ, được quản lý vày torch.Storage. Storage là 1 mảng một chiều bao gồm những số tất cả thuộc loại tài liệu (sinh sống trên bản thân biết những quý giá trong 1 tensor thuộc mẫu mã dữ liệu).

ví dụ như mình tạo ra 1 vector với torch, giao diện tài liệu mặc định với số nguim đang là torch.int64, hay từng phần tử đề nghị 8 bytes nhằm lưu trữ.


*

x sẽ trỏ mang đến thành phần trước tiên, với để đưa bộ phận x thì mình vẫn truy vấn mang lại vị trị (x + i * 8). Đây là một trong những phần lý do do sao index hồ hết bạn thấy giỏi ban đầu từ bỏ 0, trên x đang trỏ mang lại thành phần đầu tiên x<0> rồi, còn x đã nhân tiện rước liên hệ của bộ phận (i+1), ngoài ra các người coi tại đây.

Storage 1 chiều thì lưu giữ dữ liệu Torch tensor 2D dạng ma trận như vậy nào? Storage xếp không còn tài liệu thành một chiều, nối những sản phẩm tự trên xuống dưới thứu tự với nhau cho tới hết.


x trỏ cho phần tử mặt hàng 0, cột 0 (x<0><0>). Phần tử x đang sống ô nhớ (x+i*col+j), trong số ấy col là số cột của ma trận, tốt x = storage

Ví dụ ma trận bên trên tất cả 2 sản phẩm, 3 cột, thì phần tử x<1><2> (=6) đã ở địa chỉ x+1*3+2 = x+5, để truy cập cực hiếm x<1><2> qua storage mình dùng storage<5>.

x = torch.tensor([[1,2,3>,[4,5,6>>)x.storage() # output: 1,2,3,4,5,6x[1>[2> == x.storage()[5> # output: True

Tensor metadata: Size, offmix, và stride

Để tensor lấy giá tốt trị tự storage thì bản thân nên 1 vài thông tin: size, offphối và stride.

Offmix là vị trí ban đầu lưu lại quý giá của tensor vào storage.

Xem thêm:

Size là size của tensor.Stride gồm số chiều thông qua số chiều của Size, ý nghĩa là yêu cầu khiêu vũ bao nhiêu phần tử vào storage sẽ được thành phần tiếp theo sau trong chiều đấy.

Như vào ví dụ dưới thì kích thước xuất xắc shape, chính là form size ma trận (3×3). Offphối = 1, tức là quý giá của tensor này lưu trường đoản cú index 1 của storage cụ do index 0 nlỗi các ví dụ ngơi nghỉ bên trên.

Stride = (3,1) ý là:

để lấy quý hiếm nghỉ ngơi cột đấy mà lại nghỉ ngơi mặt hàng phía dưới, phải nhảy 3 bộ phận trên storage, ví dụ: x<1><1> (=3) lưu lại sinh sống index 5 bên trên storage, thì x<2><1> (=3) giữ ở chỗ 5 + 3 = 8 bên trên storage.để lấy quý hiếm nghỉ ngơi hàng đấy cơ mà sống cột bên cạnh, đề nghị khiêu vũ một trong những phần tử bên trên storage , ví dụ: x<1><1> (=3) lưu giữ ở index 5 trên storage, thì x<1><2> (=2) lưu giữ tại vị trí 5 + 1 = 6 bên trên storage.

Rõ ràng có 1 storage và biết được những chỉ số size, offmix, stride đang mang đem được các phần tử trong tensor.

Phần tử x sẽ tương ứng với storage * i + stride<1> * j>.

Tại sao bắt buộc những công bố như vậy? Tưởng sinh hoạt bên trên chỉ cần mỗi số cột là mang được không còn những quý giá của tensor. Câu trả lời là để hoàn toàn có thể lưu lại những tensor thuộc bên trên 1 storage. Cùng coi ví dụ về transpose tensor ở dưới.

Transposing tensor

Torch tensor x cùng x_t (transpose) vẫn dùng tầm thường 1 storage nắm vì chưng đề nghị copy ra 1 vùng ghi nhớ khác.

x = torch.tensor([[3, 1, 2>, [4, 1, 7>>)x_t = x.t() # Viết gọn gàng cho x.transpose(0, 1)id(x.storage()) == id(x_t.storage()) # output: True. Hàm id trả về xúc tiến của x.storage(), bản thân thấy là x và x_t có thuộc storage.
Ví dụ trên mình thấy là x và x_t sử dụng tầm thường 1 storage. Thuộc tính offset cả 2 đông đảo bằng 0, form size thì khác nhau, displaystyle AinmathbbR^2 imes 3, A^TinmathbbR^3 imes 2

x.stride() # (3,1)x_t.stride() # (1,3)Và stride không giống nhau, ở x thì mình bắt buộc nhảy 3 phần tử vào storage để cho địa chỉ cột đấy nhưng sống mặt hàng dưới, x<0><0> = storage<0> = 3, x<1><0> = storage<3> = 4. Tuy nhiên, sinh sống x_t thì bản thân chỉ việc nhảy đầm một phần tử trong storage để mang lại địa chỉ cột đấy nhưng mà sinh sống mặt hàng dưới, x_t<0><0> = storage<0> = 3, x_t<1><0> = storage<1> = 1.

Mình tiến hành phnghiền tính transpose nhưng vẫn sử dụng bình thường storage. Bên cạnh đó, ví dụ như Khi đa số người slicing ví dụ điển hình, thì để dùng thông thường storage bản thân đang đề nghị thay đổi offphối, kích thước, stride.

Contiguous tensors

Một vài ba phép tính trong Torch tensors chỉ điều khiển xe trên contigous tensors, ví dụ view. Để chất vấn xem tensor gồm contiguous không mình cần sử dụng hàm is_contiguous().

x.is_contiguous() # output: Truex_t.is_contiguous() # output: Falsex.view(1, -1) # [3, 1, 2, 4, 1, 7>x_t.view(1, -1) # RuntimeErrorKhi bản thân khởi chế tạo 1 tensor x thông thường, thì các quý giá x sẽ được lữu trữ liên tiếp (theo từng hàng, không còn mặt hàng xuống sản phẩm dưới) với x đã tương ứng storage cho nên vì thế x đang là contiguous tensor, còn Lúc bản thân tiến hành transpose thì x_t sử dụng phổ biến storage cùng với x phải sản phẩm công nghệ từ index không còn được nlỗi khoác định, cho nên x_t không phải contiguous tensor.

Mình hoàn toàn có thể chuyển 1 tensor chưa hẳn contiguous tensor quý phái contigous tensor bằng hàm contiguous().

x_t_con = x_t.contiguous()x_t_con.is_contiguous() # Trả về Truex_t_bé.storage() # 3 4 1 1 2 7Mình thấy là quý hiếm x_t_nhỏ và x_t là như nhau, mặc dù vùng storage khác biệt với stride sẽ khác nhau.

Torch GPU

Phần trước bản thân tất cả nói tới storage thì mặc định đã lưu giữ sinh hoạt CPU, tuy nhiên Torch có thể chấp nhận được tensor giữ làm việc GPU để tính toán tuy nhiên song cũng như tăng vận tốc cách xử trí.

Nếu 1 tensor được lưu sinh sống GPU, thì những phép tính tân oán sẽ được triển khai ở GPU.

Để khởi tạo ra 1 tensor và lưu giữ trên gpu thì bản thân sử dụng ở trong tính device.

x_gpu = torch.tensor([[4.0, 1.0>, [5.0, 3.0>, [2.0, 1.0>>, device="cuda")Hoặc mình hoàn toàn có thể copy 1 tensor từ bỏ CPU thanh lịch GPU

x = torch.tensor([[4.0, 1.0>, [5.0, 3.0>, [2.0, 1.0>>)x_gpu = x.to(device="cuda")Mỗi tensor chỉ được lưu bên trên 1 GPU nhất mực nên ví như có nhiều GPU thì đề xuất chứng thật giữ trên GPU nào, index GPU cũng bắt đầu từ bỏ 0.

x_gpu = x.to(device="cuda:0")# hoặcx_gpu = x.cuda(0)x_gpu = x_gpu + 4 # Thực hiện phnghiền tính bên trên GPUĐể chuyển ngược chở lại tự GPU về CPU thì bản thân dùng

x_cpu = x_gpu.to(device="cpu")# hoặcx_cpu = x_gpu.cpu()Vậy là mình đã đi qua kiến thức và kỹ năng cơ phiên bản của Torch tensors, phần nhiều bài bác sau bản thân đã cần sử dụng tensors nhằm xây các mô hình neural network, CNN,…

Torch Tensor to Numpy Array

Torch cho phép chuyển tensor quý phái Numpy array. Các trực thuộc tính về form size, shape sẽ được không thay đổi, type vẫn gửi tự Torch sang trọng Numpy.

x = torch.tensor([1,2,3>)x_np = x.numpy()Nếu tensor được giữ trên CPU, Torch tensor với Numpy array đang cần sử dụng phổ biến vùng lưu giữ, phải thay đổi cực hiếm ở một phát triển thành thì giá trị trở nên còn sót lại cũng biến đổi.

x[1> = 0print(x) # output: [1, 0, 3>print(x_np) # output: [1, 0, 3>Nếu tensor được lưu bên trên GPU thì đầy đủ tín đồ sẽ không còn thể đưa trực tiếp tensor lịch sự Numpy array được, cơ mà bản thân đề nghị copy câu chữ của tensor sang CPU trước rồi bắt đầu gửi lịch sự Numpy array. Do kia 2 biến chuyển bên trên gpu cùng np không sử dụng tầm thường vùng nhớ và sửa 1 phát triển thành không tác động trở thành còn sót lại.

x_gpu = torch.tensor([1, 2, 3>, device="cuda")x_np = x_gpu.numpy() # Errorx_np = x_gpu.cpu().numpy() # okx_gpu[1> = 0 print(x_gpu) # output: [1, 0, 3>print(x_np) # output: [1, 2, 3>Tương tự, mình rất có thể đưa Numpy array sang Torch tensor. Torch tensor đang lưu sống CPU và 2 trở nên bên trên np và cpu vẫn sử dụng thông thường vùng nhớ.

x_np = np.array([1, 2, 3>)x_cpu = torch.from_numpy(x_np)Vậy là bài bác này mình đã học các kỹ năng cơ bản của Torch Tensors, bài bác sau mình sẽ học về autograd trong tensors.