我们知道,神经网络是我们学习机器学习以及深度学习时常听到的一个名词,我们会想什么是神经网络,它在我们机器学习中起什么样的一个作用,我们今天就来解开神经网络的神秘面纱。

神经网络也称为人工神经网络(ANN)或模拟神经网络(SNN),是机器学习的一个子集,是深度学习算法的核心。它们的名字和结构受到人类大脑的启发,模仿生物神经元相互发出信号的方式

神经网络已知标签预测 神经网络标签的含义_神经网络

人工神经网络(ANN)由节点层组成,包含一个输入层,一个或多个隐藏层和一个输出层。每个节点或人工神经元连接到另一个节点,并具有相关的权重和阈值。如果任何单个节点的输出高于指定的阈值,则会激活该节点,并将数据发送到网络的下一层。否则,不会将任何数据传递到网络的下一层。神经网络依靠训练数据来学习并随着时间的推移提高其准确性。然而,一旦这些学习算法被微调到准确性,它们就是计算机科学和人工智能中的强大工具,使我们能够以高速对数据进行分类和聚类。与人类专家的手动识别相比,语音识别或图像识别中的任务可能需要几分钟而不是几小时。(这是官网对神经网络的一个解释)我们接下来看看如何用我们的pytorch去搭建是基本的神经网络

torch.nn(官网提供的范例):

import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):
    def __init__(self):
        super().__init__()
        #这里可以根据我们自己的需求进行修改
        self.conv1 = nn.Conv2d(1, 20, 5)
        self.conv2 = nn.Conv2d(20, 20, 5)
    #前向传播神经网络
    def forward(self, x):
        x = F.relu(self.conv1(x))
        return F.relu(self.conv2(x))

在这里使用Model实例化nn.Module这个类,在我们具体使用过程中,可以按照这个模板进行自己的设计。如下所示:

import torch
from torch import nn

#实例化nn.Module
class PPt(nn.Module):

    def __init__(self):
        super().__init__()
    #s实现简单的+1操作
    def forward(self, input):
        output = input+1
        return output
#函数调用
PPt = PPt()
x = torch.tensor(1.0)
output = PPt(x)
print(output)

上面是一个简单的框架,我们来了解一下在上面的框架里面所提到的卷积(这里知识进行了简单的运算):

import torch
import torch.nn.functional as F

#这里我们直接设计了一个输入
#主要是为了更清楚的了解卷积的操作
input = torch.tensor([[1, 2, 0, 3, 1],
                      [0, 1, 2, 3, 1],
                      [1, 2, 1, 0, 0],
                      [5, 2, 3, 1, 1],
                      [2, 1, 0, 1, 1]])

#卷积核,就是我们之后需要调整的参数
kernel = torch.tensor([[1, 2, 1],
                       [0, 1, 0],
                       [2, 1, 0]])

#修改我们的输入和卷积核的形状,方便后面的卷积计算
input = torch.reshape(input, (1, 1, 5, 5))
kernel = torch.reshape(kernel, (1, 1, 3, 3))

print(input.shape)
print(kernel.shape)
#stride参数:卷积核移动步数,为1时表示宽和高都移动1,类型可以是int或tuple
output = F.conv2d(input, kernel, bias=None, stride=1)
print(output)
#stride=2
output1 = F.conv2d(input, kernel, bias=None, stride=2)
print(output1)
#padding=1,填充1
output2 = F.conv2d(input, kernel, stride=1, padding=1)
print(output2)

下面我们对一个数据集进行卷积,这里我们选择的是CIFAR10(数据集)

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

dataset = torchvision.datasets.CIFAR10("../data", train=False, transform=torchvision.transforms.ToTensor(),
                                        download=True)
#使用dataloader将数据集分成64张一组
dataloader = DataLoader(dataset, batch_size=64)

class PPt(nn.Module):
    def __init__(self):
        super(PPt, self).__init__()
        #我们使用卷积将原来三通道的图片变成六通道进行输出
        self.conv1 = Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)


    def forward(self, x):
        x = self.conv1(x)
        return x

writer = SummaryWriter("../logss")
PPp = PPt()
step = 0
for data in dataloader:
    imgs, targets = data
    output = PPp(imgs)
    writer.add_images("input", imgs, step)
    #当使用被卷积以后的图像去显示会报错,所以强行修改形状的方式使得图像可以进行显示
    output = torch.reshape(output, (-1, 3, 30, 30))
    writer.add_images("output", output, step)
    step = step + 1

input图像(卷积前图像):

神经网络已知标签预测 神经网络标签的含义_卷积_02

output图像 (卷积后图像):

神经网络已知标签预测 神经网络标签的含义_深度学习_03

可以发现图像发生了较大的改变。