下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、搭建网络思路:? mnist数据集下载与处理?搭建神经网络?损失函数与优化函数的选择?定义可视化函数(不是本文的重点)?模型训练以及结果图像绘制?模型测试结果可视化与结果分析代码实现1 .导入需要用到的安装包与模块:这里我么直接使用 Pytorch自带的mnist数据集,所以要用到torchvision安装包。from torch.utils import datafrom torchvision import datasets, transformsfrom torch.nn import Sequential, Conv2d, ReLU, MaxPool2d, Linear, CrossE
2、ntropyLossfrom torch.optim import Adamfrom torch.autograd import Variablefrom matplotlib import cm, pyplot as pltfrom sklearn.manifold import TSNE #将最后一层的输出降维处理,方便结果的 可视化import torch.nn as nnimport torchimport os2 .mnist数据集下载与处理:直接下载下来的mnist数据集并不符合输入给网络的格式,所以我们需要对 数据集做一些处理,以满足模型训练的要求。由于小编电脑配置较低,测试 数
3、据量为1800张图片。LR = 0.01BATCH_SIZE = 32DOWNLOAD_MINIST = FalseEPOCHS = 1HAS_SK = True#创建数据集目录if not os.listdir(./model_datas/MnistDatasets/):DOWNLOAD_MINIST= True#训练数据集处理train_data = datasets.MNIST(root=./model_datas/MnistDatasets/,峻据集需要保存的路径train=True, # true:训练数据 False:测试数据transform=transforms.ToTenso
4、r(), #等 PIL.Image 或 numpy.ndarray数据转换为 形状为 torch.FloatTensor (C x H x W),同时归一化download=DOWNLOAD_MINIST # 下载数据集,如果有,就直接加载,如果 如果没有,就去下载)#将输入图片的shap浆化为(50, 1,28, 28)data_loader = data.DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True,)test_data = datasets.MNIST(root=./model_datas/Mnist
5、Datasets/”,train=False, )test_x = torch.unsqueeze(test_data.test_data:1800, dim=1).type(torch.FloatTensor) / 255. #将测试数据的输入shape由原泵的(10000, 28, 28)转化为( 10000, 1, 28, 28)并且将输出数据归一化test_y = test_data.test_labels:1800 #1 取测试数据的标签值3 .搭建神经向络:将模型数据预处理完之后,接下来才是我们这篇文章的重点,搭建一个卷积 神经网络。输入层数据格式:32, , 1,28 , 28第
6、一卷积层:卷积层:shape 32 , 1 , 28 , 28 -32, 16 , 28 ,28这里的卷积层只是将原来的通道数由1变为16,图片大小没有变化激活层:这里我们选择 Relu作为激活函数对卷积层输出的数据进行去线性。池化层:shape 32, 16, 28, 28-32, 16, 14, 14池化层不改变通道数,只改变图片的大小第二卷积层:卷积层:shape 32, 16,14, 14 -32,32,14,14这里的卷积层只是将上一层池化层输出的通道数由16变为32,图片大小没有变化激活层:选择Relu作为激活函数对卷积层输出的数据进行去线性。池化层:shape 32, 32, 1
7、4,14-32, 32, 7, 7池化层不改变图片通道数,只改变图片的大小全连接层:数据降维处理:32,32,7,7-32, 32*7*7首先将第二卷积层池化层的输出降维处理为全连接层可以接收的数据格式全连接层:shape 32, 32*7*7 - 32, 10将降维处理完的数据格式作为全连接层的输入,使用一个32*7*7, 10 的权重,将结果输出;具体的网络结果如下图所示:class CNN(nn.Module):def _init_(self):super(CNN, self)._init_()self.conv_1 = Sequential 第一卷积层Conv2d( in_channe
8、ls=1, out_channels=16, kernel_size=5, stride=1, padding=2),ReLU(),MaxP0012d(kernel_size=2)# 最大池化层 ).self.conv_2 = Sequential(# 第二卷积层Conv2d( in_channels=16, out_channels=32, kernel_size=5, stride=1, padding=2),ReLU(),MaxP0012d(kernel_size=2)# 最大池化层 ).self.out = Linear(32 * 7 * 7, 10) # 全连接层def forwar
9、d(self, x): conv_1 = self.conv_1(x) conv_2 = self.conv_2(conv_1) fcl_input = conv_2.view(conv_2.size(0), -1) fcl_output = self.out(fcl_input) return fcl_output, fcl_inputcnn = CNN()4 .损失函数与优化函数搭建完神经网络之后,接下来就需要选择目标函数和优化函数了。对于分类问题,一般使用交叉嫡(Cross-Entropy )作为损失进行最小优 而对于优化函数,这里选择 Adam是在于经过偏置校正后,每一次迭代学习 率都
10、有个确定范围,使得参数比较平稳。optimizer= Adam(cnn.parameters(), lr=LR)loss_func= CrossEntropyLoss()5 .定义可视化函数:这里定义这个函数主要是为了将最终的分结果展示出来,方便理解。本文的 重点是神经网络,对于结果展示代码看不懂就直接忽视。def plot_with_labels(lowDWeights, labels):主要是将测试结果进行可视化。:param lowDWeights:进行降维处理后的测试集标签值:param labels:原测试集的标签值 plt.cla()X, Y = lowDWeights:, 0,
11、lowDWeights:, 1for x, y, s in zip(X, Y, labels):c = cm.rainbow(int(255 * s / 9)plt.text(x, y, s, backgroundcolor=c, fontsize=9)plt.xlim(X.min(), X.max()plt.ylim(Y.min(), Y.max()plt.title(Visualize last layer)plt.savefig(./model_datas/pictures/cnn.png)plt.pause(0.1)5 .模型训练以及结果图像绘制:将之前处理好的mnist数据集输入到搭
12、建好的神经网络里面进行模型训练以及绘制测试结果的可视化。for epoch in range(EPOCHS):for step, (b_x, b_y) in enumerate(data_loader): batch_x, batch_y = Variable(b_x), Variable(b_y) pred_y = cnn(batch_x)0loss = loss_func(pred_y, batch_y)optimizer.zero_grad()loss.backward()optimizer.step()if step % 50 = 0:test_output, last_layer =
13、 cnn(Variable(test_x)test_y_pred = torch.max(test_output, 1)1.data.squeeze().numpy()accuracy = float(test_y_pred = test_y.numpy().astype(int).sum()/ float(test_y.size(0)print(epoch:, epoch, |step:, step, |train_loss:, loss.data.numpy(), ”|test_acuracy:%.2f % accuracy)if HAS_SK: #数据降维并且可视化tsne = TSNE
14、(perplexity=30, n_components=2, init=pca, n_iter=5000) plot_only = 500low_dim_embs = tsne.fit_transform(last_layer.data.numpy():plot_only, :) #将输出数据陈线-labels = test_y.numpy():plot_onlyplot_with_labels(low_dim_embs, labels) #调用此函数,将数据传入并且展示出来plt.ioff()# print 10 predictions from test datatest_output,
15、 _ = cnn(test_x:10)pred_y = torch.max(test_output, 1)1.data.squeeze().numpy()print(pred_y, predict_number)print(test_y:10.numpy(), real number)6 .模型测试结果可视化与结果分析:为了更形象说明搭建的神经网络对mnist数据集分类结果准确性,这里将每次训练与测试结果的对应的准确度和损失值的变化、分类结果的图像两 个方面来分析。tpULI i pI S L CJJ:T trdin_epoch:0step:1490Itrain_loss :0.1665232
16、 |test_acuracy:Q,97epoch:0Istep:145。Itrain_loss::L03144965 |test_acuracy:0.97epoch:e15tep:159G1 train_loss ::9109162366t est ac jracy ;0.97epoch:0Istep:1559Itrain,1 05S:9.03336678 1f est_actiracy :0.97epoch:0step:1000|train_loss:0t09505453test_acuracy;0.97epoch:0I step:1650I train_loss :0.QS195481 |test adj racyr 97epoch:0Istep:17091 trainloss:).0lb5379 i1 test_acuracy:,97图一:损失与准确度_Vhsualj2e ltft layerIHIIT图二:测试结果的可视化图 图一我们可以看到,模型训练初期,训练数据的损失值和测试的准确度都不能满足我们的要求,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025道路运输合同书范本
- 2025年东营货运资格证题库下载安装
- 2025年厦门货运从业资格模拟考试
- 2025年山东货运从业资格证年考试题及答案
- 2025劳务派遣合同范本3
- 2025飞虫综合治理合同
- 2025购买公司股份合同
- 2025供电设备智能维护合同
- 水利实习报告范文
- 2025标准技术转让合同范文
- 2024年安徽省初中学业水平考试中考数学试卷(真题+答案)
- 2024年临汾翼城县就业困难高校毕业生公益性岗招考聘用70人重点基础提升难、易点模拟试题(共500题)附带答案详解
- 护理中级职称竞聘
- 现代控制理论智慧树知到期末考试答案章节答案2024年长安大学
- 国际公法学马工程全套教学课件
- 数据安全重要数据风险评估报告
- 汽车维修合伙利益分配协议书
- MOOC 普通地质学-西南石油大学 中国大学慕课答案
- 医疗机构感染预防与控制基本制度试题附有答案
- 生产部文员年终总结
- 半导体芯片知识讲座
评论
0/150
提交评论