自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

想學習人工智能,這個的數(shù)據(jù)集必須掌握,MNIST入門與實戰(zhàn)

存儲 數(shù)據(jù)管理 人工智能
今天我們就介紹一個非常簡單,但很有用的數(shù)據(jù)集,這就是MNIST。這個數(shù)據(jù)集非常適合我們進行人工智能相關(guān)算法的學習和練習。

學習人工智能少不了需要一些數(shù)據(jù)集,比如進行鑒黃的人工智能少不了一些類似的圖片。進行語音識別的人工智能,語料庫是少不了的。對于初學人工智能的同學常常為數(shù)據(jù)集而發(fā)愁。今天我們就介紹一個非常簡單,但很有用的數(shù)據(jù)集,這就是MNIST。這個數(shù)據(jù)集非常適合我們進行人工智能相關(guān)算法的學習和練習。

MNIST 數(shù)據(jù)集是美國國家標準與技術(shù)研究所(National Institute of Standards and Technology,簡稱NIST)制作的一個非常簡單的數(shù)據(jù)集。那么該數(shù)據(jù)集是什么內(nèi)容呢?其實就是一些手寫的阿拉伯數(shù)字(0到9十個數(shù)字)。

NIST在制作數(shù)據(jù)集的時候還是很認真的。數(shù)據(jù)集中的訓練集 (training set) 由來自 250 個不同人手寫的數(shù)字構(gòu)成,其中 50%是高中學生,50% 來自人口普查局 (the Census Bureau) 的工作人員。測試集(test set) 也是同樣比例的手寫數(shù)字數(shù)據(jù)。

如何下載MNIST數(shù)據(jù)集

