P19_神经网络-非线性激活
19.1打开pytorch官网
1.打开torch.nn-Non-linear Activations-ReLU
可见:ReLU当输入为正值时输出为自身,当输入为负值时输出为0。

2.打开torch.nn-Non-linear Activations-Sigmoid
Sigmoid是连续、平滑的s型激活函数,可以将一个实数映射到 (0, 1) 的区间,用来做二分类

3.激活函数
激活函数是指在多层神经网络中,上层神经元的输出和下层神经元的输入存在一个函数关系,这个函数就是激活函数。
19.2打开pycharm_ReLU
1.设置ReLu的input
点击查看代码
x import torchimport torch.nninput = torch.tensor([[1,-0.5], [-1,3]])#此处input要求指定一个batch_sizeinput = 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)
2.创建神经网络
初始化函数中定义ReLU中的inplace(bool类型)
在不在原来的变量进行一个直接的替换:
当inplace设置为True时,经过ReLU后,input返回计算之后的值;
当inplace设置为False时,经过ReLU后,input保留原始值,同时新的变换值直接返回output。

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.]]]])
为什么以上输出结果中有四层中括号:
输入从 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.图像非线性变换成果如下:

浙公网安备 33010602011771号