天天看點

Dataset之MNIST:MNIST(手寫數字圖檔識别+ubyte.gz檔案)資料集簡介、下載下傳、使用方法(包括資料增強)之詳細攻略(二)

1、mnist 對象中各個屬性的含義和大小

Dataset之MNIST:MNIST(手寫數字圖檔識别+ubyte.gz檔案)資料集簡介、下載下傳、使用方法(包括資料增強)之詳細攻略(二)

檔案名                                       大小                    特點

train-images-idx3-ubyte.gz      ≈9.45 MB           訓練圖像資料

train-labels-idx 1-ubyte.gz      ≈0.03MB             訓練圖像的标

ti Ok-images-idx3-ubyte.gz    ≈ t.57MB             測試圖像資料

t l Ok-labels-idxl-ubyte.gz      ≈4.4KB                測試圖像的标

       原始的MNIST 資料集中包含60000 張訓練圖檔和10000 張測試圖檔。

       而在TensorFlow 中,又将原先的60000 張訓練圖檔重新劃分成了新的55000張訓練圖檔和5000張驗證圖檔。是以在mnist 對象中,資料一共分為三部分: mnist.train 是訓練圖檔資料, mnist. validation 是驗證圖檔資料,mnist.test是測試圖檔資料,這正好對應了機器學習中的訓練集、驗證集和測試集。一般來說,會在訓練集上訓練模型,通過模型在驗證集上的表現調整參數,最後通過測試集确定模型的性能。

