分解Cat vs Ravbbit模型中的各個層次。為了方便講解,我們將取一個大小為224x224的且批次為 10 (10張224*224大小的圖片)的隨機 tensor,然後看看當我們將它通過網絡時會發生什麼。
input_image = torch.rand(3,224,224)
print(input_image.size())
接著初始化nn.Flatten
層,將每個 3D 的 224x224 圖像轉換成一個包含 150528 個像素值的連續數組,可以想像成將圖片攤平成一條線的概念:
flatten = nn.Flatten()
flat_image = flatten(input_image)
print(flat_image.size())
nn.Linear
:線性層使用權重和偏差對輸入進行線性變換,這個就是最基本的神經網路,每個節點的輸出會=權重×輸入+偏差 :
layer1 = nn.Linear(in_features=224*224, out_features=1024)
hidden1 = layer1(flat_image)
print(hidden1.size())
nn.ReLU
:非線性激活函數在線性變換之後應用,引入非線性,有助於神經網絡學習各種現象。
print(f"Before ReLU: {hidden1}\n\n")
hidden1 = nn.ReLU()(hidden1)
print(f"After ReLU: {hidden1}")
nn.Sequential
:是一個有序的容器。數據按照定義的順序通過所有模塊。您可以使用Sequential容器來快速組合一個網絡,就像seq_modules一樣。
seq_modules = nn.Sequential(
flatten,
layer1,
nn.ReLU(),
nn.Linear(1024, 10)
)
input_image = torch.rand(10, 3, 224, 224)
logits = seq_modules(input_image)
nn.Softmax
:神經網絡的最後一個線性層返回logits,這是落在[-無窮, 無窮]範圍內的原始值。這些logits被傳遞給nn.Softmax,將它們縮放為落在[0, 1]範圍內的值,表示模型對每個類別的預測概率。
softmax = nn.Softmax(dim=1)
pred_probab = softmax(logits)
今天說明了神經網路每個曾的作用,這些隨然指示神經網路架構中的冰山一角,但是卻是非常關鍵的架構,若有興趣也可以看看數學理解為什麼會這樣被設計。