我们知道,神经网络是我们学习机器学习以及深度学习时常听到的一个名词,我们会想什么是神经网络,它在我们机器学习中起什么样的一个作用,我们今天就来解开神经网络的神秘面纱。
神经网络也称为人工神经网络(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图像(卷积前图像):
output图像 (卷积后图像):
可以发现图像发生了较大的改变。