Samar-blog

导航

P19_神经网络-非线性激活

19.1打开pytorch官网

1.打开torch.nn-Non-linear Activations-ReLU

可见:ReLU当输入为正值时输出为自身,当输入为负值时输出为0。
P19_ReLU大于0取原值而小于0被截断

2.打开torch.nn-Non-linear Activations-Sigmoid

Sigmoid是连续、平滑的s型激活函数,可以将一个实数映射到 (0, 1) 的区间,用来做二分类

P19_Sigmoid的非线性变换

3.激活函数

激活函数是指在多层神经网络中,上层神经元的输出和下层神经元的输入存在一个函数关系,这个函数就是激活函数。

19.2打开pycharm_ReLU

1.设置ReLu的input

点击查看代码
x import torchimport torch.nn​input = torch.tensor([[1,-0.5],                     [-1,3]])#此处input要求指定一个batch_size​input = torch.reshape(input,(-1,1,2,2)) #input经过shape变换,返回新的input#torch.reshape(input, shape) → Tensor,#其中shape即(-1,1,2,2),batch_szie=-1即batch_size自己算,一维的,2*2的矩阵print(input.shape)
输出为: `torch.Size([1, 1, 2, 2])`

2.创建神经网络

初始化函数中定义ReLU中的inplace(bool类型)

在不在原来的变量进行一个直接的替换:

当inplace设置为True时,经过ReLU后,input返回计算之后的值;

当inplace设置为False时,经过ReLU后,input保留原始值,同时新的变换值直接返回output。

P19_ReLU之inplace的设置

3.使用ReLU进行非线性变换

点击查看代码
import torch
from torch import nn
from torch.nn import ReLU

input = torch.tensor([[1,-0.5],
                     [-1,3]])
#此处input要求指定一个batch_size

input = torch.reshape(input,(-1,1,2,2)) #input经过shape变换,返回新的input
#torch.reshape(input, shape) → Tensor,
#其中shape即(-1,1,2,2),batch_szie=-1即batch_size自己算,一维的,2*2的矩阵
print(input.shape)

class Dyl(nn.Module):
    def __init__(self):
        super(Dyl, self).__init__()
        self.relu1 = ReLU()  #inplace默认是false
    def forward(self,input):
        output = self.relu1(input)
        return output
dyl = Dyl()
output = dyl(input)
print(output)
输出成果:
点击查看代码
torch.Size([1, 1, 2, 2])
tensor([[[[1., 0.],
          [0., 3.]]]])
######其中,原始的input的tensor数据是[[1,-0.5],[-1,3]],经过ReLU的非线性变换后,1和3不变,-0.5和-1被截断为0

为什么以上输出结果中有四层中括号:
输入从 2 维矩阵,经过 reshape变成 4 维张量,最终输出保持 4 维,因此有 4 层中括号。

【由于ReLU对图像变换不明显,改用Sigmoid进行图像的非线性变换】

19.3打开pycharm_Sigmoid

【前面手动定义的input和 CIFAR10 数据集的处理逻辑是独立的 —— 前者是测试单个小张量,后者是处理批量图片数据。】

1.输入代码

点击查看代码
import torch
import torchvision.datasets
from torch import nn
from torch.nn import ReLU, Sigmoid
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

input = torch.tensor([[1,-0.5],
                     [-1,3]])
#此处input要求指定一个batch_size

input = torch.reshape(input,(-1,1,2,2)) 
print(input.shape)

dataset = torchvision.datasets.CIFAR10(root="./dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(dataset,batch_size=64)

class Dyl(nn.Module):
    def __init__(self):
        super(Dyl, self).__init__()
        self.relu1 = ReLU()  
        self.sigmoid1 = Sigmoid()
    def forward(self,input):
        # output = self.relu1(input)
        output = self.sigmoid1(input)
        return output
dyl = Dyl()

step = 0
writer = SummaryWriter("./logs_sigmoid")
for data in dataloader:
    imgs,targets = data
    writer.add_images("input",imgs,step)
    output = dyl(imgs)  # 把批量图片送入模型,得到输出
    writer.add_images("output",output,step)
    step = step + 1

writer.close()

运行成果如下:

点击查看代码
torch.Size([1, 1, 2, 2])
Files already downloaded and verified

2.打开tensorboard

点击查看代码
tensorboard --logdir=logs_sigmoid

3.图像非线性变换成果如下:

P19_logs_sigmoid的tensorboard

posted on 2025-11-20 11:18  风居住的街道DYL  阅读(0)  评论(0)    收藏  举报