pytorch三层全连接层实现手写字母识别方式


Posted in Python onJanuary 14, 2020

先用最简单的三层全连接神经网络,然后添加激活层查看实验结果,最后加上批标准化验证是否有效

首先根据已有的模板定义网络结构SimpleNet,命名为net.py

import torch
from torch.autograd import Variable
import numpy as np
import matplotlib.pyplot as plt
from torch import nn,optim
from torch.utils.data import DataLoader
from torchvision import datasets,transforms
#定义三层全连接神经网络
class simpleNet(nn.Module):
 def __init__(self,in_dim,n_hidden_1,n_hidden_2,out_dim):#输入维度,第一层的神经元个数、第二层的神经元个数,以及第三层的神经元个数
  super(simpleNet,self).__init__()
  self.layer1=nn.Linear(in_dim,n_hidden_1)
  self.layer2=nn.Linear(n_hidden_1,n_hidden_2)
  self.layer3=nn.Linear(n_hidden_2,out_dim)
 def forward(self,x):
  x=self.layer1(x)
  x=self.layer2(x)
  x=self.layer3(x)
  return x
 
 
#添加激活函数
class Activation_Net(nn.Module):
 def __init__(self,in_dim,n_hidden_1,n_hidden_2,out_dim):
  super(NeutalNetwork,self).__init__()
  self.layer1=nn.Sequential(#Sequential组合结构
  nn.Linear(in_dim,n_hidden_1),nn.ReLU(True))
  self.layer2=nn.Sequential(
  nn.Linear(n_hidden_1,n_hidden_2),nn.ReLU(True))
  self.layer3=nn.Sequential(
  nn.Linear(n_hidden_2,out_dim))
 def forward(self,x):
  x=self.layer1(x)
  x=self.layer2(x)
  x=self.layer3(x)
  return x
#添加批标准化处理模块,皮标准化放在全连接的后面,非线性的前面
class Batch_Net(nn.Module):
 def _init__(self,in_dim,n_hidden_1,n_hidden_2,out_dim):
  super(Batch_net,self).__init__()
  self.layer1=nn.Sequential(nn.Linear(in_dim,n_hidden_1),nn.BatchNormld(n_hidden_1),nn.ReLU(True))
  self.layer2=nn.Sequential(nn.Linear(n_hidden_1,n_hidden_2),nn.BatchNormld(n_hidden_2),nn.ReLU(True))
  self.layer3=nn.Sequential(nn.Linear(n_hidden_2,out_dim))
 def forword(self,x):
  x=self.layer1(x)
  x=self.layer2(x)
  x=self.layer3(x)
  return x

训练网络,

import torch
from torch.autograd import Variable
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from torch import nn,optim
from torch.utils.data import DataLoader
from torchvision import datasets,transforms
#定义一些超参数
import net
batch_size=64
learning_rate=1e-2
num_epoches=20
#预处理
data_tf=transforms.Compose(
[transforms.ToTensor(),transforms.Normalize([0.5],[0.5])])#将图像转化成tensor,然后继续标准化,就是减均值,除以方差

#读取数据集
train_dataset=datasets.MNIST(root='./data',train=True,transform=data_tf,download=True)
test_dataset=datasets.MNIST(root='./data',train=False,transform=data_tf)
#使用内置的函数导入数据集
train_loader=DataLoader(train_dataset,batch_size=batch_size,shuffle=True)
test_loader=DataLoader(test_dataset,batch_size=batch_size,shuffle=False)

#导入网络,定义损失函数和优化方法
model=net.simpleNet(28*28,300,100,10)
if torch.cuda.is_available():#是否使用cuda加速
 model=model.cuda()
criterion=nn.CrossEntropyLoss()
optimizer=optim.SGD(model.parameters(),lr=learning_rate)
import net
n_epochs=5
for epoch in range(n_epochs):
 running_loss=0.0
 running_correct=0
 print("epoch {}/{}".format(epoch,n_epochs))
 print("-"*10)
 for data in train_loader:
  img,label=data
  img=img.view(img.size(0),-1)
  if torch.cuda.is_available():
   img=img.cuda()
   label=label.cuda()
  else:
   img=Variable(img)
   label=Variable(label)
  out=model(img)#得到前向传播的结果
  loss=criterion(out,label)#得到损失函数
  print_loss=loss.data.item()
  optimizer.zero_grad()#归0梯度
  loss.backward()#反向传播
  optimizer.step()#优化
  running_loss+=loss.item()
  epoch+=1
  if epoch%50==0:
   print('epoch:{},loss:{:.4f}'.format(epoch,loss.data.item()))

训练的结果截图如下:

pytorch三层全连接层实现手写字母识别方式

