目錄
一、簡介
二、常見的非線性激活函數(shù)
三、實(shí)現(xiàn)非線性激活函數(shù)
四、示例:應(yīng)用非線性激活函數(shù)
一、簡介
在神經(jīng)網(wǎng)絡(luò)中,激活函數(shù)的主要目的是引入非線性特性,從而使網(wǎng)絡(luò)能夠?qū)Ψ蔷€性數(shù)據(jù)建模。如果只使用線性變換,那么整個神經(jīng)網(wǎng)絡(luò)就會退化為一個線性模型,因?yàn)榫€性函數(shù)的組合仍然是線性的。非線性激活函數(shù)通過引入非線性性質(zhì),使神經(jīng)網(wǎng)絡(luò)能夠適應(yīng)更復(fù)雜的數(shù)據(jù)。
二、常見的非線性激活函數(shù)
ReLU(Rectified Linear Unit)
ReLU 是一種廣泛使用的非線性激活函數(shù)。它的數(shù)學(xué)表達(dá)式如下:
f(x) = max(0, x)
ReLU 將小于零的輸入值設(shè)為零,而大于零的輸入值保持不變。這種性質(zhì)使得神經(jīng)網(wǎng)絡(luò)能夠?qū)W習(xí)到稀疏特征,加速訓(xùn)練,以及更好地處理梯度消失問題。在 PyTorch 中,可以使用 torch.nn.ReLU()
實(shí)現(xiàn) ReLU 激活。
Sigmoid 函數(shù)
Sigmoid 函數(shù)是另一種非線性激活函數(shù),它的數(shù)學(xué)表達(dá)式如下:
f(x) = 1 / (1 + exp(-x))
Sigmoid 函數(shù)將輸入值映射到 0 到 1 之間,它在二元分類問題中廣泛使用。然而,Sigmoid 函數(shù)在深度神經(jīng)網(wǎng)絡(luò)中容易出現(xiàn)梯度消失問題。在 PyTorch 中,可以使用 torch.nn.Sigmoid()
實(shí)現(xiàn) Sigmoid 激活。
三、實(shí)現(xiàn)非線性激活函數(shù)
在 PyTorch 中,實(shí)現(xiàn)非線性激活函數(shù)非常簡單。首先定義一個繼承自 nn.Module
的類,然后在 forward
方法中應(yīng)用所需的激活函數(shù)。下面是一個使用 ReLU 和 Sigmoid 激活函數(shù)的示例:
import torch
from torch import nn
from torch.nn import ReLU, Sigmoid
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init()
self.relu = ReLU()
self.sigmoid = Sigmoid()
def forward(self, x):
x_relu = self.relu(x)
x_sigmoid = self.sigmoid(x)
return x_relu, x_sigmoid
在上面的示例中,首先導(dǎo)入必要的庫,然后定義了一個自定義模型 MyModel
,它包含了 ReLU 和 Sigmoid 激活函數(shù)。在 forward
方法中,分別應(yīng)用了這兩個激活函數(shù)。
四、示例:應(yīng)用非線性激活函數(shù)
下面將看到一個具體的示例,把非線性激活函數(shù)應(yīng)用于圖像數(shù)據(jù)。然后使用 PyTorch 和 CIFAR-10 數(shù)據(jù)集,這是一個廣泛使用的圖像分類數(shù)據(jù)集。最后使用 ReLU 和 Sigmoid 激活函數(shù),并使用 TensorBoard 可視化結(jié)果。
import torch
from torch import nn
from torch.nn import ReLU, Sigmoid
from torch.utils.tensorboard import SummaryWriter
from torch.utils.data import DataLoader
import torchvision.datasets
# 加載 CIFAR-10 數(shù)據(jù)集
dataset = torchvision.datasets.CIFAR10("D:\\Python_Project\\pytorch\\dataset2", train=False, transform=torchvision.transforms.ToTensor(), download=True)
dataloader = DataLoader(dataset, batch_size=64)
# 定義自定義模型
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
self.relu = ReLU()
self.sigmoid = Sigmoid()
def forward(self, x):
x_relu = self.relu(x)
x_sigmoid = self.sigmoid(x)
return x_relu, x_sigmoid
# 創(chuàng)建模型實(shí)例和 TensorBoard 編寫器
model = MyModel()
writer = SummaryWriter("logs")
step = 0
# 遍歷數(shù)據(jù)集并應(yīng)用模型
for data in dataloader:
imgs, targets = data
output_relu, output_sigmoid = model(imgs)
writer.add_images("input", imgs, step)
writer.add_images("output_relu", output_relu, step)
writer.add_images("output_sigmoid", output_sigmoid, step)
step += 1
writer.close()
在上面的示例中,首先加載 CIFAR-10 數(shù)據(jù)集,然后定義了一個自定義模型 MyModel
,其中包含了 ReLU 和 Sigmoid 激活函數(shù)。遍歷數(shù)據(jù)集,將輸入圖像和經(jīng)過激活函數(shù)處理后的輸出圖像寫入 TensorBoard,以便進(jìn)行可視化。
通過這個示例,可以看到非線性激活函數(shù)如何改變輸入數(shù)據(jù),引入非線性特性,從而增強(qiáng)神經(jīng)網(wǎng)絡(luò)的建模能力。
參考資料:文章來源:http://www.zghlxwxcb.cn/news/detail-736216.html
視頻教程:PyTorch深度學(xué)習(xí)快速入門教程(絕對通俗易懂?。拘⊥炼选?span toymoban-style="hidden">文章來源地址http://www.zghlxwxcb.cn/news/detail-736216.html
到了這里,關(guān)于PyTorch入門學(xué)習(xí)(十):神經(jīng)網(wǎng)絡(luò)-非線性激活的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!