七、torch.nn

一、神经网络模块

进入到PyTorch的torch.nnAPI学习页面
PyTorch提供了很多的神经网络方面的模块,NN就是Neural Networks的简称
七、torch.nn_第1张图片

二、Containers

torch.nn下的Containers
一共有六个模块,最常用的就是Module模块,看解释可以知道,Module是为所有的神经网络所提供的基础类
七、torch.nn_第2张图片

Moduel

torch.nn.Containers下的Moduel
自己所搭建的神经网络必须继承这个Moduel类,其也相当于一个模板
七、torch.nn_第3张图片
模仿一下,创建一个神经网络模型,y = 5 + x
神经网络中的参数都是tensor类型,这点需要注意

import torch
from torch import nn


class Beyond(nn.Module):
    def __index__(self):
        super().__init__()

    def forward(self,input):
        output = input + 5
        return output

beyond = Beyond()
x = torch.tensor(5.0)
out = beyond(x)
print(out)#tensor(10.)

三、Convolution Layers

torch.nn下的Convolution Layers卷积层
常用的就是nn.Conv2d二维卷积,卷积核是二维
七、torch.nn_第4张图片

四、torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)

TORCH.NN.FUNCTIONAL.CONV2D方法使用说明
七、torch.nn_第5张图片

参数 描述 解释
input 形状的输入张量
weight 权重 也就是卷积核
bias 偏置
stride 卷积核的步幅。可以是单个数字或元组(sH, sW)。默认值:1 可以指定两个方向的步长,也可以输入一个参数同时设置两个方向
padding 输入两侧的隐式填充 也就是加边

卷积操作这里就不再赘述了,与kernel对应相乘再相加运算而已

import torch
import torch.nn.functional

input = torch.tensor([[1,2,3,4,5],
                      [5,4,3,2,1],
                      [1,2,3,4,5],
                      [5,4,3,2,1],
                      [1,2,3,4,5]])

kernel = torch.tensor([[1,2,3],
                       [3,2,1],
                       [1,2,3]])
print(input.shape)#torch.Size([5, 5])
print(kernel.shape)#torch.Size([3, 3])
#目前input和weight仅为(H,W),不符合conv2d的输入要求

#由官网看到的input为四维(minibatch,in_channels,iH,iW)数据,故提供reshape进行转变
#weight也是要求四维数据信息
input_re = torch.reshape(input,(1,1,5,5))
kernel_re = torch.reshape(kernel,(1,1,3,3,))
print(input_re.shape)#torch.Size([1, 1, 5, 5])
print(kernel_re.shape)#torch.Size([1, 1, 3, 3])

out_1 = torch.nn.functional.conv2d(input_re,kernel_re,stride=1)
print(out_1)
"""
tensor([[[[54, 60, 66],
          [54, 48, 42],
          [54, 60, 66]]]])
"""

out_2 = torch.nn.functional.conv2d(input_re,kernel_re,stride=2)
print(out_2)
"""
tensor([[[[54, 66],
          [54, 66]]]])
"""

out_3 = torch.nn.functional.conv2d(input_re,kernel_re,stride=1,padding=1)
print(out_3)
"""
tensor([[[[26, 32, 32, 32, 26],
          [30, 54, 60, 66, 36],
          [48, 54, 48, 42, 30],
          [30, 54, 60, 66, 36],
          [26, 32, 32, 32, 26]]]])
"""

五、torch.nn.ReLU(inplace=False)

ⅠReLU函数介绍

torch.nn.ReLU(inplace=False)官网提供的API
其中inplace表示是否在对原始数据进行替换

由函数图可以看出,负数通过ReLU之后会变成0,正数则不发生变化
七、torch.nn_第6张图片
例如:input = -1,若inplace = True,表示对原始输入数据进行替换,当通过ReLU函数(负数输出均为0)之后,input = 0
若inplace = False(默认),表示不对原始输入数据进行替换,则需要通过另一个变量(例如output)来对ReLU函数的结果进行接收存储,通过ReLU函数之后,output = 0,input = -1

ⅡReLU函数使用

