Memformat Data untuk TensorFlow
Bagian 1 dari seri blog ini menunjukkan keuntungan menggunakan database relasional untuk menyimpan dan melakukan eksplorasi data gambar menggunakan pernyataan SQL sederhana. Dalam tutorial ini, bagian 2, data yang digunakan di bagian satu akan diakses dari database Server MariaDB dan diubah menjadi struktur data yang dibutuhkan oleh TensorFlow. Hasil penerapan model untuk mengklasifikasikan gambar baru akan disimpan dalam tabel relasional untuk analisis lebih lanjut.
Ini adalah tutorial singkat program TensorFlow dengan detail yang dijelaskan saat ini. Jika Anda tidak terbiasa dengan konsep dasar, tempat yang baik untuk memulai adalah tutorial TensorFlow ini, “Klasifikasi dasar:Mengklasifikasikan gambar pakaian“. Beberapa contoh dan kode dalam tutorial digunakan di sini.
Dibutuhkan Paket Tambahan
Beberapa paket tambahan diperlukan untuk membangun dan melatih model klasifikasi citra:
- Acar mengimplementasikan protokol biner untuk membuat serialisasi dan de-serialisasi struktur objek Python.
- NumPy menyediakan dukungan untuk array dan matriks multidimensi yang besar, bersama dengan fungsi matematika tingkat tinggi untuk beroperasi pada array ini.
- TensorFlow adalah pustaka Python untuk komputasi numerik cepat. Ini adalah library dasar yang dapat digunakan untuk membuat model Deep Learning secara langsung atau dengan menggunakan library wrapper yang menyederhanakan proses yang dibangun di atas TensorFlow.
- Keras adalah pustaka jaringan saraf sumber terbuka yang ditulis dengan Python.
import pickleimport numpy as npimport tensorflow as tffrom tensorflow import kerasprint('Tensorflow version:', tf.__version__)print('Numpy version:', np.__version__)Tensorflow version:2.0.0Numpy version:1.16.2Ambil Gambar
Setelah paket diimpor, langkah selanjutnya adalah mengambil gambar pelatihan dari database dan membagi data menjadi dua numpy array. Pertama, kita perlu menginisialisasi larik gambar pelatihan (train_images) dan label pelatihan (train_labels). Karena kita telah membuat vektor gambar, kita dapat menggunakan atribut img_vector untuk mengisi larik train_images dengan pernyataan SQL di bawah ini.
# Inisialisasi numpy arraystrain_images =np.empty((60000,28,28), dtype='uint8')train_labels =np.empty((60000), dtype='uint8')# Ambil gambar pelatihan dari databasesql="PILIH img_label, img_vector, img_idx \FROM tf_images INNER JOIN img_use ON img_use =use_id \WHERE use_name ='Training'"cur.execute(sql)result =cur.fetchall()# Isi array numpy. row[2] berisi indeks gambar untuk baris dalam hasil:nparray =pickle.loads(row[1])train_images[row[2]] =nparraytrain_labels[row[2]] =row[0]Dengan cara yang sama, gambar untuk pengujian dapat diambil dari database. numpy array yang digunakan dalam hal ini adalah test_images dan test_labels. Dalam hal ini, data pengujian adalah 10.000 gambar pada resolusi 28x28 piksel.
# Inisialisasi numpy arraystest_images =np.empty((10000,28,28), dtype='uint8')test_labels =np.empty((10000), dtype='uint8')# Ambil gambar pengujian dari databasesql="PILIH img_label, img_vector, img_idx \FROM tf_images INNER JOIN img_use ON img_use =use_id \WHERE use_name ='Testing'"cur.execute(sql)result =cur.fetchall()# Isi array numpy. row[2] berisi indeks gambar untuk baris dalam hasil:nparray =pickle.loads(row[1])test_images[row[2]] =nparraytest_labels[row[2]] =row[0]Akhirnya, setiap gambar dipetakan ke satu label. Nama label disimpan dalam tabel kategori dan dimuat ke dalam array class_names:
sql="SELECT class_name DARI kategori"cur.execute(sql)class_names =cur.fetchall()Praproses Data
Data harus diproses terlebih dahulu sebelum melatih jaringan. Jika Anda memeriksa gambar pertama dalam set pelatihan, Anda akan melihat bahwa nilai piksel berada dalam kisaran 0 hingga 255:
plt.figure()plt.imshow(train_images[0])plt.colorbar()plt.grid(False)plt.show()
di atas:gambar dari kumpulan data fashion_mnistSebelum memasukkan gambar ke model jaringan saraf, nilainya perlu diskalakan ke rentang 0 hingga 1. Untuk melakukannya, bagi nilai dengan 255. Set pelatihan dan set pengujian harus diproses dengan cara yang sama. .
Anda dapat menggunakan matplotlib untuk menampilkan 25 gambar pertama untuk memverifikasi data dalam format yang benar dan siap untuk membangun dan melatih jaringan:
train_images =train_images / 255.0test_images =test_images / 255.0plt.figure(figsize=(10,10))untuk i dalam rentang(25):plt.subplot(5,5,i+1)plt.xticks([ ])plt.yticks([])plt.grid(False)plt.imshow(train_images[i], cmap=plt.cm.binary)plt.xlabel(class_names[train_labels[i]])plt.show()
di atas:gambar dari kumpulan data fashion_mnistMembangun model
Setelah data diproses menjadi dua subset, Anda dapat melanjutkan dengan pelatihan model. Proses ini memerlukan "memberi makan" algoritma dengan data pelatihan. Algoritme akan memproses data dan mengeluarkan model yang dapat menemukan nilai target (atribut) dalam data baru — yaitu, mengklasifikasikan gambar yang disajikan ke jaringan saraf.
Sebagian besar jaringan saraf pembelajaran mendalam diproduksi dengan menyatukan lapisan-lapisan sederhana.
Lapisan pertama dalam jaringan mengubah format gambar dari larik dua dimensi (28 x 28 piksel) menjadi larik satu dimensi (28 * 28 =784 piksel). Lapisan ini tidak memiliki parameter untuk dipelajari; itu hanya memformat ulang data.
Setelah piksel diratakan, jaringan terdiri dari dua lapisan yang terhubung penuh yang perlu diaktifkan. Dalam jaringan saraf, fungsi aktivasi bertanggung jawab untuk mengubah masukan berbobot yang dijumlahkan dari simpul menjadi aktivasi simpul atau keluaran untuk masukan tersebut.
Lapisan padat pertama memiliki 128 node (atau neuron) dan menggunakan metode aktivasi Rectified Linear Unit (ReLU). Fungsi aktivasi linier terkoreksi adalah fungsi linier sepotong-sepotong yang akan mengeluarkan input secara langsung jika positif, jika tidak, akan menghasilkan nol.
Lapisan kedua (dan terakhir) adalah lapisan softmax 10-node. Fungsi softmax menghasilkan vektor yang mewakili distribusi probabilitas dari daftar hasil potensial. Ini mengembalikan array 10 skor probabilitas yang berjumlah 1. Setiap node berisi skor yang menunjukkan probabilitas bahwa gambar saat ini milik salah satu dari 10 kelas.
Sebagian besar lapisan, seperti tf.keras.layers.Dense, memiliki parameter yang dipelajari selama pelatihan.
model =keras.Sequential([keras.layers.Flatten(input_shape=(28, 28)),keras.layers.Dense(128, activation='relu'),keras.layers.Dense(10, activation='softmax')])Mengkompilasi model
Langkah kompilasi model digunakan untuk menambahkan beberapa pengaturan lagi sebelum siap untuk pelatihan. Dalam hal ini, pengaturan berikut diaktifkan.
- Pengoptimal—Memperbarui model berdasarkan data yang dilihatnya dan fungsi kehilangannya (lihat di bawah).
- Fungsi kerugian—Mengukur seberapa akurat model selama pelatihan. Anda ingin meminimalkan fungsi ini untuk "mengarahkan" model ke arah yang benar.
- Metrik—Pantau langkah-langkah pelatihan dan pengujian. Contoh berikut menggunakan akurasi, bagian dari gambar yang diklasifikasikan dengan benar.
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])Melatih model
Pelatihan model jaringan saraf memerlukan langkah-langkah berikut.
- Masukkan data pelatihan ke model.
- Model belajar mengasosiasikan gambar dan label.
- Buat prediksi tentang set pengujian.
- Verifikasi bahwa prediksi cocok dengan label dari larik test_labels.
Untuk memulai pelatihan, panggil metode model.fit—disebut demikian karena "cocok" dengan model dengan data pelatihan:
model.fit(train_images, train_labels, epochs=10)Latih pada 60000 sampelEpoch 1/1060000/60000 [=============================] - 5s 83us/sampel - kerugian:0,4964 - akurasi:0,8236Epoch 2/1060000/60000 [=============================] - 4s 65us/sampel - kerugian:0,3735 - akurasi:0,8642Epoch 3/1060000/60000 [=============================] - 3s 55us/sampel - kerugian:0,3347 - akurasi:0,8773Epoch 4/1060000/60000 [=============================] - 3s 56us/sampel - kerugian:0,3106 - akurasi:0,8861Epoch 5/1060000/60000 [=============================] - 3s 58us/sample - loss:0.2921 - akurasi:0.8924s - loss:0.2928 - accura - ETA:0s - loss:0.2925 - akurasiEpoch 6/1060000/60000 [=============================] - 3s 57us/sampel - loss:0.2796 - akurasi:0.8969sEpoch 7/1060000/60000 [==============================] - 4s 70us/sampel - kerugian:0.2659 - akurasi:0.9007Epoch 8/1060000/60000 [==============================] - 4s 61us/sampel - loss:0.2548 - akurasi:0.9042Epoch 9/1060000/60000 [ ==============================] - 4s 61us/sampel - loss:0.2449 - akurasi:0.9084Epoch 10/1060000/60000 [==============================] - 5s 76us/sampel - kerugian:0,2358 - akurasi:0,9118Pada akhir setiap zaman, jaringan saraf dievaluasi terhadap set validasi. Inilah yang dimaksud dengan kehilangan dan akurasi.
Evaluasi akurasi dan prediksi
Untuk memperkirakan akurasi keseluruhan model, hitung rata-rata dari sepuluh kemunculan nilai akurasi, dalam hal ini 88%.
Kemudian jalankan model.evaluate pada set pengujian untuk mendapatkan akurasi prediksi jaringan saraf terlatih pada data yang sebelumnya tidak terlihat.
test_loss, test_acc =model.evaluate(test_images, test_labels, verbose=2)10000/1 - 0s - loss:0.2766 - akurasi:0.8740Dataset pengujian kurang akurat dibandingkan dengan dataset pelatihan. Dalam hal ini, kesenjangan antara akurasi pelatihan dan akurasi pengujian ini merepresentasikan overfitting. Kebalikannya adalah underfitting. Jika Anda ingin mempelajari lebih lanjut tentang topik ini, saya sarankan Overfitting vs Underfitting:Penjelasan Konseptual oleh Will Koehrsen.
Pada titik ini, kami dapat membuat beberapa prediksi tentang gambar dalam kumpulan data pelatihan kami.
prediksi =model.predict(test_images)predictions[0]array([1.90860412e-08, 8.05085235e-11, 1.56402713e-08, 1.666999390e-10,7.86950158e-11, 4.33062996e-06, 2.49049066e -08, 1.20656565e-02,3.80084719e-09, 9.87929940e-01], dtype=float32)Keluaran model.predict adalah array dari 10 angka dengan probabilitas sebuah instance milik setiap kelas. Mempertahankan hasil dalam database MariaDB untuk analisis dan pelaporan lebih lanjut adalah ide yang bagus. Di bawah ini adalah contoh cara melakukan iterasi pada larik prediksi untuk membangun sebuah tupel dan kemudian menyisipkannya di prediction_results tabel.
sql ="INSERT INTO predict_results (img_idx, img_use, T_shirt_Top, Trouser, Pullover, Dress, Coat, Sandal, Shirt, Sneaker, Tas, Ankle_boot, label)VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);"i =0untuk baris dalam prediksi:insert_tuple =(str(i), str(2), str (baris[0]), str(baris[1]), str(baris [2]), str(baris[3]), str(baris[4]), str(baris[5]), str(baris [6]), str(baris[7]), str(baris[8]), str(baris[9]), str(test_labels[i]))cur.execute(sql, insert_tuple)conn.commit() saya +=1Sekali lagi, pernyataan SQL sederhana dapat digunakan untuk memverifikasi bahwa data telah dimuat.
sql ="PILIH T_shirt_Top, Trouser, Pullover, Dress, Coat, Sandal, Shirt, Sneaker, Bag, Ankle_boot, class_name as 'Test Label'FROM predict_results GABUNG kategori ON label =class_idx WHERE img_idx =1"display( pd. read_sql(sql,sambungan) )
T_shirt_Top | Celana Panjang | Penarikan | Pakaian | Mantel | Sandal | Kemeja | sepatu kets | Tas | Ankle_boot | Label Uji |
0,00001 | 0.0 | 0.997912 | 0.0 | 0,001267 | 0.0 | 0,00081 | 0.0 | 0.0 | 0.0 | Penarikan |
Merencanakan Prediksi
Beberapa fungsi plot untuk menampilkan prediksi didefinisikan di bawah ini (Fungsi grafik).
Mari ambil gambar baru dari set pengujian dan tampilkan klasifikasi jaringan saraf berdasarkan probabilitas prediksi.
sql ="PILIH img_idx, label FROM predict_results WHERE img_idx =1"cur.execute(sql)result =cur.fetchone()plt.figure(figsize=(6,3))plt.subplot(1,2, 1)plot_image(result[0], prediksi[result[0]], test_labels, test_images)plt.subplot(1,2,2)plot_value_array(result[0], prediksi[result[0]], test_labels)plt. tampilkan()
di atas:gambar dari kumpulan data fashion_mnist
Dalam hal ini, model mampu mengklasifikasikan citra dengan benar dengan akurasi 100%. Selanjutnya mari kita jalankan kueri untuk mengambil 15 gambar pertama dari set pengujian dan mengklasifikasikannya.
sql ="PILIH img_idx, label FROM predict_results LIMIT 15"num_rows =5num_cols =3plt.figure(figsize=(2*2*num_cols, 2*num_rows))cur.execute(sql)result =cur.fetchall() untuk baris dalam hasil:plt.subplot(num_rows, 2*num_cols, 2*row[0]+1)plot_image(row[0], prediksi[row[0]], test_labels, test_images)plt.subplot(num_rows, 2 *num_cols, 2*row[0]+2)plot_value_array(row[0], prediksi[row[0]], test_labels)plt.tight_layout()plt.show()
di atas:gambar dari kumpulan data fashion_mnist
Seperti yang Anda lihat, akan ada contoh di mana model bisa salah seperti yang ditunjukkan pada baris terakhir, kolom kiri. Dalam hal ini, sepatu kets diklasifikasikan sebagai sandal (berwarna merah).
Ringkasan
Meskipun integrasi antara TensorFlow dan MariaDB Server mudah dilakukan, manfaat dari integrasi ini cukup besar:
- Penggunaan data relasional dalam machine learning dapat mengurangi kerumitan implementasi. Ilmuwan Data dan Insinyur Data sama-sama dapat menggunakan bahasa yang sama untuk melakukan perselisihan data dan tugas eksplorasi.
- Efisiensi yang diperoleh saat mengakses, memperbarui, menyisipkan, memanipulasi, dan memodifikasi data dapat mempercepat time-to-market.
- Kemampuan untuk menyimpan hasil model kembali ke database memungkinkan pengguna akhir dan analis untuk mengeksekusi kueri dan laporan menggunakan alat pelaporan yang ramah seperti Tableau.
Lisensi MIT
Kumpulan data Fashion MNIST (fashion_mnist) yang dimanfaatkan oleh blog ini dilisensikan di bawah Lisensi MIT, Hak Cipta © 2017 Zalando SE, https://tech.zalando.com
Kode sumber yang digunakan oleh blog ini diadaptasi dari tutorial “Klasifikasi dasar:Mengklasifikasikan gambar pakaian” yang dilisensikan di bawah Lisensi MIT, Hak Cipta (c) 2017 François Chollet.
Izin dengan ini diberikan, gratis, kepada siapa pun yang memperoleh salinan perangkat lunak ini dan file dokumentasi terkait (“Perangkat Lunak”), untuk menangani Perangkat Lunak tanpa batasan, termasuk namun tidak terbatas pada hak untuk menggunakan, menyalin, memodifikasi, menggabungkan , menerbitkan, mendistribusikan, mensublisensikan, dan/atau menjual salinan Perangkat Lunak, dan untuk mengizinkan orang-orang yang diberikan Perangkat Lunak untuk melakukannya, dengan tunduk pada ketentuan berikut:
Pemberitahuan hak cipta di atas dan pemberitahuan izin ini harus disertakan dalam semua salinan atau sebagian besar Perangkat Lunak.
PERANGKAT LUNAK INI DISEDIAKAN “SEBAGAIMANA ADANYA”, TANPA JAMINAN DALAM BENTUK APA PUN, TERSURAT MAUPUN TERSIRAT, TERMASUK NAMUN TIDAK TERBATAS PADA JAMINAN DIPERDAGANGKAN, KESESUAIAN UNTUK TUJUAN TERTENTU DAN TANPA PELANGGARAN. DALAM KEADAAN APA PUN PENULIS ATAU PEMEGANG HAK CIPTA TIDAK BERTANGGUNG JAWAB ATAS KLAIM, KERUSAKAN ATAU TANGGUNG JAWAB LAINNYA, BAIK DALAM TINDAKAN KONTRAK, KERUSAKAN ATAU LAINNYA, TIMBUL DARI, DARI ATAU SEHUBUNGAN DENGAN PERANGKAT LUNAK ATAU DALAM DEALING LAINNYA PERANGKAT LUNAK.
Referensi
Ubah gambar sendiri menjadi gambar MNIST
matplotlib:Tutorial gambar
5 cara AI mengubah pengalaman pelanggan
Digitalisasi menciptakan kembali bisnis
Apa itu klasifikasi gambar?
Pengantar Python TensorFlow Pustaka Pembelajaran Mendalam
Fungsi grafik
def plot_image(i, prediksi_array, true_label, img):predictions_array, true_label, img =prediksi_array, true_label[i], img[i]plt.grid(False)plt.xticks([])plt.yticks([ ])plt.imshow(img, cmap=plt.cm.binary)predicted_label =np.argmax(predictions_array)if predicted_label ==true_label:color ='blue'else:color ='red'plt.xlabel("{} { :2.0f}% ({})".format(class_names[predicted_label],100*np.max(predictions_array),class_names[true_label]),color=color)def plot_value_array(i, prediksi_array, true_label):predictions_array, true_label =prediksi_array, true_label[i]plt.grid(False)plt.xticks(range(10))plt.yticks([])plot ini =plt.bar(range(10), prediksi_array, color="#777777")plt .ylim([0, 1])predicted_label =np.argmax(predictions_array)thisplot[predicted_label].set_color('red')thisplot[true_label].set_color('blue')