Pytorch 神經網絡模塊之 Linear Layers


1. torch.nn.Linear

   PyTorch 中的 nn.linear() 是用於設置網絡中的全連接層的,需要注意的是全連接層的輸入與輸出都是二維張量,一般形狀為 [batch_size, size]。

"""
in_features: 指的是輸入矩陣的列數,即輸入二維張量形狀 [batch_size, input_size] 中的 input_size,代表每個樣本 x 的特征數,也是輸入層神經元的個數
out_features: 指的是輸出矩陣的列數,即輸出二維張量形狀 [batch_size,output_size] 中的 output_size,代表每個樣本輸出 y 的特征數,也是輸出層神經元的個數
bias: 如果為 True,則網絡的輸出需要再加上一個偏置向量,維度為 output_size
"""
class torch.nn.Linear(in_features,out_features,bias=True)

   這個網絡所作的變換為:

$$Y = XA^{T} + b$$

   這里的 $X$ 是一個矩陣,而不是向量,一般將一個 batch 中的樣本組成一個輸入矩陣,矩陣 $X$ 的每一行代表一個輸入樣本,舉個例子:

    

   輸入是一個形狀為 $(4, 6)$ 的矩陣,也就是說這個矩陣由 $4$ 個樣本組成,每個樣本有 $6$ 個維度的特征,$W^{T}$ 是全連接層的權重矩陣,

   形狀為 $(6, 10)$,也就是說,每個輸入樣本($X$ 的每一行)在這個矩陣的作用下,輸出維度變為 $10$(向量),即輸入層有 $6$ 個神經元,輸

   出層有 $10$ 個神經元,$b$ 是個偏置向量,它的維度等於輸出神經元的個數 $10$,但是 $XW^{T}$ 的輸出是一個 $4 \times 10$ 的矩陣,它是

   沒辦法和一個向量相加的,所以這就利用到了 Tensor 的廣播機制,形狀 $(4,10)$ 和形狀 $(10)$ 由於缺失可以觸發廣播機制(該博客底部) ,

   即最終執行的操作為:

    

   矩陣 $Y$ 的每一行就是每個樣本對應的神經網絡的輸出,一共 $4$ 個樣本,所以矩陣 $Y$ 的形狀為 $(4,10)$。

import torch

X = torch.randn(128, 20)          # 輸入的維度是(128,20)
model = torch.nn.Linear(20, 30)   # 20,30 是指維度
Y = model(X)
print('model.weight.shape: ', model.weight.shape)  # 矩陣
print('model.bias.shape: ', model.bias.shape)      # 向量
print('output.shape: ', Y.shape)                   # 矩陣

# 等價於下面的
ans = torch.mm(X, model.weight.t()) + m.bias # Y = XW.T + b
print('ans.shape: ', ans.shape)

"""
model.weight.shape:  torch.Size([30, 20])
model.bias.shape:  torch.Size([30])
output.shape:  torch.Size([128, 30])
ans.shape:  torch.Size([128, 30])
"""

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM