一、非线性激活
主要是为了给神经网络中引入一些非线性特质,常见的有RELU、Sigmoid。
# RELU
(1)查看官方文档
(2)代码示例
由(1)中图像知:当input小于0时,output取0;当input大于0时,output=input
#Sigmoid
(1)查看官方文档
(2)代码示例
代码修改:
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]])
output = torch.reshape(input,(-1, 1, 2, 2))
print(output.shape)
dataset = torchvision.datasets.CIFAR10("./dataset", train=True, download=True, transform=torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset, batch_size=64)
class Swagkg(nn.Module):
def __init__(self):
super(Swagkg, self).__init__()
#self.relu1 = ReLU()
self.sigmoid1 = Sigmoid()
def forward(self, input):
# output = self.relu1(input)
output = self.sigmoid1(input)
return output
swagkg = Swagkg()
# output = swagkg(input)
# print(output)
writer = SummaryWriter("logs_sigmoid")
step = 0
for data in dataloader:
imgs, targets =data
writer.add_images("input", imgs, step)
output = swagkg(imgs)
writer.add_images("output", output, step)
step += 1
writer.close()
运行代码:
查看图像,有的不显示,且step从3开始:
解决:运行时多加一个“--samples_per_plugin=images=1000”,即使用“tensorboard --logdir=C:\Users\zzu\PycharmProjects\pythonProject\logs_sigmoid --samples_per_plugin=images=1000”
结果显示:
非线性变换的主要目的:在网络中引入一些非线性特征,非线性越多,才能训练出符合各种曲线或者符合各自特征的一个模型,提高模型的一个泛化能力。
二、其他种类的层
#正则化层(normalization):可以加快神经网络的训练速度
(在特定的网络中,或许会用到的一些层)
# Recurrent层:一种特定的网络结构,会用于一些文字识别当中,如:RNN、LSTM等。
# Transformer层:在特定的网络中提出的一种特定的结构。
# dropout层:在训练过程中,会随机的按概率p把一些input tensor数据类型中的一些元素变为0,主要为了防止过拟合。
# Sparse层:Embedding。用于自然语言处理中。
三、线性层Linear Layers(常用)
(1)查看官方文档
(2)图解:其中,weight相当于Kd
例:in_features=4096,out_features=1000
(3)代码示例
进行先行层操作之前:
修改代码,进行线性层处理:
使用flattern把数据展平,会更直观看出变化:
修改代码: