广西北流仲礼瓷业有限公司-给出最终研究值关于10个类别出现的概率

给出最终研究值关于10个类别出现的概率

发布日期:2024-07-03 15:35  点击次数:134

给出最终研究值关于10个类别出现的概率

目次

1.Mnist数据集先容

1)官网下载

2)代码导入

1.1 基本先容

1.2 数据集下载

2.代码部分

2.1文献夹目次:

2.2 运行后果

2.3代码

1.Mnist数据集先容

1.1 基本先容

Mnist数据集不错算是学习深度学习最常用到的了。这个数据集包含70000张手写数字图片,诀别是60000张推行图片和10000张测试图片,推行集由来自250个不同东说念主手写的数字组成,一般来粗豪中生,一半来自使命主说念主员,测试集(test set)亦然一样比例的手写数字数据,而且保证了测试集和推行集的作家不同。每个图片齐是2828个像素点,数据聚拢把一张图片的数据转成一个2828=784的一维向量存储起来。

内部的图片数据如下所示,每张图是0-9的手写数字黑底白字的图片,存储时,玄色用0暗示,白色用0-1的浮点数暗示。

图片

1.2 数据集下载

1)官网下载

Mnist数据集的下载地址如下:http://yann.lecun.com/exdb/mnist/

绽开后会有四个文献:

图片

推行数据集:train-images-idx3-ubyte.gz

推行数据集标签:train-labels-idx1-ubyte.gz

测试数据集:t10k-images-idx3-ubyte.gz

测试数据集标签:t10k-labels-idx1-ubyte.gz

将这四个文献下载后遗弃到需要用的文献夹下即可不要解压!下载后是什么就怎么放!

2)代码导入

潮安县鸿泰陶瓷工艺有限公司

文献夹下运行底下的代码,即可自动检测数据集是否存在,若莫得会自动进行下载,下载后在这一齐径:

图片

# 下载数据集 from torchvision import datasets, transforms train_set = datasets.MNIST("data",train=True,download=True, transform=transforms.ToTensor(),) test_set = datasets.MNIST("data",train=False,download=True, transform=transforms.ToTensor(),)

参数讲解:

datasets.MNIST:是Pytorch的内置函数torchvision.datasets.MNIST,不错导入数据集

train=True :读入的数据行为推行集

transform:读入咱们我方界说的数据预惩办操作

download=True:当咱们的根目次(root)下没罕有据集时,便自动下载

如果这技术咱们通过联网自动下载形势download咱们的数据后,它的文献旅途所以下局势:原文献夹/data/MNIST/raw

2.代码部分

2.1文献夹目次:

图片

test:我方写的测试图片

main:主函数

model:推行的模子参数,会自动生成

data:数据集文献夹

2.2 运行后果

14轮傍边,模子识别准确率达到99%以上

图片

2.3代码

1) 导入必要的包及预惩办,本东说念主学习时作念了较多戒备,且用的是下载好的文献,如果是我方的请鼎新对应的文献目次哦。import os import matplotlib.pyplot as plt import torch from PIL import Image from torch import nn from torch.nn import Conv2d, Linear, ReLU from torch.nn import MaxPool2d from torchvision import transforms from torchvision.datasets import MNIST from torch.utils.data import DataLoader # Dataset:创建数据集的函数;__init__:启动化数据骨子和标签 # __geyitem:赢得数据骨子和标签 # __len__:赢得数据集大小 # daataloader:数据加载类,接管来自dataset一经加载好的数据集 # torchbision:图形库,包含预推行模子,加载数据的函数、图片变换,编著、旋转等 # torchtext:惩办文本的用具包广西北流仲礼瓷业有限公司,将不同类型的额文献退换为datasets # 预惩办:将两个纪律整合在一说念 transform = transforms.Compose({     transforms.ToTensor(),  # 将灰度图片像素值(0~255)转为Tensor(0~1),陋劣后续惩办     # transforms.Normalize((0.1307,),(0.3081)),    # 归一化,均值0,方差1;mean:各通说念的均值std:各通说念的尺度差inplace:是否原地操作 })

