Tensor與tensor深入分析與異同

我是土堆發表於2019-01-20

在Pytorch官方文件中,對於 Tensortensor 是這樣定義的:

A torch.Tensor is a multi-dimensional matrix containing elements of a single data type

To create a tensor with pre-existing data, use torch.tensor()

Tensor 是多維矩陣,矩陣的元素都是同一種資料型別。

tensor 需要確切的資料對它進行賦值。

對於變數,建立的方式有兩種:建立變數的資料形狀大小並初始化;直接賦值確切的資料值

接下來,就討論 Tensortensor 建立的特點:

方式一:建立變數的資料形狀大小並初始化

指定形狀的大小時,會發生這種情況:對於多維矩陣,(3,4)可以表示三行四列的矩陣,這是沒有歧義的。對於 Tensor 會建立一個三行四列的矩陣,但是對於 tensor 卻無法建立相應的變數。因為它需要卻確定的資料值。

但當輸入(5)時,Tensor 是一個矩陣,所以將這個5理解為是(1,5),一行五列的矩陣。

tensor 會將這個5認為是一個確定的資料。它會建立出一個值為5的變數。

程式碼:

輸入為5時:

Input:
	>>>x = torch.Tensor(3, 4)
	>>>y = torch.tensor(3, 4)	#這行是錯誤的,因為tensor需要確切的資料值
	>>>print(x)
Output:
tensor([[1.3733e-14, 6.4076e+07, 2.0706e-19, 7.3909e+22],
        [2.4176e-12, 1.1625e+33, 8.9605e-01, 1.1632e+33],
        [5.6003e-02, 7.0374e+22, 1.0284e+21, 1.0596e-38]])

輸入為(5)時:

Input:
    >>>x = torch.Tensor(5)
    >>>y = torch.tensor(5)
    >>>print(x.size())
	>>>print(y.size())
    >>>print(x.type())
    >>>print(y.type())
Output:
    torch.Size([5])		#這個表示,x是一個一維張量,就像數學中的向量
    torch.Size([])		#這個表示,y是一個標量,是一個0維度的張量
    torch.FloatTensor	#x在未指定資料型別的時候,預設是FloatTensor型別
    torch.LongTensor	#tensor在未指定資料型別的時候,會根據賦值資料的形式,選擇相應的型別

方式二:直接賦值確切的資料值

Tensortensor都可以通過這種方式進行建立變數。但有一種特殊情況,就是 torch.Tensor(5.6) 是錯誤的。你可以這樣理解,因為Tensor建立的是多維矩陣,從嚴格意義上說,標量(一個數字),不是矩陣。所以Tensor無法建立。而這種方式就是允許的,torch.Tensor([5.6])

Input:
	>>>a = torch.Tensor([[5.6, 5.8],[2, 4]])
	>>>b = torch.tensor([[5.6, 5.8],[2, 4]])
	>>>print(a)
	>>>print(b)
	>>>print(a.size())
	>>>print(b.size())
	>>>print(a.type())
	>>>print(b.type())
Output:
tensor([[5.6000, 5.8000],
        [2.0000, 4.0000]])
tensor([[5.6000, 5.8000],
        [2.0000, 4.0000]])
torch.Size([2, 2])
torch.Size([2, 2])
torch.FloatTensor
torch.FloatTensor

接下來示範下錯誤的一些方式

Error:
	>>>a = torch.tensor(3, 4)	#tensor是從已有資料中建立矩陣的,這種形式,tensor無法對矩陣中的元素進行初始化,所以無法進行建立。如果是Tensor時,Tensor預設的資料型別是FloatTensor,可以對其進行初始化
	>>>a = torch.Tensor(5.6)

總結:

Tensor主要是建立多維矩陣的,標量從某種意義上,不算矩陣。所以Tensor可以通過賦值多維矩陣的方式建立,但是無法指定標量值進行建立。如果想建立單個值,採用[5.6] 這種形式,指定一行一列的矩陣。

同時,Tensor可以指定多維矩陣形狀的大小,並且預設的資料型別是FloatTensor

tensor主要是根據確定的資料值進行建立,無法直接指定形狀大小,需要根據資料的大小進行建立。但同時,tensor沒有賦值資料值是矩陣的限制,可以直接使用tensor(5.6)

Input:
    a = torch.tensor(5.6)
    print(a)
    print(a.size())
Output:
    tensor(5.6000)
    torch.Size([])	#pytorch對標量(0維矩陣)的表示

Github: https://github.com/zhiyaozhou/Pytorch-Tutorial

公眾號:「土堆碎念」
一些不成熟的想法與碎念
一些無趣,精心打造的教程

在這裡插入圖片描述

相關文章