😊😊😊欢迎来到本博客😊😊😊
本次博客内容将继续讲解关于深度学习图像识别的相关知识
🎉作者简介:⭐️⭐️⭐️目前地学博士生在读。
📝目前更新:🌟🌟🌟目前已经更新了关于网络爬虫的相关知识、机器学习的相关知识、目前正在更新深度学习的相关内容。
💛💛💛本文摘要💛💛💛
本文我们将设计、实现并训练一个标准的前馈神经网络。
文章目录
- 🌟手把手构造整体项目设计思路
- 🌟第一件事:明确输入图像的尺寸
- 🌟第二件事:确定隐藏层的数量用于特征提取工作
- 🌟第三件事:经过Softmax函数输出概率结果,预测完成
- 💛具体程序实现
- 💛搭建网络
- 💛数据读取及主函数构建
- 💛模型测试(和训练基本差不多,不过多赘述)
🌟手把手构造整体项目设计思路
首先,我们先明确目标,我们想把一张图像输入到我们搭建的神经网络当中,然后经过隐藏层提取特征,最终到达输出层,经过Softmax函数输出10种概率,分别对应0、1、2、3、4、5、6、7、8、9。然后选择概率最高的最后的输出结果。
🌟第一件事:明确输入图像的尺寸
图像的分辨率是28*28的,说明了整张图象一共是由784个像素点构成,那么我们所搭建的神经网络的输入层就是有784个神经元所构成,每一个神经元都要接收到图像铺张开的向量。
🌟第二件事:确定隐藏层的数量用于特征提取工作
输入层与隐藏层之间在前馈神经网络种是通过多重线性连接进行联系的,在隐藏层中我们将图像种的大量信息做特征提取工作,构造对应联系。这里的隐藏层的神经元的个数设置为256。中间的线性层就是784*256。
🌟第三件事:经过Softmax函数输出概率结果,预测完成
通过隐藏层向前传播到输出层后,会得到256个特征结果,将这256个特征结果经过Softmax函数层,得到10种概率值,对应每个数字。输出层定义为输出层。所以隐藏层和输出层之间的连接为256*10。另外这10种概率值输出结果为1,这就是Softmax函数的伟大定义所限定的。
💛具体程序实现
这里的数据集选择的是MNIST数据集,可以从官网自行获取。
💛搭建网络
import torch
from torch import nn#搭建整体神经网络
class Network(nn.Module):def __init__(self):super().__init__()#定义线性层self.layer1=nn.Linear(784,256)self.layer2=nn.Linear(256,10)def forword(self,x):#平铺图象成向量x=x.view(-1,28*28)x=self.layer1(x)x=torch.relu(x)return self.layer2(x)
💛数据读取及主函数构建
图像的预处理pipline
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader#主函数
if __name__=='__main__':transform=transforms.Compose([transforms.Grayscale(num_output_channels=1),#灰度transforms.ToTensor()#转换为张量])train_dataset=datasets.ImageFolder(root='',transform=transform)#读取文件夹test_dataset=datasets.ImageFolder(root='',transform=transform)train_loader=DataLoader(train_dataset,batch_size=64,shuffle=True)#这里的batch——size表示批量处理的意思#创建三个对象#1、模型本身model=Network()#2、优化器,用于优化模型中的参数optimizer=optim.Adam(model.parameters())#3、损失函数,分类问题使用交叉熵作为损失误差criterion=nn.CrossEntropyLoss()#进入模型循环迭代for epoch in range(10):#外层循环定义循环次数for batch_idx,(data,label) in enumerate(train_loader):#内层循环批量处理数据output=model(data)loss=criterion(output,label)loss.backward()#反向传播计算梯度optimizer.step()optimizer.zero_grad()torch.save(model.state_dict(),'minst.pth')#保存模型
💛模型测试(和训练基本差不多,不过多赘述)
test_dataset=datasets.ImageFolder(root='',transform=transform)
model=Network()
model.load_state_dict(torch.load('mnist.pth'))
right=0
for batch_idx,(x,y) in enumerate(test_dataset):#内层循环批量处理数据output=model(x)predict=output.argmax(1).item()
sample_num=len(test_dataset)
acc=right*1/sample_num
🔎支持:🎁🎁🎁谢谢各位支持!