|
在TensorFlow的官方入門課程中,多次用到mnist數(shù)據(jù)集。 mnist數(shù)據(jù)集是一個(gè)數(shù)字手寫體圖片庫,但它的存儲格式并非常見的圖片格式,所有的圖片都集中保存在四個(gè)擴(kuò)展名為idx3-ubyte的二進(jìn)制文件。 如果我們想要知道大名鼎鼎的mnist手寫體數(shù)字都長什么樣子,就需要從mnist數(shù)據(jù)集中導(dǎo)出手寫體數(shù)字圖片。了解這些手寫體的總體形狀,也有助于加深我們對TensorFlow入門課程的理解。 下面先給出通過TensorFlow api接口導(dǎo)出mnist手寫體數(shù)字圖片的python代碼,再對代碼進(jìn)行分析。代碼在win7下測試通過,linux環(huán)境也可以參考本處代碼。 import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import os
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("C:\\Users\\Administrator\\Desktop\\Tensorflow\\數(shù)據(jù)集\\mnist\\", 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]
# 獲取標(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"" 不存在!自動創(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ù)量龐大,保存過程可能要花不少時(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)建對應(yīng)的保存目錄; 4.循環(huán)遍歷mnist.train.images,把每張圖片的像素?cái)?shù)據(jù)賦值給python圖片處理庫PIL的Image類實(shí)例,再調(diào)用Image類的save方法把圖片保存在第3步驟中創(chuàng)建的對應(yīng)目錄。 來源:https://www./content-4-438401.html |
|
|