1.非线性激活的作用
引入非线性关系: 如果在神经网络中只使用线性操作(如线性加权和),整个网络就会变成一个大的线性函数,多个线性层的组合依然是一个线性变换。非线性激活函数(例如sigmoid、tanh、ReLU等)引入了非线性关系,允许网络学习和表示非线性的模式,这对于解决复杂任务非常关键。
常见非线性激活函数:
1. Sigmoid 函数(Logistic 函数):
- 作用: 将输入映射到范围(0, 1)之间。在二元分类问题中常用作输出层的激活函数。但它在深层网络中容易引起梯度消失问题,因此在隐藏层中的使用相对较少。
2. Tanh 函数(双曲正切函数):
- 作用: 将输入映射到范围(-1, 1)之间,相比于sigmoid函数,tanh函数的输出范围更广,可以将数据“居中”,有时用于隐藏层的激活函数,可以缓解梯度消失问题。3. ReLU 函数(修正线性单元):
- 作用: 对于正数输入,输出与输入相同;对于负数输入,输出为零。ReLU函数能够加速网络的收敛,但也可能导致神经元“死亡”(输出恒为零),因此在一些变种中,如Leaky ReLU和Parametric ReLU,对负数输入有小的斜率,以避免这个问题。4. Leaky ReLU 函数:
其中,是一个小的正数,通常取0.01。Leaky ReLU在负数输入时引入一个小的斜率,以防止神经元“死亡”。
5. Softmax 函数:
- 作用: 通常用于多类别分类问题的输出层。Softmax函数将网络的原始输出转化为概率分布,使得每个类别的预测概率在(0, 1)范围内,并且所有类别的概率之和为1。
2. Tensorboard显示
import torch
import torchvision
from torch import nn
from torch.nn import ReLU
from torch.nn import Sigmoid
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
dataset = torchvision.datasets.CIFAR10("./dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(dataset, batch_size=64)
class Tudui(nn.Module):
def __init__(self):
super(Tudui, self).__init__()
self.relu1 = ReLU()
self.sigmoid1 = Sigmoid()
def forward(self, input):
output = self.sigmoid1(input)
return output
tudui = Tudui()
writer = SummaryWriter("logs")
step = 0
for data in dataloader:
imgs, targets = data
writer.add_images("input", imgs, step)
output = tudui(imgs)
writer.add_images("output", output, step)
step = step + 1