2、資料集的應用—訓練和預測

        這些圖像可以用于學習和推理。MNIST資料集的一般使用方法是,先用訓練圖像進行學習,再用學習到的模型度量能在多大程度上對測試圖像進行正确的分類。

       在原始的MNIST 資料集中(官網

http://yann.lecun.com/exdb/mnist/)

,可以找到多達68 種模型在該資料集上的準确率資料,包括相應的論文出處。這些模型包括線性分類器、K 近鄰方法、普通的神經網絡、卷積神經網絡等。

MNIST資料集下載下傳

1、基于python語言根據爬蟲技術自動下載下傳MNIST資料集

Dataset之MNIST:自定義函數mnist.load_mnist根據網址下載下傳mnist資料集(四個ubyte.gz格式資料集檔案)

Dataset之MNIST:MNIST(手寫數字圖檔識别+ubyte.gz檔案)資料集的下載下傳(基于python語言根據爬蟲技術自動下載下傳MNIST資料集)

2、TensorFlow的封裝下使用MNIST資料集

       TensorFlow的封裝讓使用MNIST資料集變得更加友善。

       MNIST資料集提供了4個下載下傳檔案,在tensorflow中可将這四個檔案直接下載下傳放于一個目錄中并加載,如下代碼所示,如果指定目錄中沒有資料,那麼tensorflow會自動去網絡上進行下載下傳。通過input_data.read_data_sets函數生成的類會自動将MNIST資料集劃分為train, validation和test三個資料集。

     其中train這個集合内含有55000張圖檔,validation集合内含有5000張圖檔,這兩個集合組成了MNIST本身提供的訓練資料集。test集合内有10000張圖檔,這些圖檔都來自與MNIST提供的測試資料集。

1、MNIST資料集下載下傳及輸出基本資訊

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data #這是TensorFlow 為了教學Mnist而提前設計好的程式

# number 1 to 10 data

mnist = input_data.read_data_sets('MNIST_data', one_hot=True) #TensorFlow 會檢測資料是否存在。當資料不存在時,系統會自動,在目前代碼py檔案位置,自動建立MNIST_data檔案夾,并将資料下載下傳到該件夾内。當執行完語句後,讀者可以自行前往MNIST_data/檔案夾下檢視上述4 個檔案是否已經被正确地下載下傳

#若因網絡問題無法正常下載下傳,可以前往MNIST官網

http://yann.lecun.com/exdb/mnist/

使用下載下傳工具下載下傳上述4 個檔案, 并将它們複制到MNIST_data/檔案夾中。

#檢視訓練資料的大小

print(mnist.train.images.shape)  #(55000, 784)

print(mnist.train.labels.shape)  #(55000, 10)

#檢視驗證資料的大小

print(mnist.validation.images.shape)  #(5000, 784)

print(mnist.validation.labels.shape)  #(5000, 10)

#檢視測試資料的大小

print(mnist.test.images.shape)  #(10000, 784)

print(mnist.test.labels.shape)  #(10000, 10)

print(mnist.train.images[0,:])  #列印出第0張訓練圖檔對應的向量表示

2、利用TF檢視MNIST資料集中訓練集的前20張圖檔

#利用TF檢視MNIST資料集中訓練集的前20張圖檔

from tensorflow.examples.tutorials.mnist import input_data

import scipy.misc

import os

# 讀取MNIST資料集。如果不存在會事先下載下傳。

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# 我們把原始圖檔儲存在MNIST_data/raw/檔案夾下

# 如果沒有這個檔案夾會自動建立

save_dir = 'MNIST_data/raw/'

if os.path.exists(save_dir) is False:

   os.makedirs(save_dir)

# 儲存前20張圖檔

for i in range(20):

   # 請注意,mnist.train.images[i, :]就表示第i張圖檔(序号從0開始)

   image_array = mnist.train.images[i, :]

   # TensorFlow中的MNIST圖檔是一個784維的向量,我們重新把它還原為28x28維的圖像。

   image_array = image_array.reshape(28, 28)

   # 儲存檔案的格式為 mnist_train_0.jpg, mnist_train_1.jpg, ... ,mnist_train_19.jpg

   filename = save_dir + 'mnist_train_%d.jpg' % i

   # 将image_array儲存為圖檔

   # 先用scipy.misc.toimage轉換為圖像,再調用save直接儲存。

   scipy.misc.toimage(image_array, cmin=0.0, cmax=1.0).save(filename)

print('Please check: %s ' % save_dir)

Dataset之MNIST:MNIST(手寫數字圖檔識别+ubyte.gz檔案)資料集簡介、下載下傳、使用方法(包括資料增強)之詳細攻略(二)

3、檢視mnist_train資料集

列印出前20張圖檔的One-hot編碼+前20張圖檔所對應的标簽

#mnist_train資料集:列印出前20張圖檔的One-hot編碼+前20張圖檔所對應的标簽

import numpy as np

# 讀取mnist資料集。如果不存在會事先下載下傳。

# 看前20張訓練圖檔的label

   # 得到one-hot表示,形如(0, 1, 0, 0, 0, 0, 0, 0, 0, 0)

   one_hot_label = mnist.train.labels[i, :]

   # 通過np.argmax我們可以直接獲得原始的label

   # 因為隻有1位為1,其他都是0

   label = np.argmax(one_hot_label)

   print('mnist_train中,第  %d 張圖檔One-hot編碼'% i,mnist.train.labels[i,:])

   print('mnist_train中,第  %d 張圖檔對應的 label: %d' % (i, label))

Dataset之MNIST:MNIST(手寫數字圖檔識别+ubyte.gz檔案)資料集簡介、下載下傳、使用方法(包括資料增強)之詳細攻略(二)

資料集增強代碼示範

Dataset之MNIST:MNIST(手寫數字圖檔識别)資料集簡介、下載下傳、使用方法(包括資料集增強)之詳細攻略

1、思路

Dataset之MNIST:MNIST(手寫數字圖檔識别+ubyte.gz檔案)資料集簡介、下載下傳、使用方法(包括資料增強)之詳細攻略(二)

2、代碼實作

資料集增強(将已有MNIST資料集通過移動像素上下左右的方法來擴大資料集為初始資料集的5倍)

from __future__ import print_function

import cPickle

import gzip

import os.path

import random

print("Expanding the MNIST training set")

if os.path.exists("../data/mnist_expanded.pkl.gz"):

   print("The expanded training set already exists.  Exiting.")

else:

   f = gzip.open("../data/mnist.pkl.gz", 'rb')

   training_data, validation_data, test_data = cPickle.load(f)

   f.close()

   expanded_training_pairs = []

   j = 0

   for x, y in zip(training_data[0], training_data[1]):

       expanded_training_pairs.append((x, y))

       image = np.reshape(x, (-1, 28))

       j += 1

       if j % 1000 == 0: print("Expanding image number", j)

       for d, axis, index_position, index in [

               (1,  0, "first", 0),

               (-1, 0, "first", 27),

               (1,  1, "last",  0),

               (-1, 1, "last",  27)]:

           new_img = np.roll(image, d, axis)

           if index_position == "first":

               new_img[index, :] = np.zeros(28)

           else:

               new_img[:, index] = np.zeros(28)

           expanded_training_pairs.append((np.reshape(new_img, 784), y))

   random.shuffle(expanded_training_pairs)

   expanded_training_data = [list(d) for d in zip(*expanded_training_pairs)]

   print("Saving expanded data. This may take a few minutes.")

   f = gzip.open("../data/mnist_expanded.pkl.gz", "w")  

   cPickle.dump((expanded_training_data, validation_data, test_data), f)

Dataset之MNIST:MNIST(手寫數字圖檔識别+ubyte.gz檔案)資料集簡介、下載下傳、使用方法(包括資料增強)之詳細攻略(二)

相關文章

Dataset:利用Python将已有mnist資料集通過移動像素上下左右的方法來擴大資料集為初始資料集的5倍