詳解如何從TensorFlow的mnist數(shù)據(jù)集導出手寫體數(shù)字圖片
在TensorFlow的官方入門課程中,多次用到mnist數(shù)據(jù)集。
mnist數(shù)據(jù)集是一個數(shù)字手寫體圖片庫,但它的存儲格式并非常見的圖片格式,所有的圖片都集中保存在四個擴展名為idx3-ubyte的二進制文件。
如果我們想要知道大名鼎鼎的mnist手寫體數(shù)字都長什么樣子,就需要從mnist數(shù)據(jù)集中導出手寫體數(shù)字圖片。了解這些手寫體的總體形狀,也有助于加深我們對TensorFlow入門課程的理解。
下面先給出通過TensorFlow api接口導出mnist手寫體數(shù)字圖片的python代碼,再對代碼進行分析。代碼在win7下測試通過,linux環(huán)境也可以參考本處代碼。
(非常良心的注釋和打印有木有)
#!/usr/bin/python3.5
# -*- coding: utf-8 -*-
import os
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
from PIL import Image
# 聲明圖片寬高
rows = 28
cols = 28
# 要提取的圖片數(shù)量
images_to_extract = 8000
# 當前路徑下的保存目錄
save_dir = "./mnist_digits_images"
# 讀入mnist數(shù)據(jù)
mnist = input_data.read_data_sets("MNIST_data/", one_hot=False)
# 創(chuàng)建會話
sess = tf.Session()
# 獲取圖片總數(shù)
shape = sess.run(tf.shape(mnist.train.images))
images_count = shape[0]
pixels_per_image = shape[1]
# 獲取標簽總數(shù)
shape = sess.run(tf.shape(mnist.train.labels))
labels_count = shape[0]
# mnist.train.labels是一個二維張量,為便于后續(xù)生成數(shù)字圖片目錄名,有必要一維化(后來發(fā)現(xiàn)只要把數(shù)據(jù)集的one_hot屬性設(shè)為False,mnist.train.labels本身就是一維)
#labels = sess.run(tf.argmax(mnist.train.labels, 1))
labels = mnist.train.labels
# 檢查數(shù)據(jù)集是否符合預(yù)期格式
if (images_count == labels_count) and (shape.size == 1):
print ("數(shù)據(jù)集總共包含 %s 張圖片,和 %s 個標簽" % (images_count, labels_count))
print ("每張圖片包含 %s 個像素" % (pixels_per_image))
print ("數(shù)據(jù)類型:%s" % (mnist.train.images.dtype))
# mnist圖像數(shù)據(jù)的數(shù)值范圍是[0,1],需要擴展到[0,255],以便于人眼觀看
if mnist.train.images.dtype == "float32":
print ("準備將數(shù)據(jù)類型從[0,1]轉(zhuǎn)為binary[0,255]...")
for i in range(0,images_to_extract):
for n in range(pixels_per_image):
if mnist.train.images[i][n] != 0:
mnist.train.images[i][n] = 255
# 由于數(shù)據(jù)集圖片數(shù)量龐大,轉(zhuǎn)換可能要花不少時間,有必要打印轉(zhuǎn)換進度
if ((i+1)%50) == 0:
print ("圖像浮點數(shù)值擴展進度:已轉(zhuǎn)換 %s 張,共需轉(zhuǎn)換 %s 張" % (i+1, images_to_extract))
# 創(chuàng)建數(shù)字圖片的保存目錄
for i in range(10):
dir = "%s/%s/" % (save_dir,i)
if not os.path.exists(dir):
print ("目錄 ""%s"" 不存在!自動創(chuàng)建該目錄..." % dir)
os.makedirs(dir)
# 通過python圖片處理庫,生成圖片
indices = [0 for x in range(0, 10)]
for i in range(0,images_to_extract):
img = Image.new("L",(cols,rows))
for m in range(rows):
for n in range(cols):
img.putpixel((n,m), int(mnist.train.images[i][n+m*cols]))
# 根據(jù)圖片所代表的數(shù)字label生成對應(yīng)的保存路徑
digit = labels[i]
path = "%s/%s/%s.bmp" % (save_dir, labels[i], indices[digit])
indices[digit] += 1
img.save(path)
# 由于數(shù)據(jù)集圖片數(shù)量龐大,保存過程可能要花不少時間,有必要打印保存進度
if ((i+1)%50) == 0:
print ("圖片保存進度:已保存 %s 張,共需保存 %s 張" % (i+1, images_to_extract))
else:
print ("圖片數(shù)量和標簽數(shù)量不一致!")
上述代碼的實現(xiàn)思路如下:
1.讀入mnist手寫體數(shù)據(jù);
2.把數(shù)據(jù)的值從[0,1]浮點范圍轉(zhuǎn)化為黑白格式(背景為0-黑色,前景為255-白色);
3.根據(jù)mnist.train.labels的內(nèi)容,生成數(shù)字索引,也就是建立每一張圖片和其所代表數(shù)字的關(guān)聯(lián),由此創(chuàng)建對應(yīng)的保存目錄;
4.循環(huán)遍歷mnist.train.images,把每張圖片的像素數(shù)據(jù)賦值給python圖片處理庫PIL的Image類實例,再調(diào)用Image類的save方法把圖片保存在第3步驟中創(chuàng)建的對應(yīng)目錄。
在運行上述代碼之前,你需要確保本地已經(jīng)安裝python的圖片處理庫PIL,pip安裝命令如下:
pip3 install Pillow
或 pip install Pillow,取決于你的pip版本。
上述python代碼運行后,在當前目錄下會生成mnist_digits_images目錄,在該目錄下,可以看到如下內(nèi)容:

