詳解如何從TensorFlow的mnist數(shù)據(jù)集導(dǎo)出手寫體數(shù)字圖片
在TensorFlow的官方入門課程中,多次用到mnist數(shù)據(jù)集。
mnist數(shù)據(jù)集是一個(gè)數(shù)字手寫體圖片庫(kù),但它的存儲(chǔ)格式并非常見的圖片格式,所有的圖片都集中保存在四個(gè)擴(kuò)展名為idx3-ubyte的二進(jìn)制文件。
如果我們想要知道大名鼎鼎的mnist手寫體數(shù)字都長(zhǎng)什么樣子,就需要從mnist數(shù)據(jù)集中導(dǎo)出手寫體數(shù)字圖片。了解這些手寫體的總體形狀,也有助于加深我們對(duì)TensorFlow入門課程的理解。
下面先給出通過TensorFlow api接口導(dǎo)出mnist手寫體數(shù)字圖片的python代碼,再對(duì)代碼進(jìn)行分析。代碼在win7下測(cè)試通過,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 # 當(dāng)前路徑下的保存目錄 save_dir = "./mnist_digits_images" # 讀入mnist數(shù)據(jù) mnist = input_data.read_data_sets("MNIST_data/", one_hot=False) # 創(chuàng)建會(huì)話 sess = tf.Session() # 獲取圖片總數(shù) shape = sess.run(tf.shape(mnist.train.images)) images_count = shape[0] pixels_per_image = shape[1] # 獲取標(biāo)簽總數(shù) shape = sess.run(tf.shape(mnist.train.labels)) labels_count = shape[0] # mnist.train.labels是一個(gè)二維張量,為便于后續(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 個(gè)標(biāo)簽" % (images_count, labels_count)) print ("每張圖片包含 %s 個(gè)像素" % (pixels_per_image)) print ("數(shù)據(jù)類型:%s" % (mnist.train.images.dtype)) # mnist圖像數(shù)據(jù)的數(shù)值范圍是[0,1],需要擴(kuò)展到[0,255],以便于人眼觀看 if mnist.train.images.dtype == "float32": print ("準(zhǔn)備將數(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)換可能要花不少時(shí)間,有必要打印轉(zhuǎn)換進(jìn)度 if ((i+1)%50) == 0: print ("圖像浮點(diǎn)數(shù)值擴(kuò)展進(jìn)度:已轉(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"" 不存在!自動(dòng)創(chuàng)建該目錄..." % dir) os.makedirs(dir) # 通過python圖片處理庫(kù),生成圖片 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生成對(duì)應(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ù)量龐大,保存過程可能要花不少時(shí)間,有必要打印保存進(jìn)度 if ((i+1)%50) == 0: print ("圖片保存進(jìn)度:已保存 %s 張,共需保存 %s 張" % (i+1, images_to_extract)) else: print ("圖片數(shù)量和標(biāo)簽數(shù)量不一致!")
上述代碼的實(shí)現(xiàn)思路如下:
1.讀入mnist手寫體數(shù)據(jù);
2.把數(shù)據(jù)的值從[0,1]浮點(diǎn)范圍轉(zhuǎn)化為黑白格式(背景為0-黑色,前景為255-白色);
3.根據(jù)mnist.train.labels的內(nèi)容,生成數(shù)字索引,也就是建立每一張圖片和其所代表數(shù)字的關(guān)聯(lián),由此創(chuàng)建對(duì)應(yīng)的保存目錄;
4.循環(huán)遍歷mnist.train.images,把每張圖片的像素?cái)?shù)據(jù)賦值給python圖片處理庫(kù)PIL的Image類實(shí)例,再調(diào)用Image類的save方法把圖片保存在第3步驟中創(chuàng)建的對(duì)應(yīng)目錄。
在運(yùn)行上述代碼之前,你需要確保本地已經(jīng)安裝python的圖片處理庫(kù)PIL,pip安裝命令如下:
pip3 install Pillow
或 pip install Pillow,取決于你的pip版本。
上述python代碼運(yùn)行后,在當(dāng)前目錄下會(huì)生成mnist_digits_images目錄,在該目錄下,可以看到如下內(nèi)容:
可以看到,我們成功地生成了黑底白字的數(shù)字圖片。
如果仔細(xì)觀察這些圖片,會(huì)看到一些肉眼也難以分辨的數(shù)字,譬如:
上面這幾個(gè)數(shù)字是2。想不到吧?
下面這兩個(gè)是5(看起來更像6):
這個(gè)是7:(7長(zhǎng)這樣?有句MMP不知當(dāng)講不當(dāng)講)
猜猜下面這個(gè)是什么:
這是大寫的L?不是。
有點(diǎn)像1,是1嗎?也不是。
倒立拉粑的7?sorry,又猜錯(cuò)了。
實(shí)話告訴您,它是2!一開始我也是不相信的,知道真相的那一刻我下巴差點(diǎn)掉下來!
這些手寫圖片,一般人用肉眼觀察,識(shí)別率能達(dá)到98%就不錯(cuò)了,但是通過TensorFlow搭建的卷積神經(jīng)網(wǎng)絡(luò)識(shí)別率可以達(dá)到99%,非常地神奇!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 基于Tensorflow讀取MNIST數(shù)據(jù)集時(shí)網(wǎng)絡(luò)超時(shí)的解決方式
- tensorflow實(shí)現(xiàn)殘差網(wǎng)絡(luò)方式(mnist數(shù)據(jù)集)
- 使用tensorflow實(shí)現(xiàn)VGG網(wǎng)絡(luò),訓(xùn)練mnist數(shù)據(jù)集方式
- TensorFlow2.X使用圖片制作簡(jiǎn)單的數(shù)據(jù)集訓(xùn)練模型
- C#使用TensorFlow.NET訓(xùn)練自己的數(shù)據(jù)集的方法
- TensorFlow車牌識(shí)別完整版代碼(含車牌數(shù)據(jù)集)
- TensorFlow基于MNIST數(shù)據(jù)集實(shí)現(xiàn)車牌識(shí)別(初步演示版)
- tensorflow實(shí)現(xiàn)加載mnist數(shù)據(jù)集
- Tensorflow 訓(xùn)練自己的數(shù)據(jù)集將數(shù)據(jù)直接導(dǎo)入到內(nèi)存
- 詳解tensorflow訓(xùn)練自己的數(shù)據(jù)集實(shí)現(xiàn)CNN圖像分類
- Tensorflow之構(gòu)建自己的圖片數(shù)據(jù)集TFrecords的方法
- 如何從csv文件構(gòu)建Tensorflow的數(shù)據(jù)集
相關(guān)文章
基于Mediapipe+Opencv實(shí)現(xiàn)手勢(shì)檢測(cè)功能
mediaPipe,他就是一個(gè)集成好的包括人臉關(guān)鍵位點(diǎn)識(shí)別、身體關(guān)鍵位點(diǎn)識(shí)別、手部關(guān)鍵位點(diǎn)識(shí)別的一個(gè)包或者庫(kù),直接調(diào)用就能夠得到它的關(guān)鍵位點(diǎn)信息,本文給大家介紹Mediapipe+Opencv實(shí)現(xiàn)手勢(shì)檢測(cè)功能,感興趣的朋友一起看看吧2022-01-01python目標(biāo)檢測(cè)SSD算法預(yù)測(cè)部分源碼詳解
這篇文章主要為大家介紹了python目標(biāo)檢測(cè)SSD算法預(yù)測(cè)部分源碼詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05備戰(zhàn)618!用Python腳本幫你實(shí)現(xiàn)淘寶秒殺
本次的文章,分享一個(gè)淘寶秒殺腳本,這個(gè)腳本用Python編寫,使用了Python庫(kù)selenium,并且通過selenium + chromedriver,用程序控制chrome瀏覽器,完成搶購(gòu)的一系列操作.有了這個(gè)腳本,大家至少可以與其他的機(jī)器人站在同一起跑線上,公平搶購(gòu)喜歡的寶貝 ,需要的朋友可以參考下2021-06-06Kmeans均值聚類算法原理以及Python如何實(shí)現(xiàn)
這個(gè)算法中文名為k均值聚類算法,首先我們?cè)诙S的特殊條件下討論其實(shí)現(xiàn)的過程,方便大家理解。2020-09-09Python自動(dòng)化處理Excel數(shù)據(jù)的操作過程
在實(shí)際數(shù)據(jù)處理和分析過程中,經(jīng)常會(huì)遇到需要從大量數(shù)據(jù)中提取出特定日期范圍內(nèi)的信息的需求,本文將介紹如何使用Python的pandas庫(kù)來處理Excel文件,感興趣的朋友跟隨小編一起看看吧2023-11-11