# -*- coding: UTF-8 -*-import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transformsbatch_size=200
learning_rate=0.01
epochs=10# torchvision.transforms.Compose()类。这个类的主要作用是串联多个图片变换的操作。
# (1) transforms.Compose就是将transforms组合在一起
# (2) transforms.Normalize使用如下公式进行归一化
# (3) torchvision.transforms.ToTensor() 起到的作用是把PIL.Image或者numpy.narray数据类型转变为torch.FloatTensor类型,shape是C*H*W,数值范围缩小为[0.0, 1.0]
# (4) 如果想把数值范围调整为[-1.0, 1.0],则可加torchvision.transforms.Normalize([mean_channel1,mean_channel2,mean_channel3],[std_channel1,std_channel2,std_channel3])
train_loader = torch.utils.data.DataLoader(datasets.MNIST('../data', train=True, download=True,transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))])),batch_size=batch_size, shuffle=True
)test_loader = torch.utils.data.DataLoader(datasets.MNIST('../data', train=False,transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))])),batch_size=batch_size, shuffle=True
)# 继承自nn.Module
class MLP(nn.Module):def __init__(self):# 初始化层在 __init__中super(MLP,self).__init__()self.model = nn.Sequential(nn.Linear(784, 200),# 使用ReLU激活函数,关于22个激活函数的,可以参考:https://blog.csdn.net/tototuzuoquan/article/details/113791252?spm=1001.2014.3001.5501nn.ReLU(inplace=True),nn.Linear(200, 200),nn.ReLU(inplace=True),nn.Linear(200, 10),nn.ReLU(inplace=True),)# 要实现forward()def forward(self, x):x = self.model(x)return xnet = MLP()
# PyTorch的十个优化器:https://blog.csdn.net/tototuzuoquan/article/details/113779970?spm=1001.2014.3001.5501
# 另外一篇关于优化器的文章(这里面有优化器的特征、数学公式等):https://blog.csdn.net/tototuzuoquan/article/details/112724028?spm=1001.2014.3001.5501
optimizer = optim.SGD(net.parameters(), lr=learning_rate)
# 关于PyTorch的十九个损失函数的文章有:https://blog.csdn.net/tototuzuoquan/article/details/113777788?spm=1001.2014.3001.5501
criteon = nn.CrossEntropyLoss()# enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
# enumerate() 方法的语法:
# 参数:
# sequence -- 一个序列、迭代器或其他支持迭代对象
# start -- 下标起始位置for epoch in range(epochs):for batch_idx, (data, target) in enumerate(train_loader):data = data.view(-1, 28*28)logits = net(data)loss = criteon(logits, target)optimizer.zero_grad()loss.backward()# print(w1.grad.norm(), w2.grad.norm())optimizer.step()if batch_idx % 100 == 0:print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(epoch, batch_idx * len(data), len(train_loader.dataset),100. * batch_idx / len(train_loader), loss.item()))test_loss = 0correct = 0for data, target in test_loader:data = data.view(-1, 28 * 28)logits = net(data)test_loss += criteon(logits, target).item()pred = logits.data.max(1)[1]correct += pred.eq(target.data).sum()test_loss /= len(test_loader.dataset)print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(test_loss, correct, len(test_loader.dataset),100. * correct / len(test_loader.dataset)))

输出结果:

runfile('E:/workspace/pytorch-learn/27_MLP网络层/main.py', wdir='E:/workspace/pytorch-learn/27_MLP网络层')
Train Epoch: 0 [0/60000 (0%)]   Loss: 2.311366
Train Epoch: 0 [20000/60000 (33%)]  Loss: 2.019119
Train Epoch: 0 [40000/60000 (67%)]  Loss: 1.321077
Test set: Average loss: 0.0040, Accuracy: 8394/10000 (84%)
Train Epoch: 1 [0/60000 (0%)]   Loss: 0.845444
Train Epoch: 1 [20000/60000 (33%)]  Loss: 0.593395
Train Epoch: 1 [40000/60000 (67%)]  Loss: 0.391533
Test set: Average loss: 0.0020, Accuracy: 8918/10000 (89%)
Train Epoch: 2 [0/60000 (0%)]   Loss: 0.489720
Train Epoch: 2 [20000/60000 (33%)]  Loss: 0.439235
Train Epoch: 2 [40000/60000 (67%)]  Loss: 0.424977
Test set: Average loss: 0.0017, Accuracy: 9050/10000 (90%)
Train Epoch: 3 [0/60000 (0%)]   Loss: 0.354985
Train Epoch: 3 [20000/60000 (33%)]  Loss: 0.367654
Train Epoch: 3 [40000/60000 (67%)]  Loss: 0.279793
Test set: Average loss: 0.0015, Accuracy: 9133/10000 (91%)
Train Epoch: 4 [0/60000 (0%)]   Loss: 0.241317
Train Epoch: 4 [20000/60000 (33%)]  Loss: 0.336772
Train Epoch: 4 [40000/60000 (67%)]  Loss: 0.314246
Test set: Average loss: 0.0014, Accuracy: 9195/10000 (92%)
Train Epoch: 5 [0/60000 (0%)]   Loss: 0.380214
Train Epoch: 5 [20000/60000 (33%)]  Loss: 0.184812
Train Epoch: 5 [40000/60000 (67%)]  Loss: 0.316628
Test set: Average loss: 0.0013, Accuracy: 9237/10000 (92%)
Train Epoch: 6 [0/60000 (0%)]   Loss: 0.331256
Train Epoch: 6 [20000/60000 (33%)]  Loss: 0.288215
Train Epoch: 6 [40000/60000 (67%)]  Loss: 0.228315
Test set: Average loss: 0.0012, Accuracy: 9277/10000 (93%)
Train Epoch: 7 [0/60000 (0%)]   Loss: 0.312616
Train Epoch: 7 [20000/60000 (33%)]  Loss: 0.219588
Train Epoch: 7 [40000/60000 (67%)]  Loss: 0.294207
Test set: Average loss: 0.0012, Accuracy: 9298/10000 (93%)
Train Epoch: 8 [0/60000 (0%)]   Loss: 0.302778
Train Epoch: 8 [20000/60000 (33%)]  Loss: 0.227025
Train Epoch: 8 [40000/60000 (67%)]  Loss: 0.212254
Test set: Average loss: 0.0011, Accuracy: 9333/10000 (93%)
Train Epoch: 9 [0/60000 (0%)]   Loss: 0.178860
Train Epoch: 9 [20000/60000 (33%)]  Loss: 0.232927
Train Epoch: 9 [40000/60000 (67%)]  Loss: 0.224159
Test set: Average loss: 0.0011, Accuracy: 9384/10000 (94%)

