深度学习之 mnist 手写数字识别

开始学习深度学习,先来一个手写数字的程序

import numpy as np
import os
import codecs
import torch
from PIL import Image lr = 0.01
momentum = 0.5
epochs = 10 def get_int(b):
return int(codecs.encode(b, 'hex'), 16) def read_label_file(path):
with open(path, 'rb') as f:
data = f.read()
assert get_int(data[:4]) == 2049
length = get_int(data[4:8])
parsed = np.frombuffer(data, dtype=np.uint8, offset=8)
return torch.from_numpy(parsed).view(length).long() def read_image_file(path):
with open(path, 'rb') as f:
data = f.read()
assert get_int(data[:4]) == 2051
length = get_int(data[4:8])
num_rows = get_int(data[8:12])
num_cols = get_int(data[12:16])
images = []
parsed = np.frombuffer(data, dtype=np.uint8, offset=16)
return torch.from_numpy(parsed).view(length, num_rows, num_cols) def loadmnist(path, kind='train'):
labels_path = os.path.join(path, 'mnist' ,'%s-labels.idx1-ubyte' % kind)
images_path = os.path.join(path,'mnist' ,'%s-images.idx3-ubyte' % kind) labels = read_label_file(labels_path)
images = read_image_file(images_path)
return images, labels import torch.utils.data as data
import torchvision.transforms as transforms class Loader(data.Dataset):
def __init__(self, root, label, transforms):
self.imgs = [] imgs,labels = loadmnist(root, label) self.imgs = imgs
self.labels = labels self.transforms = transforms def __getitem__(self, index):
img, label = self.imgs[index],self.labels[index] img = Image.fromarray(img.numpy(), mode='L')
if self.transforms:
img = self.transforms(img) return img, label def __len__(self):
return len(self.imgs) def getTrainDataset():
return Loader('d:\\work\\yoho\\dl\\dl-study\\chapter0\\', 'train', transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,)),
])) def getTestDataset():
return Loader('d:\\work\\yoho\\dl\\dl-study\\chapter0\\', 't10k', transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,)),
])) import torch as t
import torch.nn as nn class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(1, 10, kernel_size=5),
nn.MaxPool2d(2),
nn.ReLU(inplace=True),
nn.Conv2d(10, 20, kernel_size=5),
nn.Dropout2d(),
nn.MaxPool2d(2),
nn.ReLU(inplace=True),
) self.classifier = nn.Sequential(
nn.Linear(320, 50),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(50, 10),
nn.LogSoftmax(dim=1)
) def forward(self, x):
x = self.features(x)
x = x.view(x.size(0), -1)
x = self.classifier(x) return x net = Net() import torch.optim as optim
from torch.nn.modules import loss optimizer = optim.SGD(net.parameters(), lr=lr, momentum=momentum)
criterion = loss.CrossEntropyLoss() train_dataset = getTrainDataset()
test_dataset = getTestDataset() train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=4, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=4, shuffle=False) from torch.autograd import Variable as V def train(epoch):
for i, (inputs, labels) in enumerate(train_loader):
inputs_var, labels_var = V(inputs), V(labels) outputs = net(inputs_var)
losses = criterion(outputs, labels_var) optimizer.zero_grad()
losses.backward()
optimizer.step() def test(epoch):
for i, (inputs, labels) in enumerate(test_loader):
inputs_var = V(inputs) outputs = net(inputs_var) _, pred = outputs.data.topk(5, 1, True, True) batch_size = labels.size(0)
pred = pred.t()
corrent = pred.eq(labels.view(1, -1).expand_as(pred)) res = []
for k in (1,5):
correct_k = corrent[:k].view(-1).float().sum(0, keepdim=True)
res.append(correct_k.mul_(100.0 / batch_size))
print('{} {} top1 {} top5 {}'.format(epoch, i ,res[0][0], res[1][0])) def main():
for epoch in range(0, epochs):
train(epoch)
test(epoch) main()

学习之后的,正确率很高,这种问题对于深度学习已经解决了。

深度学习之 mnist 手写数字识别的更多相关文章

  1. 【深度学习系列】手写数字识别卷积神经--卷积神经网络CNN原理详解(一)

    上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...

  2. 用MXnet实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别

    用MXnet实战深度学习之一:安装GPU版mxnet并跑一个MNIST手写数字识别 http://phunter.farbox.com/post/mxnet-tutorial1 用MXnet实战深度学 ...

  3. mnist手写数字识别——深度学习入门项目(tensorflow+keras+Sequential模型)

    前言 今天记录一下深度学习的另外一个入门项目——<mnist数据集手写数字识别>,这是一个入门必备的学习案例,主要使用了tensorflow下的keras网络结构的Sequential模型 ...

  4. Android+TensorFlow+CNN+MNIST 手写数字识别实现

    Android+TensorFlow+CNN+MNIST 手写数字识别实现 SkySeraph 2018 Email:skyseraph00#163.com 更多精彩请直接访问SkySeraph个人站 ...

  5. 持久化的基于L2正则化和平均滑动模型的MNIST手写数字识别模型

    持久化的基于L2正则化和平均滑动模型的MNIST手写数字识别模型 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献Tensorflow实战Google深度学习框架 实验平台: Tens ...

  6. Tensorflow之MNIST手写数字识别:分类问题(1)

    一.MNIST数据集读取 one hot 独热编码独热编码是一种稀疏向量,其中:一个向量设为1,其他元素均设为0.独热编码常用于表示拥有有限个可能值的字符串或标识符优点:   1.将离散特征的取值扩展 ...

  7. Tensorflow实现MNIST手写数字识别

    之前我们讲了神经网络的起源.单层神经网络.多层神经网络的搭建过程.搭建时要注意到的具体问题.以及解决这些问题的具体方法.本文将通过一个经典的案例:MNIST手写数字识别,以代码的形式来为大家梳理一遍神 ...

  8. Pytorch入门——手把手教你MNIST手写数字识别

    MNIST手写数字识别教程 要开始带组内的小朋友了,特意出一个Pytorch教程来指导一下 [!] 这里是实战教程,默认读者已经学会了部分深度学习原理,若有不懂的地方可以先停下来查查资料 目录 MNI ...

  9. 基于tensorflow的MNIST手写数字识别(二)--入门篇

    http://www.jianshu.com/p/4195577585e6 基于tensorflow的MNIST手写字识别(一)--白话卷积神经网络模型 基于tensorflow的MNIST手写数字识 ...

随机推荐

  1. 关系型数据库工作原理-数据结构(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  2. 毫秒级检测!你见过带GPU的树莓派吗?

    树莓派3B+英特尔神经计算棒进行高速目标检测 转载请注明作者梦里茶 代码: 训练数据预处理: https://gist.github.com/ahangchen/ae1b7562c1f93fdad1d ...

  3. 设计模式——适配器模式(C++实现)

            #include <iostream> #include <string> using namespace std; class STTarget { publ ...

  4. Filecoin2017年Q4进度更新(完整版)

    亲爱的Filecoin支持者.矿工.用户.投资者和广大的社区朋友们, 自从Token销售完成以后,我们便开始集中精力把Filecoin项目从设想变为现实-从实现Filecoin协议的核心代码到打造我们 ...

  5. 读headFirst设计模式 - 工厂模式

    每次写博客都不知道要怎么引入要写的主题,挺头疼的一件事.今天就直接开门见山,今天要学的就是工厂模式,工厂就是批量生产制造东西的地方.在这里,工厂就是批量生产对象的地方. 学习书上的例子 假如你现在有一 ...

  6. Java异常处理认识

    什么是异常? 就是在编程过程中或者程序运行过程中出现的一些意外. 什么是异常处理? 就是提前编写程序处理可能发生的意外. 具体的过程是怎样的? 知己知彼方能百战百胜.Java中的异常是用对象来表示的, ...

  7. sql模糊查询效率

    在数据库量比较大的时候通常有一些查询,例如查询文本类型的数据,存储量大,用like进行模糊查询效率实在太低 select * from stdcontent where  content like ' ...

  8. Java 并发编程实践基础 读书笔记: 第三章 使用 JDK 并发包构建程序

    一,JDK并发包实际上就是指java.util.concurrent包里面的那些类和接口等 主要分为以下几类: 1,原子量:2,并发集合:3,同步器:4,可重入锁:5,线程池 二,原子量 原子变量主要 ...

  9. /var/spool/clientmqueue目录下存在大量文件的原因及解决方法

    问题现象:linux操作系统中的/var/spool/clientmqueue/目录下存在大量文件.原因分析: 系统中有用户开启了cron,而cron中执行的程序有输出内容,输出内容会以邮件形式发给c ...

  10. 程序员的入门 简单的编程HelloWord

    那么在上一章章节 http://www.cnblogs.com/Goraidh/p/8674329.html 我们简单的俩了解了一下什么是java和配置编写java的环境,本章呢我们学习如何编写一个简 ...