Dữ liệu trình diễn dưới dạng số thực

Thông thường các thuật toán Machine Learning (ML), Deep Learning (DL) chỉ cách xử lý được tài liệu dạng số thực nên những dữ liệu đưa vào quy mô thường được gửi về dạng số thực.

Bạn đang xem: Tensor là gì

Ảnh màu (rgb) được trình diễn dưới dạng 1 tensor 3 chiều


*
Tensor, nguồn.

Vector

Để truy vấn đến bộ phận của vector cùng sửa bộ phận của vector ta dùng chỉ số index. Index sẽ tiến hành đánh bước đầu từ 0 đến thành phần cuối thuộc của vector.


*
Slicing

Nếu mọi fan không truyền gì thì khoác định start=0, stop=x.shape<0> với step=1. Ý tưởng slicing là sẽ lấy từ bộ phận index start mang lại index (stop – 1) với cách nhảy là step.

x = x[:> = x[::> = x[0:x.shape[0>:1> # lấy tất các phần tử trong xNhư lấy một ví dụ x<1:5:2> ở trên thì mình sẽ lấy thành phần đầu sinh hoạt index 1, tiếp đến lấy thành phần ở index 3, tuy vậy sẽ không lấy thành phần ở index 5 vì tôi chỉ lấy từ index start mang lại (stop – 1) hay từ 1 -> 4.

x[1:5:2> # output: [2, 4>Torch tensors không hỗ trợ step âm như python list.

Ma trận

Khác với vector là 1D, ma trận 2D, trình diễn dưới dạng hàng và cột, kích thước ma trận được khí cụ là số mặt hàng * số cột, lấy ví dụ ma trận ở bên dưới displaystyle AinmathbbR^3 imes 2. Ta hoàn toàn có thể dùng thuộc tính shape để lôi ra kích thướ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 sản phẩm trước, cột sau. Phần sản phẩm truyền 1: phải sẽ lấy từ hàng 1 mang lại hết, còn phần cột truyền :1 bắt buộc sẽ đọc là 0:1 còn chỉ lấy cột 0.

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

Tensor 3D

Với tensor 3 chiều thì trực thuộc tính shape sẽ cho ra 3 giá bán trị, tương ứng độ sâu (depth), số hàng, số cột. Để truy vấn cập bộ phận thì tôi cũng phải chứng thật index của depth, hàng với cột. Tựa như để slicing thì mình cũng phải slicing trên cả 3 chiều.

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

Torch Properties

Dtype

Torch tensors chỉ chứa dữ liệu kiểu số và kiểu bool (True/False). Từng torch tensor thuộc 1 hình dáng dữ liệu, sinh sống thuộc tính dtype. Đây là danh sách những kiểu tài liệu torch tensors 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 thường khi bạn gán giá bán trị đến tensor thì torch sẽ auto gán dtype bởi dtype của giá chỉ trị có kiểu rộng rộng trong tensor. Ví dụ: những giá trị trong tensor tất cả cả int, float thì dtype của tensor vẫn là float.

points = torch.tensor([7, 8, 10, 6.5>)print(points.dtype) # output: torch.float32Tuy nhiên chúng ta cũng có thể khởi tạo nên kiểu tài liệu cho tensor.

points = torch.tensor([7, 8, 10, 6>)print(points.dtype) # output: torch.int64# Gán kiểu dữ liệu cho tensorpoints = torch.tensor([7, 8, 10, 6>, dtype=torch.short)print(points.dtype) # output: torch.int16Hoặc mình cũng rất có thể chuyển kiểu dữ liệu của tensor đã có được khai 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=…) sẽ đánh giá kiểu dữ liệu của tensor và chuyển sang kiểu tài liệu mới nếu phải thiết. Phần dưới mình sẽ sử dụng hàm to() để đưa tensor trường đoản cú CPU sang GPU.

Torch transpose

Hàm torch.transpose(input, dim0, dim1): nhận input tensor cùng sẽ đổi nơi dim0 với dim1 với nhau.

Ví dụ: cùng với ma trận phép tính transpose sẽ giao hàng và cột, ví dụ hàng đồ vật i của A vẫn thành cột thứ i của A^T cùng cột máy j của A sẽ thành hàng máy j của A^T, cho nên AinmathbbR^3 imes 2 Rightarrow A^TinmathbbR^2 imes 3


*
Transpose tensor 3D

Mọi người thấy bản thân transpose chiều sâu với chiều hàng, chiều cột không thay đổi (số cột giữ lại nguyên). Bởi vì số cột duy trì nguyên, cần mọi bạn thấy các vector hàng ở A cùng A^T không nạm đổi, chỉ đổi vị trí. Với từng cột làm việc mỗi ma trận trong A được bóc tách ra thành các thành phần cho chiều sâu.

Ngoài ra torch còn cung ứng rất các phép giám sát và đo lường liên quan cho tensor nữa, cụ thể mọi bạn xem nghỉ ngơi đây.

Torch Storage

Phần này thuộc xem đích thực Torch lưu trữ tensor như thế nào.

Storage

Thực ra các giá trị vào tensor sẽ được lưu bên trên 1 vùng nhớ liên tục trên cỗ nhớ, được làm chủ bởi torch.Storage. Storage là một trong mảng một chiều gồm các số gồm cùng kiểu dữ liệu (ở trên mình biết những giá trị trong một tensor thuộc kiểu dữ liệu).

Ví dụ mình tạo ra 1 vector cùng với torch, kiểu dữ liệu mặc định với số nguyên đang là torch.int64, tốt mỗi thành phần cần 8 bytes nhằm lưu trữ.


*

x sẽ trỏ đến thành phần đầu tiên, cùng để lấy bộ phận x thì bản thân sẽ truy vấn đến vị trị (x + i * 8). Đây là một trong những phần lý bởi vì vì sao index mọi người thấy hay ban đầu từ 0, trên x vẫn trỏ đến phần tử đầu tiên x<0> rồi, còn x đang tiện lấy showroom của thành phần (i+1), ngoài ra mọi fan xem nghỉ ngơi đây.

Storage 1 chiều thì lưu tài liệu Torch tensor 2d dạng ma trận như thế nào? Storage xếp hết tài liệu thành 1 chiều, nối những hàng từ bên trên xuống dưới lần lượt cùng với nhau cho tới hết.


x trỏ đến bộ phận hàng 0, cột 0 (x<0><0>). Phần tử x sẽ ở ô lưu giữ (x+i*col+j), trong số ấy col là số cột của ma trận, tuyệt x = storage

Ví dụ ma trận trên có 2 hàng, 3 cột, thì thành phần x<1><2> (=6) vẫn ở địa chỉ cửa hàng x+1*3+2 = x+5, để truy cập giá trị x<1><2> qua storage mình cần sử 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, offset, và stride

Để tensor lấy giá tốt trị từ bỏ storage thì mình cần 1 vài ba thông tin: size, offset và stride.

Offset là vị trí bước đầu lưu quý hiếm của tensor vào storage.Size là kích cỡ của tensor.Stride có số chiều ngay số chiều của Size, ý nghĩa là đề xuất nhảy bao nhiêu thành phần trong storage để được phần tử tiếp theo trong chiều đấy.

Như vào ví dụ bên dưới thì form size hay shape, chính là kích thước ma trận (3×3). Offset = 1, tức là giá trị của tensor này lưu lại từ index 1 của storage thay vày index 0 như các ví dụ làm việc trên.

Stride = (3,1) ý là:

để lấy giá trị ở cột đấy nhưng ở mặt hàng phía dưới, phải nhảy 3 phần tử trên storage, ví dụ: x<1><1> (=3) lưu lại ở index 5 bên trên storage, thì x<2><1> (=3) lưu ở vị trí 5 + 3 = 8 bên trên storage.để lấy giá trị ở sản phẩm đấy dẫu vậy ở cột lạm cận, phải nhảy một trong những phần tử bên trên storage , ví dụ: x<1><1> (=3) lưu ở index 5 trên storage, thì x<1><2> (=2) lưu ở đoạn 5 + 1 = 6 trên storage.

Rõ ràng có một storage với biết được các chỉ số size, offset, stride đã lấy rước được các thành phần trong tensor.

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

Tại sao buộc phải nhiều tin tức như vậy? Tưởng sinh hoạt trên chỉ việc mỗi số cột là lấy được hết các giá trị của tensor. Câu trả lời là để hoàn toàn có thể lưu các tensor thuộc trên 1 storage. Thuộc xem ví dụ về transpose tensor ngơi nghỉ dưới.

Transposing tensor

Torch tensor x với x_t (transpose) đang dùng tầm thường 1 storage thế vì buộc phải copy ra 1 vùng nhớ khác.

x = torch.tensor([[3, 1, 2>, [4, 1, 7>>)x_t = x.t() # Viết gọn cho x.transpose(0, 1)id(x.storage()) == id(x_t.storage()) # output: True. Hàm id trả về địa chỉ cửa hàng của x.storage(), bản thân thấy là x với x_t tất cả cùng storage.
Ví dụ trên bản thân thấy là x cùng x_t dùng bình thường 1 storage. Thuộc tính offset cả 2 đều bởi 0, kích cỡ thì không giống 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 nên nhảy 3 bộ phận trong storage để cho vị trí cột đấy nhưng ở sản phẩm dưới, x<0><0> = storage<0> = 3, x<1><0> = storage<3> = 4. Mặc dù nhiên, ngơi nghỉ x_t thì mình chỉ việc nhảy 1 phần tử trong storage để đến vị trí cột đấy nhưng mà ở mặt hàng dưới, x_t<0><0> = storage<0> = 3, x_t<1><0> = storage<1> = 1.

Mình thực hiện phép tính transpose tuy nhiên vẫn dùng thông thường storage. Ngoài ra, ví dụ như khi mọi người slicing chẳng hạn, thì để dùng tầm thường storage mình đã cần đổi khác offset, size, stride.

Contiguous tensors

Một vài ba phép tính vào Torch tensors chỉ điều khiển xe trên contigous tensors, lấy ví dụ như view. Để kiểm soát xem tensor gồm contiguous ko mình 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 sản xuất 1 tensor x bình thường, thì các giá trị x sẽ được lữu trữ liên tiếp (theo từng hàng, hết mặt hàng xuống mặt hàng dưới) với x sẽ tương xứng storage cho nên x đã là contiguous tensor, còn khi mình triển khai transpose thì x_t dùng phổ biến storage với x bắt buộc thứ từ index không còn được như mặc định, cho nên vì vậy x_t không phải contiguous tensor.

Mình có thể chuyển 1 tensor chưa phải contiguous tensor lịch sự contigous tensor bằng hàm contiguous().

x_t_con = x_t.contiguous()x_t_con.is_contiguous() # Trả về Truex_t_con.storage() # 3 4 1 1 2 7Mình thấy là giá trị x_t_con cùng x_t là như nhau, tuy vậy vùng storage khác biệt và stride đang khác nhau.

Torch GPU

Phần trước mình có nói về storage thì khoác định đã lưu sinh hoạt CPU, mặc dù Torch được cho phép tensor lưu ở GPU để thống kê giám sát song song tương tự như tăng vận tốc xử lý.

Nếu 1 tensor được lưu giữ ở GPU, thì những phép đo lường sẽ được thực hiện ở GPU.

Để khởi sản xuất 1 tensor với lưu trên gpu thì mình cần sử dụng thuộc 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 rất có thể copy 1 tensor từ bỏ CPU sang 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 giữ trên 1 GPU tuyệt nhất định đề xuất nếu có không ít GPU thì yêu cầu chỉ rõ lưu trên GPU nào, index GPU cũng bước đầu từ 0.

x_gpu = x.to(device="cuda:0")# hoặcx_gpu = x.cuda(0)x_gpu = x_gpu + 4 # thực hiện phép tính bên trên GPUĐể chuyển trái 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à tôi đã đi qua kỹ năng cơ bản của Torch tensors, những bài xích sau bản thân sẽ sử dụng tensors để xây các quy mô neural network, CNN,…

Torch Tensor to lớn Numpy Array

Torch cho phép chuyển tensor sang trọng Numpy array. Những thuộc tính về size, shape sẽ được giữ nguyên, type sẽ đưa từ Torch sang trọng Numpy.

x = torch.tensor([1,2,3>)x_np = x.numpy()Nếu tensor được lưu lại trên CPU, Torch tensor với Numpy array vẫn dùng bình thường vùng nhớ, nên thay đổi giá trị tại 1 biến thì quý hiếm biến sót lại cũng nỗ lực đổi.

x[1> = 0print(x) # output: [1, 0, 3>print(x_np) # output: [1, 0, 3>Nếu tensor được lưu lại trên GPU thì hầu hết người sẽ không thể gửi trực tiếp tensor sang trọng Numpy array được, mà mình đề nghị copy văn bản của tensor sang trọng CPU trước rồi bắt đầu chuyển thanh lịch Numpy array. Cho nên 2 trở thành trên gpu và np không dùng chung vùng nhớ và sửa 1 phát triển thành không tác động biến còn 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 hoàn toàn có thể chuyển Numpy array thanh lịch Torch tensor. Torch tensor đang lưu sinh sống CPU với 2 biến chuyển trên np cùng cpu sẽ dùng thông thường vùng nhớ.

Xem thêm: Nghĩa Của Từ Fleet Là Gì - Nghĩa Của Từ Fleet, Từ Fleet Là Gì

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 những kiến thức cơ phiên bản của Torch Tensors, bài xích sau mình vẫn học về autograd trong tensors.