【拔刀吧 TensorFlow】TensorFlow学习笔记二

本文通过介绍MNIST数据集及其在TensorFlow中的应用,引导读者从零开始步入深度学习的世界。文中不仅详细解释了MNIST数据集的组成与用途,还提供了Python代码示例,演示了如何下载和解析数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这次的故事从从一颗蓝色药丸说起……

面向机器学习初学者的 MNIST 初级教程图片原作者:W. Carter

      每一次学习一种新的编程语言,譬如从C到Python,都是从实现“Hello World!”开始,用一个陌生的新工具和这个世界说你好。小小的HW代码,让我们初步理解这个工具的原理。

      入门TensorFlow一样如此,正如官方的蓝色药丸,MNIST是零基础入门TensorFlow的新人居家旅行必备良药。今天服下这颗药丸,希望深度学习之路不会要完……

=====================说正事的严肃脸分割线(〃'▽'〃)======================

       首先说说MNIST,MNIST是一个入门级的计算机手写数字库。包含手写数字的训练集、验证集图片,以及标注好的标签。 图片差不多长这样:,就是一个个手写的数字。而标签,就是已经识别好的结果,可以理解为标准答案,这里的话就是5、0、4、1。

       作为一个还没有入门的新人,这里理解为深度学习就好比计算机是一个什么也不知道的孩子,用已经带标准答案的结果告诉它(emm……我的电脑是她⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄),这是什么,让她记住了,然后用没有标准答案的图片来让她识别(预测)。(这里若是有错,以后懂了再回来改,脸先放这里,被打了也是进步。。。)而有答案的图片就是训练集,反之就是数据集。这个数据库中训练集(mnist.train)60,000行,测试数据集(mnist.test)10,000行。

        初步了解了MNIST数据集(大误!),让我们跑起代码,做进一步的理解。

        根据官方手册的代码,运用这两句可以自动下载MNIST数据集:

import tensorflow.examples.tutorials.mnist.input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

但是自己测试后,发现这个代码无法使用,而使用了如下代码:

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

即可自动下载数据集。运行起来是这样:


下载好的数据集默认放在.../MNIST_data文件夹下,共四个文件:


这里记录一下一个我这个超级小白的疑惑,开始看见这四个压缩文件,不知如何使用,解压开后是后缀为.ubyte的文件,经过百度,这是一种特殊的文件格式,而MNIST官网也对这个格式做了介绍。需要进行解析才能变成我们日常理解的一个个图片。具体解析方法及文件格式的解读可以看海上扬凡的博客所写。不过这里我附上改写的Python3的代码,可以复制直接使用,记得将数据集放在同一个文件夹。

# -*- coding: utf-8 -*-


from PIL import Image
import struct


def read_image(filename):
  f = open(filename, 'rb')


  index = 0
  buf = f.read()


  f.close()


  magic, images, rows, columns = struct.unpack_from('>IIII' , buf , index)
  index += struct.calcsize('>IIII')


  for i in range(images):
  #for i in range(2000):
    image = Image.new('L', (columns, rows))


    for x in range(rows):
      for y in range(columns):
        image.putpixel((y, x), int(struct.unpack_from('>B', buf, index)[0]))
        index += struct.calcsize('>B')


    print ('save ' + str(i) + 'image')
    image.save('test/' + str(i) + '.png')


def read_label(filename, saveFilename):
  f = open(filename, 'rb')
  index = 0
  buf = f.read()


  f.close()


  magic, labels = struct.unpack_from('>II' , buf , index)
  index += struct.calcsize('>II')
  
  labelArr = [0] * labels
  #labelArr = [0] * 2000


  for x in range(labels):
  #for x in range(2000):
    labelArr[x] = int(struct.unpack_from('>B', buf, index)[0])
    index += struct.calcsize('>B')


  save = open(saveFilename, 'w')


  save.write(','.join(map(lambda x: str(x), labelArr)))
  save.write('\n')


  save.close()
  print ('save labels success')


if __name__ == '__main__':
  read_image('t10k-images.idx3-ubyte')
  read_label('t10k-labels.idx1-ubyte', 'test/label.txt')

大家在跑的时候可能会提示[Error2] 没有找到test/0.png这样的报错,原文并没有出现这样的错误,于是我新建了一个test文件夹,问题迎刃而解,这里记录一下。


输出的图片结果为:


当然,在跑官方文档中的示例程序是不需要进行这样的处理的。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值