27_pytorch全连接层,使用MNIST的分类案例(学习笔记)相关推荐

  1. 全连接层解决MNIST

    Tensorflow 一开始呢,让我们先了解一下tensorflow的运行方式.简单来说,我们使用步骤一共有三个:创建图,运行图,保存图. Tensorflow的计算是在图(graph)里面计算的,因 ...

  2. 全连接神经网络实现MNIST手写数字识别

    在对全连接神经网络的基本知识(全连接神经网络详解)学习之后,通过MNIST手写数字识别这个小项目来学习如何实现全连接神经网络. MNIST数据集 对于深度学习的任何项目来说,数据集是其中最为关键的部分 ...

  3. CNN全连接层怎么转化成一维向量?

    正如上一篇文章所述,CNN的最后一般是用于分类是一两个全连接层,对于前面池化层输出的二维特征图是怎么转化成一维的一个向量的呢? 从上图的结构中可以看到,最后两层是两个矩形,也就是一维向量,以MNIST ...

  4. 深入理解卷积层,全连接层的作用意义

    有部分内容是转载的知乎的,如有侵权,请告知,删除便是,但由于是总结的,所以不一一列出原作者是who. 再次感谢,也希望给其他小白受益. 首先说明:可以不用全连接层的. 理解1: 卷积取的是局部特征,全 ...

  5. padding和卷积的区别_NiN:使用11卷积层替代全连接层

    微信公号:ilulaoshi, 原文发表在我的个人网站:https://lulaoshi.info/machine-learning/convolutional/nin.html LeNet.Alex ...

  6. 全连接层介绍以及简单实现

    全连接层是神经网络最后的一层,有着至关重要的作用,全连接层之前的作用是提取特征,全连接层的作用是分类. 下面简单介绍一下全连接层 cnn已经提取到了特征,我们怎么将这个特征转化成输出结果呢,比如识别是 ...

  7. Pytorch:Transformer(Encoder编码器-Decoder解码器、多头注意力机制、多头自注意力机制、掩码张量、前馈全连接层、规范化层、子层连接结构、pyitcast) part1

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Encoder编码器-Decoder解码器框架 + Atten ...

  8. 九、(机器学习)-Tensorflow算法之全连接层

    Tensorflow,cnn,dnn中的全连接层的理解 上一篇我们讲了使用cnn实现cifar10图像分类,模型经过隐藏层中的卷积.归一化.激活.池化之后提取到主要的特征变量,就会到全连接层,那么全连 ...

  9. 基于PyTorch框架的多层全连接神经网络实现MNIST手写数字分类

    多层全连接神经网络实现MNIST手写数字分类 1 简单的三层全连接神经网络 2 添加激活函数 3 添加批标准化 4 训练网络 5 结论 参考资料 先用PyTorch实现最简单的三层全连接神经网络,然后 ...

最新文章

  1. Eclipse插件的安装方法
  2. 21day学通python_铁乐学python_day21_面向对象编程3
  3. GdiPlus[59]: 图像(十一) IGPImageAttributes 之颜色矩阵(TGPColorMatrix)变换
  4. Internet设置-连接选项卡-局域网(LAN)设置 某些设置由系统管理员进行管理
  5. pyhton object is not subscriptable 解决
  6. 2016-8-18晨型养成第三天
  7. objective-c 方法加号(+) 减号(-)
  8. tensorflow 利用索引获取tensor特定元素
  9. 腾讯视频向湖北地区用户推出1个月免费看活动
  10. 2017级C语言大作业 - 小小冒险岛
  11. Baby‘s first attempt on CPU(贪心+模拟)
  12. cacti升级后还是用的旧路径_Flutter1.9升级体验及填坑全攻略
  13. python教程原版_Python入门教程完整版(懂中文就能学会) pdf版+源码(讲义/笔记)
  14. PHP设计模式 之 单例模式(封装PDO)
  15. php去除文字格式,php如何清除html格式并去除文字中的空格然后截取文字
  16. 黑苹果驱动_兼容黑苹果macOS Catalina系统的USB无线网卡型号及驱动下载地址
  17. 3D建模系统blender快捷键
  18. 链路聚合(Port-Channel)
  19. Ubuntu系统字体所在的文件夹的位置。
  20. 计算机南北桥芯片的作用

热门文章

  1. 小程序子组件向父组件传值_一套组件化、可复用、易扩展的微信小程序 UI 组件库...
  2. git 可视化工具_WEB开发者必备工具集
  3. JAVA排序算法之希尔排序
  4. VTK:BackfaceCulling背面剔除用法实战
  5. JavaScript实现countSetBits设置位的数量算法(附完整源码)
  6. JavaScript实现graphBridges图桥算法(附完整源码)
  7. wxWidgets:wxPropertyGrid类用法
  8. wxWidgets:wxDatePickerCtrl类用法
  9. boost::math模块非有限信号 NaN 环回测试
  10. boost::geometry::srs::spar用法的测试程序