创建一个二维tensor数据,通过reshape转换成(batch_size,channel,H,W)类型数据格式
传入仅含有ReLU的神经网络中,运行结果可以看出,负数都变成了0,正数均保持不变

import torch
from torch import nn

input = torch.tensor([[1,-0.7],
                      [-0.8,2]])

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

print(input)
"""
tensor([[[[ 1.0000, -0.7000],
          [-0.8000,  2.0000]]]])
"""


class Beyond(nn.Module):
    def __init__(self):
        super(Beyond,self).__init__()
        self.relu_1 = torch.nn.ReLU()

    def forward(self,input):
        output = self.relu_1(input)
        return  output

beyond = Beyond()
output = beyond(input)
print(output)
"""
tensor([[[[1., 0.],
          [0., 2.]]]])
"""

ⅢReLU训练CIFAR-10数据集上传至tensorboard

import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

dataset_test = torchvision.datasets.CIFAR10("CIFAR_10",train=False,transform=torchvision.transforms.ToTensor(),download=True)

dataloader = DataLoader(dataset_test,batch_size=64)

class Beyond(nn.Module):
    def __init__(self):
        super(Beyond,self).__init__()
        self.relu_1 = torch.nn.ReLU()

    def forward(self,input):
        output = self.relu_1(input)
        return output

writer = SummaryWriter("y_log")

beyond = Beyond()
i=0
for data in dataloader:
    imgs,targets = data
    writer.add_images("input_ReLU",imgs,i)
    output = beyond(imgs)
    writer.add_images("output_ReLU",output,i)
    i = i + 1


writer.close()

在Terminal下运行tensorboard --logdir=y_log --port=9999,logdir为打开事件文件的路径,port为指定端口打开;
通过指定端口9999进行打开tensorboard,若不设置port参数,默认通过6006端口进行打开。
七、torch.nn_第7张图片
点击该链接或者复制链接到浏览器打开即可
七、torch.nn_第8张图片

六、torch.nn.Sigmoid

ⅠSigmoid函数介绍

torch.nn.Sigmoid
七、torch.nn_第9张图片

ⅡSigmoid函数使用

创建一个二维tensor数据,通过reshape转换成(batch_size,channel,H,W)类型数据格式
传入仅含有Sigmoid的神经网络中,代入Sigmodi公式即可得到相应返回结果

import torch
from torch import nn

input = torch.tensor([[1,-0.7],
                      [-0.8,2]])

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

print(input)
"""
tensor([[[[ 1.0000, -0.7000],
          [-0.8000,  2.0000]]]])
"""


class Beyond(nn.Module):
    def __init__(self):
        super(Beyond,self).__init__()
        self.sigmoid_1 = torch.nn.Sigmoid()

    def forward(self,input):
        output = self.sigmoid_1(input)
        return  output

beyond = Beyond()
output = beyond(input)
print(output)
"""
tensor([[[[0.7311, 0.3318],
          [0.3100, 0.8808]]]])
"""

ⅢSigmoid训练CIFAR-10数据集上传至tensorboard

import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

dataset_test = torchvision.datasets.CIFAR10("CIFAR_10",train=False,transform=torchvision.transforms.ToTensor(),download=True)

dataloader = DataLoader(dataset_test,batch_size=64)

class Beyond(nn.Module):
    def __init__(self):
        super(Beyond,self).__init__()
        self.sigmoid_1 = torch.nn.Sigmoid()

    def forward(self,input):
        output = self.sigmoid_1(input)
        return  output

writer = SummaryWriter("y_log")

beyond = Beyond()
i=0
for data in dataloader:
    imgs,targets = data
    writer.add_images("input_Sigmoid",imgs,i)
    output = beyond(imgs)
    writer.add_images("output_Sigmoid",output,i)
    i = i + 1


writer.close()

在Terminal下运行tensorboard --logdir=y_log --port=9999,logdir为打开事件文件的路径,port为指定端口打开;
通过指定端口9999进行打开tensorboard,若不设置port参数,默认通过6006端口进行打开。
七、torch.nn_第10张图片

你可能感兴趣的:(PyTorch小笔记,深度学习,pytorch,神经网络)