詳解如何從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屬性設為False,mnist.train.labels本身就是一維)
#labels = sess.run(tf.argmax(mnist.train.labels, 1))
labels = mnist.train.labels
# 檢查數(shù)據(jù)集是否符合預期格式
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]轉為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ù)量龐大,轉換可能要花不少時間,有必要打印轉換進度
if ((i+1)%50) == 0:
print ("圖像浮點數(shù)值擴展進度:已轉換 %s 張,共需轉換 %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生成對應的保存路徑
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]浮點范圍轉化為黑白格式(背景為0-黑色,前景為255-白色);
3.根據(jù)mnist.train.labels的內容,生成數(shù)字索引,也就是建立每一張圖片和其所代表數(shù)字的關聯(lián),由此創(chuàng)建對應的保存目錄;
4.循環(huán)遍歷mnist.train.images,把每張圖片的像素數(shù)據(jù)賦值給python圖片處理庫PIL的Image類實例,再調用Image類的save方法把圖片保存在第3步驟中創(chuàng)建的對應目錄。
在運行上述代碼之前,你需要確保本地已經安裝python的圖片處理庫PIL,pip安裝命令如下:
pip3 install Pillow
或 pip install Pillow,取決于你的pip版本。
上述python代碼運行后,在當前目錄下會生成mnist_digits_images目錄,在該目錄下,可以看到如下內容:

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


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


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

猜猜下面這個是什么:

這是大寫的L?不是。
有點像1,是1嗎?也不是。
倒立拉粑的7?sorry,又猜錯了。
實話告訴您,它是2!一開始我也是不相信的,知道真相的那一刻我下巴差點掉下來!
這些手寫圖片,一般人用肉眼觀察,識別率能達到98%就不錯了,但是通過TensorFlow搭建的卷積神經網絡識別率可以達到99%,非常地神奇!
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- 基于Tensorflow讀取MNIST數(shù)據(jù)集時網絡超時的解決方式
- tensorflow實現(xiàn)殘差網絡方式(mnist數(shù)據(jù)集)
- 使用tensorflow實現(xiàn)VGG網絡,訓練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ù)直接導入到內存
- 詳解tensorflow訓練自己的數(shù)據(jù)集實現(xiàn)CNN圖像分類
- Tensorflow之構建自己的圖片數(shù)據(jù)集TFrecords的方法
- 如何從csv文件構建Tensorflow的數(shù)據(jù)集
相關文章
python3.6.3+opencv3.3.0實現(xiàn)動態(tài)人臉捕獲
這篇文章主要為大家詳細介紹了python3.6.3+opencv3.3.0實現(xiàn)動態(tài)人臉捕獲,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05
手把手教你快速安裝gpu版本的pytorch(詳細圖文教程)
在Windows?10上安裝PyTorch時,通常默認安裝的是CPU版本,且下載速度較慢,本文提供了一個詳細的安裝指南,包括如何檢查CUDA版本、選擇合適的PyTorch、torchvision和torchaudio版本,并通過pip而非conda進行安裝,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2024-09-09
Python字符和字符值(ASCII或Unicode碼值)轉換方法
這篇文章主要介紹了Python字符和字符值(ASCII或Unicode碼值)轉換方法,即把字符串在ASCII值或者Unicode值之間相與轉換的方法,需要的朋友可以參考下2015-05-05
Python-OpenCV中的cv2.inpaint()函數(shù)的使用
大多數(shù)人會在家里放一些舊的退化照片,上面有一些黑點,一些筆畫等。你有沒有想過恢復它?本文就來介紹一下方法,感興趣的可以了解一下2021-06-06