MNIST數(shù)據(jù)集可從其官網(wǎng)(http://yann.lecun.com/exdb/mnist/ )下載,由于是國外網(wǎng)站,下載可能比較慢。它包含了四個部分:

  • 訓練集圖片:train-images-idx3-ubyte.gz (9.9 MB, 解壓后 47 MB, 包含 60,000 個樣本)
  • 訓練集標簽:train-labels-idx1-ubyte.gz (29 KB, 解壓后 60 KB, 包含 60,000 個標簽)
  • 測試集圖片:t10k-images-idx3-ubyte.gz (1.6 MB, 解壓后 7.8 MB, 包含 10,000 個樣本)
  • 測試集標簽:t10k-labels-idx1-ubyte.gz (5KB, 解壓后 10 KB, 包含 10,000 個標簽)

上述包含兩種類型的內(nèi)容,一種是圖片,另外一種是標簽,圖片與標簽一一對應(yīng)。但是這里的圖片并非是我們平時看到的圖片文件,而是一個二進制的文件。該數(shù)據(jù)集以一個二進制的形式對6萬個圖片進行了存儲。標簽則是圖片對應(yīng)的真是數(shù)字。

如下圖所示,本文將數(shù)據(jù)集下載到本地,并且解壓后的結(jié)果。為了便于對比,這里面包含原始的壓縮包和解壓后的文件。

數(shù)據(jù)集的格式簡析

大家已經(jīng)發(fā)現(xiàn),壓縮包解壓后并非一個個的圖片,而是每個壓縮包對應(yīng)著一個獨立的問題。而在這個文件中存儲著上萬個圖片或者標簽的信息。那么這些信息是如何存儲在這個文件當中的呢?

其實MNIST的官網(wǎng)給出了詳細的描述。以訓練集的圖片文件為例,官網(wǎng)給出的文件格式描述如下:

從上圖可以看出,前4個32位數(shù)是該訓練集的描述信息。其中第一個是魔數(shù),為固定值0x0803;第二個是圖片的數(shù)量,0xea60,也就是60000;第三個和第四個是圖片的大小,也就是圖片是28*28像素。下面則是以一個字節(jié)來描述每個像素。由于該文件中以一個字節(jié)來描述一個像素,可以知道像素的值可以是從0到255。其中0表示白色,而255表示黑色。

標簽文件的格式與圖片文件的類似。前面有兩個32位數(shù),其中第一個是魔數(shù),固定值0x0801;第二個用于描述標簽的數(shù)量。接下來的數(shù)據(jù)是每個標簽的值,用一個字節(jié)表示。這里表示值的范圍是

對應(yīng)實際訓練集的標簽文件的數(shù)據(jù)如下所示??梢钥闯雠c上述格式的描述是一致的。另外,我們可以看出,對應(yīng)該標簽集,前面幾張圖片表示的數(shù)字分別應(yīng)該是5,0,4,1等等。這里大家記一下,后面會用到。

關(guān)于數(shù)據(jù)集的文件格式我們了解了,下面我們實際操作一下。

數(shù)據(jù)集的可視化處理

知道上述數(shù)據(jù)的存儲格式后,我們就可以對數(shù)據(jù)進行解析了。比如下面本文實現(xiàn)了一個小程序,用于解析該圖片集合中的某個圖片,并得到可視化結(jié)果。當然,其實我們可以根據(jù)標簽集合的值知道圖片是什么,這里只是一個實驗。最終結(jié)果是以一個文本文件存儲的,用字符“Y”表示筆跡,字符“0”表示背景色。具體程序代碼很簡單,本文不再贅述。

# -*- coding: UTF-8 -*-
def trans_to_txt(train_file, txt_file, index):

with open(train_file, 'rb') as sf:
with open(txt_file, "w") as wf:
offset = 16 + (28*28*index)
cur_pos = offset
count = 28*28
strlen = 1
out_count = 1
while cur_pos < offset+count:
sf.seek(cur_pos)
data = sf.read(strlen)
res = int(data[0])

#雖然在數(shù)據(jù)集中像素是1-255表示顏色,這里簡化為Y
if res > 0 :
wf.write(" Y ")
else:
wf.write(" 0 ")

#由于圖片是28列,因此在此進行換行
if out_count % 28 == 0 :
wf.write("\n")

cur_pos += strlen
out_count += 1

trans_to_txt("../data/train-images.idx3-ubyte", "image.txt", 0)

我們運行上述代碼,可以得到一個名為image.txt的文件。可以看到該文件的內(nèi)容如下。其中紅色筆記是后面添加了,主要是為看的清楚一些。從圖中內(nèi)容可以看出,這個其實就是手寫的“5”。

前面我們通過原生的Python接口對數(shù)據(jù)集進行了可視化的解析。Python有很多已經(jīng)實現(xiàn)好的庫函數(shù),因此我們可以通過一個庫函數(shù)簡化上述功能。

基于第三方庫解析數(shù)據(jù)

采用原生的Python接口實現(xiàn)起來略顯復雜。我們知道Python有很多第三方庫,因此我們可以借助第三方庫來實現(xiàn)對數(shù)據(jù)集的解析和展示,具體代碼如下。

# -*- coding: utf-8 -*-
import os
import struct
import numpy as np

# 讀取數(shù)據(jù)集,以二維數(shù)組的方式返回圖片信息和標簽信息
def load_mnist(path, kind='train'):
# 從指定目錄加載數(shù)據(jù)集
labels_path = os.path.join(path,
'%s-labels.idx1-ubyte'
% kind)
images_path = os.path.join(path,
'%s-images.idx3-ubyte'
% kind)
with open(labels_path, 'rb') as lbpath:
magic, n = struct.unpack('>II',
lbpath.read(8))
labels = np.fromfile(lbpath,
dtype=np.uint8)

with open(images_path, 'rb') as imgpath:
#解析圖片信息,存儲在images中
magic, num, rows, cols = struct.unpack('>IIII',
imgpath.read(16))
images = np.fromfile(imgpath,
dtype=np.uint8).reshape(len(labels), 784)

return images, labels

# 在終端打印某個圖片的數(shù)據(jù)信息
def print_image(data, index):
idx = 0;
count = 0;
for item in data[index]:
if count % 28 == 0:
print("")

if item > 0:
print("\033[7;31mY \033[0m", end="")
else:
print("0 ", end="")

count += 1

def main():
cur_path = os.getcwd()
cur_path = os.path.join(cur_path, "..\data")
imgs, labels = load_mnist(cur_path)
print_image(imgs, 0)


if __name__ == "__main__":
main()

上述代碼中分為兩步,第一步是將數(shù)據(jù)集解析到數(shù)組中,第二步是對數(shù)組中的某個圖片進行顯示。這里顯示也是通過文本的方式程序,只不過不是存儲在文件中,而是打印在終端。比如我們依然打印第一個圖片,其效果如下:

上述結(jié)果的呈現(xiàn)只是通過字符來模擬圖片。其實我們可以借助第三方庫實現(xiàn)更加完美的圖片呈現(xiàn)。接下來我們介紹一下如何通過matplotlib庫來呈現(xiàn)圖片。這個庫非常有用,后續(xù)還會接觸到這個庫。

我們實現(xiàn)一個

def show_image(data, index):
fig, ax = plt.subplots(nrows=1, ncols=1, sharex=True, sharey=True, )

img = data[0].reshape(28, 28)
ax.imshow(img, cmap='Greys', interpolation='nearest')

ax.set_xticks([])
ax.set_yticks([])
plt.tight_layout()
plt.show()

此時可以看到

實現(xiàn)上述功能的時候可能會缺少一些第三方庫,比如matplotlib等。此時需要我們手動進行安裝,具體方法如下:

pip install matplotlib -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

基于TensorFlow的數(shù)據(jù)解析

MNIST是如此出名,以至于TensorFlow已經(jīng)對其進行了支持。因此,我們可以通過TensorFlow對其進行加載和解析。下面我們給出用TensorFlow實現(xiàn)的代碼。

# -*- coding: utf-8 -*-
from tensorflow.examples.tutorials.mnist import input_data
import pylab

def show_mnist():
# 通過TensorFlow庫解析數(shù)據(jù)
mnist = input_data.read_data_sets("../data", one_hot=True)
im = mnist.train.images[0]
im = im.reshape(28 ,28)
# 進行繪圖
pylab.imshow(im, cmap='Greys', interpolation='nearest')
pylab.show()

if __name__ == "__main__":
show_mnist()

該代碼實現(xiàn)的最終效果與上一個實例一致,這里不再贅述。

責任編輯:華軒 來源: 今日頭條
相關(guān)推薦

2021-02-22 10:59:43

人工智能機器學習深度學習

2021-03-30 13:45:00

人工智能

2022-03-30 14:30:34

人工智能機器學習模型

2021-07-27 13:30:25

人工智能機器學習深度學習

2018-05-11 14:34:24

人工智能機器學習深度學習

2020-11-10 16:03:06

人工智能編程語言Java

2018-07-12 11:11:46

人工智能AI術(shù)語

2017-08-01 14:51:45

人工智能大數(shù)據(jù)深度學習

2020-12-24 13:52:36

人工智能自然語言處理NLP

2017-07-12 08:57:38

聊天機器人開發(fā)語音機器人

2021-11-05 09:56:36

人工智能AI指數(shù)

2022-03-15 16:06:39

人工智能AI

2020-03-11 16:07:12

人工智能AI技術(shù)

2015-10-10 09:32:24

機器學習人工智能

2017-07-13 10:50:22

人工智能機器學習認知計算

2021-04-07 10:52:35

人工智能深度學習

2021-04-07 10:48:45

人工智能深度學習

2022-06-20 11:05:58

通用人工智能機器人

2017-05-04 20:45:07

人工智能數(shù)據(jù)科學機器學習

2024-02-25 22:23:46

人工智能
點贊
收藏

51CTO技術(shù)棧公眾號