可以看到,我們成功地生成了黑底白字的數(shù)字圖片。
如果仔細觀察這些圖片,會看到一些肉眼也難以分辨的數(shù)字,譬如:


上面這幾個數(shù)字是2。想不到吧?
下面這兩個是5(看起來更像6):


這個是7:(7長這樣?有句MMP不知當講不當講)

猜猜下面這個是什么:

這是大寫的L?不是。
有點像1,是1嗎?也不是。
倒立拉粑的7?sorry,又猜錯了。
實話告訴您,它是2!一開始我也是不相信的,知道真相的那一刻我下巴差點掉下來!
這些手寫圖片,一般人用肉眼觀察,識別率能達到98%就不錯了,但是通過TensorFlow搭建的卷積神經(jīng)網(wǎng)絡(luò)識別率可以達到99%,非常地神奇!
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- 基于Tensorflow讀取MNIST數(shù)據(jù)集時網(wǎng)絡(luò)超時的解決方式
- tensorflow實現(xiàn)殘差網(wǎng)絡(luò)方式(mnist數(shù)據(jù)集)
- 使用tensorflow實現(xiàn)VGG網(wǎng)絡(luò),訓練mnist數(shù)據(jù)集方式
- TensorFlow2.X使用圖片制作簡單的數(shù)據(jù)集訓練模型
- C#使用TensorFlow.NET訓練自己的數(shù)據(jù)集的方法
- TensorFlow車牌識別完整版代碼(含車牌數(shù)據(jù)集)
- TensorFlow基于MNIST數(shù)據(jù)集實現(xiàn)車牌識別(初步演示版)
- tensorflow實現(xiàn)加載mnist數(shù)據(jù)集
- Tensorflow 訓練自己的數(shù)據(jù)集將數(shù)據(jù)直接導入到內(nèi)存
- 詳解tensorflow訓練自己的數(shù)據(jù)集實現(xiàn)CNN圖像分類
- Tensorflow之構(gòu)建自己的圖片數(shù)據(jù)集TFrecords的方法
- 如何從csv文件構(gòu)建Tensorflow的數(shù)據(jù)集
相關(guān)文章
基于Mediapipe+Opencv實現(xiàn)手勢檢測功能
mediaPipe,他就是一個集成好的包括人臉關(guān)鍵位點識別、身體關(guān)鍵位點識別、手部關(guān)鍵位點識別的一個包或者庫,直接調(diào)用就能夠得到它的關(guān)鍵位點信息,本文給大家介紹Mediapipe+Opencv實現(xiàn)手勢檢測功能,感興趣的朋友一起看看吧2022-01-01
備戰(zhàn)618!用Python腳本幫你實現(xiàn)淘寶秒殺
本次的文章,分享一個淘寶秒殺腳本,這個腳本用Python編寫,使用了Python庫selenium,并且通過selenium + chromedriver,用程序控制chrome瀏覽器,完成搶購的一系列操作.有了這個腳本,大家至少可以與其他的機器人站在同一起跑線上,公平搶購喜歡的寶貝 ,需要的朋友可以參考下2021-06-06
Kmeans均值聚類算法原理以及Python如何實現(xiàn)
這個算法中文名為k均值聚類算法,首先我們在二維的特殊條件下討論其實現(xiàn)的過程,方便大家理解。2020-09-09
Python自動化處理Excel數(shù)據(jù)的操作過程
在實際數(shù)據(jù)處理和分析過程中,經(jīng)常會遇到需要從大量數(shù)據(jù)中提取出特定日期范圍內(nèi)的信息的需求,本文將介紹如何使用Python的pandas庫來處理Excel文件,感興趣的朋友跟隨小編一起看看吧2023-11-11