2)加载数据集# 加载数据集 # 推行数据集 train_data = MNIST(root='./data', train=True, transform=transform, download=True) train_loader = DataLoader(dataset=train_data, batch_size=64, shuffle=True) # transform:贯串加载的数据集运用的数据预惩办的章程,shuffle:洗牌,是否打乱输入数据划定 # 测试数据集 test_data = MNIST(root="./data", train=False, transform=transform, download=True) test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True) train_data_size = len(train_data) test_data_size = len(test_data) print("推行数据集的长度:{}".format(train_data_size)) print("测试数据集的长度:{}".format(test_data_size))

3)构建模子

生效运行的话请给个免费的赞吧!(调试不易)

模子主要由两个卷积层,两个池化层,以及三个全贯穿层组成,激活函数使用relu.class MnistModel(nn.Module):     def __init__(self):         super(MnistModel, self).__init__()         self.conv1 = Conv2d(in_channels=1, out_channels=10, kernel_size=5, stride=1, padding=0)         self.maxpool1 = MaxPool2d(2)         self.conv2 = Conv2d(in_channels=10, out_channels=20, kernel_size=5, stride=1, padding=0)         self.maxpool2 = MaxPool2d(2)         self.linear1 = Linear(320, 128)         self.linear2 = Linear(128, 64)         self.linear3 = Linear(64, 10)         self.relu = ReLU()     def forward(self, x):         x = self.relu(self.maxpool1(self.conv1(x)))         x = self.relu(self.maxpool2(self.conv2(x)))         x = x.view(x.size(0),杭州佑特进出口有限公司 -1)         x = self.linear1(x)         x = self.linear2(x)         x = self.linear3(x)         return x # 亏蚀函数CrossentropyLoss model = MnistModel()#实例化 criterion = nn.CrossEntropyLoss()   # 交叉熵亏蚀, 资源县利地杂果有限公司相配于Softmax+Log+NllLoss # 线性多分类模子Softmax,给出最终研究值关于10个类别出现的概率,Log:将乘法退换为加法,减少缱绻量,保证函数的单调性 # NLLLoss:缱绻亏蚀,此经由不需要手动one-hot编码,NLLLoss会自动完成 # SGD,优化器,梯度下落算法e optimizer = torch.optim.SGD(model.parameters(), lr=0.14)#lr:学习率

4)模子推行

每次推行完成后会自动保存参数到pkl模子中,如果旅途中有Pkl文献,下次运行会自动加载上一次的模子参数,在这个基础上无间推行,第一次运行时莫得模子参数,戒指后会自动生成。# 模子推行 def train():     # index = 0     for index, data in enumerate(train_loader):#赢得推行数据以及对应标签         # for data in train_loader:        input, target = data   # input为输入数据,target为标签        y_predict = model(input) #模子研究        loss = criterion(y_predict, target)        optimizer.zero_grad() #梯度清零        loss.backward()#loss值反向传播        optimizer.step()#更新参数        # index += 1        if index % 100 == 0: # 每一百次保存一次模子,打印亏蚀            torch.save(model.state_dict(), "./model/model.pkl")   # 保存模子            torch.save(optimizer.state_dict(), "./model/optimizer.pkl")            print("推行次数为:{},亏蚀值为:{}".format(index, loss.item() ))

5)加载模子

第一次运行这里需要一个空的model文献夹# 加载模子 if os.path.exists('./model/model.pkl'):    model.load_state_dict(torch.load("./model/model.pkl"))#加载保存模子的参数

6)模子测试# 模子测试 def test():     correct = 0     # 正确研究的个数     total = 0   # 总额     with torch.no_grad():   # 测试无须缱绻梯度         for data in test_loader:             input, target = data             output = model(input)   # output输出10个研究取值,概率最大的为研究数             probability, predict = torch.max(input=output.data, dim=1)    # 复返一个元祖,第一个为最或者率值,第二个为最或者率值的下标             # loss = criterion(output, target)             total += target.size(0)  # target是体式为(batch_size,1)的矩阵,使用size(0)取出该批的大小             correct += (predict == target).sum().item()  # predict 和target均为(batch_size,1)的矩阵,sum求出相配的个数         print("测试准确率为:%.6f" %(correct / total))

