建立tensor
x = torch.empty(*sizes) #建立一個未初始化的tensor(後面用torch.nn.init中的一些函數進行初始化)網絡
>>> torch.empty(2, 3) tensor(1.00000e-08 * [[ 6.3984, 0.0000, 0.0000], [ 0.0000, 0.0000, 0.0000]])
x = torch.rand(5, 3) #返回一個範圍爲[0,1)、size爲5*3的矩陣架構
tensor([[0.3380, 0.3845, 0.3217], [0.8337, 0.9050, 0.2650], [0.2979, 0.7141, 0.9069], [0.1449, 0.1132, 0.1375], [0.4675, 0.3947, 0.1426]])
x = torch.zeros(5, 3, dtype=torch.long)
app
tensor([[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]])
x = torch.ones(5, 3, dtype=torch.double)函數
tensor([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.], [1., 1., 1.], [1., 1., 1.]], dtype=torch.float64)
x = torch.tensor([5.5, 3]) #Construct a tensor directly from data
測試
tensor([5.5000, 3.0000])
tensor運算
torch.mm(tensor1, tensor2, out=None) #tensor的矩陣乘法matrix multiplication 優化
torch.mul(tensor1, tensor2, out=None) #tensor的點乘Hadamard productui
tensor相關操做
x.size() #取tensor的size,返回的是tuplespa
z = x.view(-1, 8) #和reshape功能同樣,只是參數少了一層括號.net
x = x.clamp(min, max) #取最大最小值,和numpy.clip(a, a_min, a_max, out=None)相似code
torch.max()
torch.max(Tensor) #對全部元素,取最大值,返回只有一個數的tensor
torch.max(input, dim, keepdim=False, out=None) #對dim維度上的元素取最大值,返回兩個tensor,第一個是dim上的最大值,第二個是最大值所在的位置(argmax)
torch.cat(seq, dim=0, out=None) #concatenate,功能和numpy.concatenate((a1, a2, ...), axis=0, out=None)同樣,格式也剛好同樣
一個技巧:inputs = torch.cat(inputs).view(len(inputs), 1, -1) #先cat再view(reshape)
torch.stack( (a,b,c) ,dim = 2) #創建一個新的維度,而後再在該緯度上進行拼接
torch.stack VS torch.cat:cat是在已有的維度上拼接,而stack是創建一個新的維度,而後再在該緯度上進行拼接。
用其實現 x.append(in_tensor) 的功能:先構造已經append好的x(此時x爲list),而後x = torch.stack(x, dim = 0)
可參考 https://blog.csdn.net/Teeyohuang/article/details/80362756
torch.unsqueeze(input, dim, out=None) #給input(一個tensor)在dim維度上增長一個維度
>>> x = torch.tensor([1, 2, 3, 4]) >>> torch.unsqueeze(x, 0) tensor([[ 1, 2, 3, 4]]) >>> torch.unsqueeze(x, 1) tensor([[ 1], [ 2], [ 3], [ 4]])
b = a.numpy() #torch tensor轉numpy array
b = torch.from_numpy(a) #numpy array轉torch tensor(兩種轉都是沒有複製,而是直接引用的)
tensor_a , idx_sort = torch.sort(tensor_a, dim=0, descending=True) #tensor排序,返回排序後的tensor和下標
tensor求導
x = torch.ones(2, 2, requires_grad=True) #建立時設置requires_grad爲True,將x當作待優化的參數(權重)
model.zero_grad() #將每一個權重的梯度清零(由於梯度會累加)
optimizer.zero_grad() #當optimizer=optim.Optimizer(model.parameters())時,其與model.zero_grad()等效
loss.backward() #求導,即對loss進行back propagation
optimizer.step() #在back propagation後更新參數
定義神經網絡:
1. 定義網絡架構(模型的forward,一般用一個繼承自torch.nn.Module的類)
__init__():將nn實例化(每個nn都是一個類),參數本身定義
forward(self, x):模型的forward,參數x爲模型輸入
self.add_module("conv", nn.Conv2d(10, 20, 4)) # self.conv = nn.Conv2d(10, 20, 4) 和這個增長module的方式等價
torch.nn.Embedding(num_embeddings, embedding_dim, ...) #是一個矩陣類,裏面初始化了一個隨機矩陣,矩陣的長是字典的大小,寬是用來表示字典中每一個元素的屬性向量,向量的維度根據你想要表示的元素的複雜度而定。類實例化以後能夠根據字典中元素的下標來查找元素對應的向量。
2. 定義輸入輸出
3. 定義loss(若是用nn須要實例化才定義,不然用functional直接在訓練中用)
4. 定義優化器
訓練:
1. 初始化,如model.zero_grad()將一些參數初始化爲0
2. 準備好輸入
3. 將模型設置爲train模式
4. 將模型forward
5. 計算loss和accuracy
6. back propagation並計算權重的梯度
7. 作validation
8. 打印Epoch、loss、acc、time等信息
(不必定全部步驟都有,能夠看狀況省略部分)
驗證或測試:
1. 準備好輸入
2. 將模型設置爲eval模式
3. 將模型forward
4. 計算loss和accuracy
5. 打印loss、acc等信息
(train和test相比,主要多了bp相關的,包括zero_grad()和backward()等)
torch.
max
(input, dim, keepdim=False, out=None)