在簡書的筆記系統(tǒng)看到自己還寫過一篇這個智末,放出來一下,不然就發(fā)霉了
torch.mul() 耙箍、 torch.mm() 及torch.matmul()的區(qū)別
1聂受、torch.mul(a, b)是矩陣a和b對應(yīng)位相乘,a和b的維度必須相等坦喘,比如a的維度是(1, 2)盲再,b的維度是(1, 2),返回的仍是(1, 2)的矩陣瓣铣;
2答朋、torch.mm(a, b)是矩陣a和b矩陣相乘,比如a的維度是(1, 2)棠笑,b的維度是(2, 3)梦碗,返回的就是(1, 3)的矩陣。
import torch
a = torch.rand(1, 2)
b = torch.rand(1, 2)
c = torch.rand(2, 3)
print(torch.mul(a, b)) # 返回 1*2 的tensor
print(torch.mm(a, c)) # 返回 1*3 的tensor
print(torch.mul(a, c)) # 由于a蓖救、b維度不同洪规,報錯
pytorch 的塊就是按照順序儲存的
class Sequ(nn.Module):
def __init__(self,*args):
super().__init__()
self._addmodules ={}
for id ,module in enumerate(args):
self._addmodules[str(id)] = module
def forward(self,X):
for modulex in self._addmodules.values():
X = modulex(X)
return X
nn.ReLU和F.ReLU的區(qū)別
nn.ReLU和F.ReLU兩種實現(xiàn)方法。
其中nn.ReLU作為一個層結(jié)構(gòu)循捺,必須添加到nn.Module容器中才能使用斩例,而F.ReLU則作為一個函數(shù)調(diào)用,看上去作為一個函數(shù)調(diào)用更方便更簡潔从橘。具體使用哪種方式念赶,取決于編程風格。在PyTorch中,nn.X都有對應(yīng)的函數(shù)版本F.X恰力,但是并不是所有的F.X均可以用于forward或其它代碼段中叉谜,因為當網(wǎng)絡(luò)模型訓練完畢時,在存儲model時踩萎,在forward中的F.X函數(shù)中的參數(shù)是無法保存的停局。也就是說,在forward中,使用的F.X函數(shù)一般均沒有狀態(tài)參數(shù)董栽,比如F.ReLU履怯,F(xiàn).avg_pool2d等,均沒有參數(shù)裆泳,它們可以用在任何代碼片段中。
PyTorch之nn.ReLU與F.ReLU的區(qū)別_鵲踏枝-碼農(nóng)的博客-CSDN博客_nn.relu和f.relu
Whats the difference between nn.relu() vs F.relu() - PyTorch Forums
塊的多層嵌套
def block1():
return nn.Sequential(nn.Linear(4, 8), nn.ReLU(),
nn.Linear(8, 4), nn.ReLU())
def block2():
net = nn.Sequential()
for i in range(4):
# 在這里嵌套
net.add_module(f'block {i}', block1())
return net
rgnet = nn.Sequential(block2(), nn.Linear(4, 1))
rgnet(X)
卷積神經(jīng)網(wǎng)絡(luò)
池化層和卷積層其實差別不大
卷積層求的是在卷積核大小的區(qū)域的數(shù)據(jù)與卷積核的數(shù)據(jù)的加權(quán)和柠硕,池化層求的是一定區(qū)域內(nèi)的平均值或者最大值
cov2d
def corr2d(X, K): #@save
"""計算二維互相關(guān)運算"""
h, w = K.shape
Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
Y[i, j] = (X[i:i + h, j:j + w] * K).sum() ###這個K就是cov2d和pooling的區(qū)別
return Y
X = torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]])
K = torch.tensor([[0.0, 1.0], [2.0, 3.0]])
corr2d(X, K)
pooling
def pool2d(X, pool_size, mode='max'):
p_h, p_w = pool_size
Y = torch.zeros((X.shape[0] - p_h + 1, X.shape[1] - p_w + 1))
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
if mode == 'max':
Y[i, j] = X[i: i + p_h, j: j + p_w].max()
elif mode == 'avg':
Y[i, j] = X[i: i + p_h, j: j + p_w].mean()
return Y
循環(huán)神經(jīng)網(wǎng)絡(luò)
基于嵌入維度工禾,將數(shù)據(jù)映射為數(shù)據(jù)對和,但是會丟失前面項蝗柔,因為沒有足夠的歷史記錄來描述前個數(shù)據(jù)樣本闻葵。
一個簡單的解決辦法是:如果擁有足夠長的序列就丟棄這幾項;
另一個方法是用零填充序列癣丧。
tau = 4
features = torch.zeros((T - tau, tau))
for i in range(tau):
features[:, i] = x[i: T - tau + i]
labels = x[tau:].reshape((-1, 1))
x.shape
### torch.Size([1000])
features.shape
### features.shape
#### features ## 注意這種編碼形式槽畔,也就是四個為一組,然后從第二個構(gòu)建一行
tensor([[-0.0036, -0.1588, 0.1267, 0.1920],
[-0.1588, 0.1267, 0.1920, 0.0842],
[ 0.1267, 0.1920, 0.0842, -0.1051],
...,
[-0.5951, -0.5278, -0.5754, -0.8150],
[-0.5278, -0.5754, -0.8150, -0.4767],
[-0.5754, -0.8150, -0.4767, -0.1860]])