1、mnist 對象中各個屬性的含義和大小
檔案名 大小 特點
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)
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(手寫數字圖檔識别)資料集簡介、下載下傳、使用方法(包括資料集增強)之詳細攻略
1、思路
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:利用Python将已有mnist資料集通過移動像素上下左右的方法來擴大資料集為初始資料集的5倍