6)我方手写数字图片识别函数(可采纳)

这部分主若是加载推行好的pkl模子测试我方的数据,广西北流仲礼瓷业有限公司因此在进行我方手写图的测试时,需要有推行好的pkl文献,而且就不要调用train()函数和test()函数啦珍藏:这个图片像素也要说黑底白字,28*28像素,不然无法识别def test_mydata():     image = Image.open('./test/test_two.png')   #读取自界说手写图片     image = image.resize((28, 28))   # 编著尺寸为28*28     image = image.convert('L')  # 退换为灰度图像     transform = transforms.ToTensor()     image = transform(image)     image = image.resize(1, 1, 28, 28)     output = model(image)     probability, predict = torch.max(output.data, dim=1)     print("此手写图片值为:%d,其最或者率为:%.2f " % (predict[0], probability))     plt.title("此手写图片值为:{}".format((int(predict))), fontname='SimHei')     plt.imshow(image.squeeze())     plt.show()

7)MNIST中的数据识别测试数据

推行经由中的打印信息我进行了修改,这里修复的推行轮数是15轮,每次推行生成的pkl模子参数亦然会更新的,念念要更多推行信息不错检讨对应的教程哦~#测试识别函数 if __name__ == '__main__':     #推行与测试     for i in range(15):#推行和测试进行15轮         print({"————————第{}轮测试脱手——————".format (i + 1)})         train()         test()

8)测试我方的手写数字图片(可选)

这部分主若是与tset_mydata()函数蚁集,加载推行好的pkl模子测试我方的数据,因此在进行我方手写图的测试时,需要有推行好的pkl文献,而且就不要调用train()函数和test()函数啦。珍藏:这个图片像素也要说黑底白字,28*28像素,不然无法识别# 测试主函数 if __name__ == '__main__':     test_mydata()

将系数代码按划定放到编著器中,装配好对应的包,就不错获胜运行啦。

如果生效运行了请给我一个免费的赞吧,这对我真实很伏击!!!

如果不行功请留住你的问题,我会尽量帮手的!

