在TensorFlow的官方入門課程中,多次用到mnist數(shù)據(jù)集。 mnist數(shù)據(jù)集是一個數(shù)字手寫體圖片庫,但它的存儲格式并非常見的圖片格式,所有的圖片都集中保存在四個擴展名為idx3-ubyte的二進制文件。 如果我們想要知道大名鼎鼎的mnist手寫體數(shù)字都長什么樣子,就需要從mnist數(shù)據(jù)集中導(dǎo)出手寫體數(shù)字圖片。了解這些手寫體的總體形狀,也有助于加深我們對TensorFlow入門課程的理解。 下面先給出通過TensorFlow api接口導(dǎo)出mnist手寫體數(shù)字圖片的python代碼,再對代碼進行分析。代碼在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是一個二維張量,為便于后續(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 個標(biāo)簽" % (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("準(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)換可能要花不少時間,有必要打印轉(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ù)量和標(biāo)簽數(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)目錄。 來源:https://www./content-4-438401.html |
|