Mempelajari kecerdasan buatan sudah semestinya memerlukan beberapa set data Contohnya, kecerdasan buatan untuk mengenal pasti pornografi memerlukan beberapa gambar yang serupa. Kecerdasan buatan untuk pengecaman pertuturan dan korpus amat diperlukan. Pelajar yang baru mengenali kecerdasan buatan sering bimbang tentang set data. Hari ini kami akan memperkenalkan set data yang sangat mudah, tetapi sangat berguna, iaitu MNIST. Set data ini sangat sesuai untuk kita belajar dan mengamalkan algoritma berkaitan kecerdasan buatan.
Dataset MNIST ialah set data yang sangat mudah yang dihasilkan oleh Institut Piawaian dan Teknologi Kebangsaan (NIST). Jadi apakah set data ini? Ia sebenarnya beberapa angka Arab tulisan tangan (sepuluh nombor dari 0 hingga 9).
NIST masih sangat serius semasa menghasilkan set data. Set latihan dalam set data terdiri daripada digit tulisan tangan daripada 250 orang yang berbeza, 50% daripadanya adalah pelajar sekolah menengah dan 50% daripadanya adalah kakitangan dari Biro Banci. Set ujian juga adalah perkadaran yang sama bagi data digit tulisan tangan.
Set data MNIST boleh dimuat turun dari laman web rasminya (http://yann.lecun.com/exdb/mnist/). laman web asing, muat turun mungkin sukar perlahan. Ia mengandungi empat bahagian:
Di atas mengandungi dua jenis kandungan, satu adalah gambar dan satu lagi adalah label Gambar dan label sesuai satu dengan satu. Tetapi gambar di sini bukanlah fail gambar yang biasa kita lihat, tetapi fail binari. Set data ini menyimpan 60,000 imej dalam format binari. Label adalah nombor sebenar yang sepadan dengan gambar.
Seperti yang ditunjukkan dalam rajah di bawah, artikel ini memuat turun set data secara setempat dan menyahmampat hasilnya. Untuk memudahkan perbandingan, pakej mampat asal dan fail nyahmampat disertakan.
Semua orang telah mendapati bahawa selepas penyahmampatan, pakej yang dimampatkan bukanlah gambar, tetapi setiap pakej yang dimampatkan sepadan dengan soalan bebas. Dalam fail ini, maklumat tentang puluhan ribu gambar atau tag disimpan. Jadi bagaimana maklumat ini disimpan dalam fail ini?
Malah, laman web rasmi MNIST memberikan penerangan terperinci. Mengambil contoh fail imej set latihan, penerangan format fail yang diberikan oleh laman web rasmi adalah seperti berikut:
Seperti yang dapat dilihat dari gambar di atas, 4 nombor 32 digit pertama ialah maklumat penerangan set latihan. Yang pertama ialah nombor ajaib, iaitu nilai tetap 0x0803; yang kedua ialah bilangan gambar, 0xea60, iaitu 60000; . Berikut menerangkan setiap piksel dalam satu bait. Memandangkan satu bait digunakan untuk menerangkan piksel dalam fail ini, anda boleh mengetahui bahawa nilai piksel boleh dari 0 hingga 255. Di mana 0 bermaksud putih dan 255 bermaksud hitam.
Format fail tag adalah serupa dengan fail imej. Terdapat dua nombor 32 digit di hadapan, yang pertama ialah nombor ajaib, nilai tetap 0x0801; yang kedua digunakan untuk menerangkan bilangan tag. Data seterusnya ialah nilai setiap teg, diwakili oleh satu bait. Julat nilai yang diwakili di sini ialah
Data fail label yang sepadan dengan set latihan sebenar adalah seperti berikut. Ia dapat dilihat bahawa ia konsisten dengan penerangan format di atas. Di samping itu, kita dapat melihat bahawa sepadan dengan set label ini, nombor yang diwakili oleh gambar sebelumnya hendaklah masing-masing 5, 0, 4, 1, dsb. Ingat di sini, ia akan digunakan kemudian.
Kami tahu tentang format fail set data, mari lakukannya secara praktikal.
Setelah mengetahui format storan data di atas, kami boleh menghuraikan data. Sebagai contoh, artikel berikut melaksanakan program kecil untuk menghuraikan gambar dalam koleksi gambar dan mendapatkan hasil visual. Sudah tentu, kita sebenarnya boleh tahu apa gambar itu berdasarkan nilai set label Ini hanyalah percubaan. Hasil akhir disimpan dalam fail teks, menggunakan aksara "Y" untuk mewakili tulisan tangan dan aksara "0" untuk mewakili warna latar belakang. Kod program khusus adalah sangat mudah dan tidak akan diterangkan secara terperinci dalam artikel ini.
# -*- 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]) #虽然在数据集中像素是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)
Apabila kita menjalankan kod di atas, kita boleh mendapatkan fail bernama image.txt. Anda boleh melihat kandungan fail seperti berikut. Nota merah telah ditambahkan kemudian, terutamanya untuk keterlihatan yang lebih baik. Seperti yang dapat dilihat dari kandungan dalam gambar, ini sebenarnya adalah "5" tulisan tangan.
Terdahulu kami menganalisis set data secara visual melalui antara muka Python asli. Python mempunyai banyak fungsi perpustakaan yang telah dilaksanakan, jadi kita boleh memudahkan fungsi di atas melalui fungsi perpustakaan.
Ia agak rumit untuk dilaksanakan menggunakan antara muka Python asli. Kami tahu bahawa Python mempunyai banyak perpustakaan pihak ketiga, jadi kami boleh menggunakan perpustakaan pihak ketiga untuk menghuraikan dan memaparkan set data Kod khusus adalah seperti berikut.
# -*- coding: utf-8 -*- import os import struct import numpy as np # 读取数据集,以二维数组的方式返回图片信息和标签信息 def load_mnist(path, kind='train'): # 从指定目录加载数据集 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 # 在终端打印某个图片的数据信息 def print_image(data, index): idx = 0; count = 0; for item in data[index]: if count % 28 == 0: print("") if item > 0: print("33[7;31mY 33[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()
Kod di atas dibahagikan kepada dua langkah Langkah pertama ialah menghuraikan set data ke dalam tatasusunan, dan langkah kedua ialah memaparkan gambar tertentu dalam tatasusunan. Paparan di sini juga melalui program teks, tetapi ia tidak disimpan dalam fail, tetapi dicetak pada terminal. Contohnya, jika kita masih mencetak gambar pertama, kesannya adalah seperti berikut:
Pembentangan hasil di atas hanya mensimulasikan gambar melalui aksara. Malah, kita boleh menggunakan perpustakaan pihak ketiga untuk mencapai persembahan imej yang lebih sempurna. Seterusnya, kami memperkenalkan cara mempersembahkan gambar melalui perpustakaan matplotlib. Perpustakaan ini sangat berguna, dan saya akan berhubung dengan perpustakaan ini kemudian.
Kami melaksanakan
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()
Pada masa ini anda dapat melihat bahawa
Sesetengah perpustakaan pihak ketiga mungkin hilang semasa melaksanakan fungsi di atas, seperti matplotlib, dsb. Pada masa ini, kita perlu memasangnya secara manual Kaedah khusus adalah seperti berikut:
pip install matplotlib -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
MNIST sangat terkenal sehingga TensorFlow sudah menyokongnya. Oleh itu, kita boleh memuatkan dan menghuraikannya melalui TensorFlow. Di bawah ini kami memberikan kod yang dilaksanakan dengan TensorFlow.
# -*- coding: utf-8 -*- from tensorflow.examples.tutorials.mnist import input_data import pylab def show_mnist(): # 通过TensorFlow库解析数据 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()
Kesan akhir yang dicapai oleh kod ini adalah sama seperti contoh sebelumnya, jadi saya tidak akan menerangkan butiran di sini.
Atas ialah kandungan terperinci Jika anda ingin mempelajari kecerdasan buatan, anda mesti menguasai set data ini Pengenalan dan penggunaan praktikal MNIST. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!