圆善代码放底下:import os import matplotlib.pyplot as plt import torch from PIL import Image from torch import nn from torch.nn import Conv2d, Linear, ReLU from torch.nn import MaxPool2d from torchvision import transforms from torchvision.datasets import MNIST from torch.utils.data import DataLoader # Dataset:创建数据集的函数;__init__:启动化数据骨子和标签 # __geyitem:赢得数据骨子和标签 # __len__:赢得数据集大小 # daataloader:数据加载类,接管来自dataset一经加载好的数据集 # torchbision:图形库,包含预推行模子,加载数据的函数、图片变换,编著、旋转等 # torchtext:惩办文本的用具包,将不同类型的额文献退换为datasets # 预惩办:将两个纪律整合在一说念 transform = transforms.Compose({     transforms.ToTensor(),  # 将灰度图片像素值(0~255)转为Tensor(0~1),陋劣后续惩办     # transforms.Normalize((0.1307,),(0.3081)),    # 归一化,均值0,方差1;mean:各通说念的均值std:各通说念的尺度差inplace:是否原地操作 }) # normalize扩张以下操作:image=(image-mean)/std????? # input[channel] = (input[channel] - mean[channel]) / std[channel] # 加载数据集 # 推行数据集 train_data = MNIST(root='./data', train=True, transform=transform, download=True) train_loader = DataLoader(dataset=train_data, batch_size=64, shuffle=True) # transform:贯串加载的数据集运用的数据预惩办的章程,shuffle:洗牌,是否打乱输入数据划定 # 测试数据集 test_data = MNIST(root="./data", train=False, transform=transform, download=True) test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True) train_data_size = len(train_data) test_data_size = len(test_data) print("推行数据集的长度:{}".format(train_data_size)) print("测试数据集的长度:{}".format(test_data_size)) # print(test_data) # print(train_data) class MnistModel(nn.Module):     def __init__(self):         super(MnistModel, self).__init__()         self.conv1 = Conv2d(in_channels=1, out_channels=10, kernel_size=5, stride=1, padding=0)         self.maxpool1 = MaxPool2d(2)         self.conv2 = Conv2d(in_channels=10, out_channels=20, kernel_size=5, stride=1, padding=0)         self.maxpool2 = MaxPool2d(2)         self.linear1 = Linear(320, 128)         self.linear2 = Linear(128, 64)         self.linear3 = Linear(64, 10)         self.relu = ReLU()     def forward(self, x):         x = self.relu(self.maxpool1(self.conv1(x)))         x = self.relu(self.maxpool2(self.conv2(x)))         x = x.view(x.size(0), -1)         x = self.linear1(x)         x = self.linear2(x)         x = self.linear3(x)         return x # 亏蚀函数CrossentropyLoss model = MnistModel()#实例化 criterion = nn.CrossEntropyLoss()   # 交叉熵亏蚀,相配于Softmax+Log+NllLoss # 线性多分类模子Softmax,给出最终研究值关于10个类别出现的概率,Log:将乘法退换为加法,减少缱绻量,保证函数的单调性 # NLLLoss:缱绻亏蚀,此经由不需要手动one-hot编码,NLLLoss会自动完成 # SGD,优化器,梯度下落算法e optimizer = torch.optim.SGD(model.parameters(), lr=0.14)#lr:学习率 # 模子推行 def train():     # index = 0     for index, data in enumerate(train_loader):#赢得推行数据以及对应标签         # for data in train_loader:        input, target = data   # input为输入数据,target为标签        y_predict = model(input) #模子研究        loss = criterion(y_predict, target)        optimizer.zero_grad() #梯度清零        loss.backward()#loss值反向传播        optimizer.step()#更新参数        # index += 1        if index % 100 == 0: # 每一百次保存一次模子,打印亏蚀            torch.save(model.state_dict(), "./model/model.pkl")   # 保存模子            torch.save(optimizer.state_dict(), "./model/optimizer.pkl")            print("推行次数为:{},亏蚀值为:{}".format(index, loss.item() )) # 加载模子 if os.path.exists('./model/model.pkl'):    model.load_state_dict(torch.load("./model/model.pkl"))#加载保存模子的参数 # 模子测试 def test():     correct = 0     # 正确研究的个数     total = 0   # 总额     with torch.no_grad():   # 测试无须缱绻梯度         for data in test_loader:             input, target = data             output = model(input)   # output输出10个研究取值,概率最大的为研究数             probability, predict = torch.max(input=output.data, dim=1)    # 复返一个元祖,第一个为最或者率值,第二个为最或者率值的下标             # loss = criterion(output, target)             total += target.size(0)  # target是体式为(batch_size,1)的矩阵,使用size(0)取出该批的大小             correct += (predict == target).sum().item()  # predict 和target均为(batch_size,1)的矩阵,sum求出相配的个数         print("测试准确率为:%.6f" %(correct / total)) #测试识别函数 if __name__ == '__main__':     #推行与测试     for i in range(15):#推行和测试进行5轮         print({"————————第{}轮测试脱手——————".format (i + 1)})         train()         test() def test_mydata():     image = Image.open('./test/test_two.png')   #读取自界说手写图片     image = image.resize((28, 28))   # 编著尺寸为28*28     image = image.convert('L')  # 退换为灰度图像     transform = transforms.ToTensor()     image = transform(image)     image = image.resize(1, 1, 28, 28)     output = model(image)     probability, predict = torch.max(output.data, dim=1)     print("此手写图片值为:%d,其最或者率为:%.2f " % (predict[0], probability))     plt.title("此手写图片值为:{}".format((int(predict))), fontname='SimHei')     plt.imshow(image.squeeze())     plt.show() # 测试主函数 # if __name__ == '__main__': #     test_mydata()

本站仅提供存储就业,系数骨子均由用户发布,如发现存害或侵权骨子,请点击举报。

相关资讯
热点资讯
  • 友情链接:

Powered by 广西北流仲礼瓷业有限公司 @2013-2022 RSS地图 HTML地图

Copyright 站群系统 © 2013-2024 SSWL 版权所有