一、Non-Linear Activations 非线性激活
1、RELU
input > 0时,取原始值;input < 0时,取0
Input:(N, *) N - batch_size
Output:(N, *) N - batch_size
nn.ReLU(inplace:bool=false)
inplace为True, input = -1, ReLU(input, inplace=True) —— input = 0
inplace为False,input = -1, output = ReLU(input, inplace=False) —— input = -1, output = 0
即是否替换原input的值(原位操作)
2、SIGMOID
3、使用Sigmoid后得到的图像
原图像
Sigmoid后的图像
4、具体代码
import ssl
import torch
import torchvision
from torch import nn
from torch.nn import Sigmoid
from torch.nn import ReLU
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
ssl._create_default_https_context = ssl._create_unverified_context
dataset = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor(),
download=True)
dataLoader = DataLoader(dataset, batch_size=64)
inputData = torch.tensor([[-2, 1.],
[2., -3]])
inputData = torch.reshape(inputData, (-1, 1, 2, 2))
print(inputData)
class TestRelu(nn.Module):
def __init__(self):
super(TestRelu, self).__init__()
self.relu1 = ReLU()
def forward(self, input):
output = self.relu1(input)
return output
tr = TestRelu()
outputData = tr(inputData)
print(outputData)
class TestSigmoid(nn.Module):
def __init__(self):
super(TestSigmoid, self).__init__()
self.sigmoid1 = Sigmoid()
def forward(self, input):
output = self.sigmoid1(input)
return output
ts = TestSigmoid()
writer = SummaryWriter("logs")
step = 0
for data in dataLoader:
imgs, target = data
writer.add_images("input_image", imgs, step, dataformats="NCHW")
output = ts(imgs)
writer.add_images("output_image", output, step, dataformats="NCHW")
step += 1
writer.close()
二、线性层
1、基础原理
k1 × x1 + b1
k2 × x2 + b2
...
kd × xd + bd
ki 为 权重, bi 为 偏移量
VGG16
使用torch.flatten(图片) 将图片展成一行
2、详细代码
import ssl
import torch
import torchvision
from torch import nn
from torch.nn import Linear
from torch.utils.data import DataLoader
ssl._create_default_https_context = ssl._create_unverified_context
dataset = torchvision.datasets.CIFAR10("./dataset", train=False,
transform=torchvision.transforms.ToTensor(), download=True)
dataLoader = DataLoader(dataset, batch_size=64, drop_last=True) # drop_last True 最后一页不足舍弃
class TestLinear(nn.Module):
def __init__(self):
super(TestLinear, self).__init__()
self.linear1 = Linear(196608, 10)
def forward(self, input):
output = self.linear1(input)
return output
tl = TestLinear()
for data in dataLoader:
imgs, target = data
print(imgs.shape)
# output = torch.reshape(imgs, (1, 1, 1, -1)) 将图像展开成一行
output = torch.flatten(imgs) # 将[64, 3, 32, 32] -> 转换为 [1, 1, 1, 196608]
print(output.shape)
output = tl(output)
print(output.shape)