测试网络

#测试网络
model.eval()#将模型变成测试模式
eval_loss=0
eval_acc=0
for data in test_loader:
 img,label=data
 img=img.view(img.size(0),-1)#测试集不需要反向传播,所以可以在前项传播的时候释放内存,节约内存空间
 if torch.cuda.is_available():
  img=Variable(img,volatile=True).cuda()
  label=Variable(label,volatile=True).cuda()
 else:
  img=Variable(img,volatile=True)
  label=Variable(label,volatile=True)
 out=model(img)
 loss=criterion(out,label)
 eval_loss+=loss.item()*label.size(0)
 _,pred=torch.max(out,1)
 num_correct=(pred==label).sum()
 eval_acc+=num_correct.item()
print('test loss:{:.6f},ac:{:.6f}'.format(eval_loss/(len(test_dataset)),eval_acc/(len(test_dataset))))

pytorch三层全连接层实现手写字母识别方式

训练的时候,还可以加入一些dropout,正则化,修改隐藏层神经元的个数,增加隐藏层数,可以自己添加。

以上这篇pytorch三层全连接层实现手写字母识别方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python正则表达式判断字符串是否是全部小写示例
Dec 25 Python
Python之eval()函数危险性浅析
Jul 03 Python
Python中模块pymysql查询结果后如何获取字段列表
Jun 05 Python
Python判断文件和字符串编码类型的实例
Dec 21 Python
解决python中无法自动补全代码的问题
Dec 04 Python
详解如何在Apache中运行Python WSGI应用
Jan 02 Python
Python OpenCV调用摄像头检测人脸并截图
Aug 20 Python
python操作docx写入内容,并控制文本的字体颜色
Feb 13 Python
在python中利用dict转json按输入顺序输出内容方式
Feb 27 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
Jun 29 Python
Python提取视频中图片的示例(按帧、按秒)
Oct 22 Python
Python卷积神经网络图片分类框架详解分析
Nov 07 Python
Python实现bilibili时间长度查询的示例代码
Jan 14 #Python
基于python监控程序是否关闭
Jan 14 #Python
关于pytorch中全连接神经网络搭建两种模式详解
Jan 14 #Python
使用Pytorch来拟合函数方式
Jan 14 #Python
pytorch 模拟关系拟合——回归实例
Jan 14 #Python
PyTorch实现AlexNet示例
Jan 14 #Python
Pytorch 实现focal_loss 多类别和二分类示例
Jan 14 #Python
You might like
PHP获取浏览器信息类和客户端地理位置的2个方法
2014/04/24 PHP
thinkphp连贯操作实例分析
2014/11/22 PHP
php+mysql结合Ajax实现点赞功能完整实例
2015/01/30 PHP
php实现有趣的人品测试程序实例
2015/06/08 PHP
PHP fopen中文文件名乱码问题解决方案
2020/10/28 PHP
JQuery Tips(3) 关于$()包装集内元素的改变
2009/12/14 Javascript
JS下拉缓冲菜单示例代码
2013/08/30 Javascript
jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
2013/12/02 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
2015/02/10 Javascript
JS实现的不规则TAB选项卡效果代码
2015/09/18 Javascript
js格式化时间的方法
2015/12/18 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
HTML5 实现的一个俄罗斯方块实例代码
2016/09/19 Javascript
JS实现单张或多张图片持续无缝滚动的示例代码
2020/05/10 Javascript
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
Python实现检测服务器是否可以ping通的2种方法
2015/01/01 Python
利用Python获取操作系统信息实例
2016/09/02 Python
Python中struct模块对字节流/二进制流的操作教程
2017/01/21 Python
Python快速排序算法实例分析
2017/11/29 Python
python生成密码字典的方法
2018/07/06 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
pytorch GAN伪造手写体mnist数据集方式
2020/01/10 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
2020/02/07 Python
CSS3结构性伪类选择器九种写法
2012/04/18 HTML / CSS
用canvas实现图片滤镜效果附演示
2013/11/05 HTML / CSS
学生出入校管理制度
2014/01/16 职场文书
公司面试感谢信
2014/02/01 职场文书
高一数学教学反思
2014/02/07 职场文书
机电专业大学生职业规划书范文
2014/02/25 职场文书
施工安全生产承诺书
2014/05/23 职场文书
三方股份合作协议书
2014/10/13 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
导游词之太湖
2019/10/08 职场文书
使用pandas生成/读取csv文件的方法实例
2021/07/09 Python
漫画「处刑少女的生存之道」第3卷封面公开
2022/03/21 日漫
css让页脚保持在底部位置的四种方案
2022/07/23 HTML / CSS