MariaDB
 sql >> Teknologi Basis Data >  >> RDS >> MariaDB

Bagian 2:Klasifikasi Gambar dengan MariaDB Server dan TensorFlow – sebuah Tutorial

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:

  1. Acar mengimplementasikan protokol biner untuk membuat serialisasi dan de-serialisasi struktur objek Python.
  2. NumPy menyediakan dukungan untuk array dan matriks multidimensi yang besar, bersama dengan fungsi matematika tingkat tinggi untuk beroperasi pada array ini.
  3. 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.
  4. 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.2 

Ambil 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_mnist

Sebelum 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_mnist

Membangun 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.

  1. Pengoptimal—Memperbarui model berdasarkan data yang dilihatnya dan fungsi kehilangannya (lihat di bawah).
  2. Fungsi kerugian—Mengukur seberapa akurat model selama pelatihan. Anda ingin meminimalkan fungsi ini untuk "mengarahkan" model ke arah yang benar.
  3. 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.

  1. Masukkan data pelatihan ke model.
  2. Model belajar mengasosiasikan gambar dan label.
  3. Buat prediksi tentang set pengujian.
  4. 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,9118

Pada 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.8740

Dataset 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 +=1

Sekali 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')

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memahami Indeks di MySQL:Bagian Ketiga

  2. Memulihkan instance mySQL dari akun pengguna lain (macOS)

  3. HA untuk MySQL dan MariaDB - Membandingkan Replikasi Master-Master dengan Galera Cluster

  4. Konektor MariaDB/Python Beta Sekarang Tersedia

  5. Bagaimana REPEAT() Bekerja di MariaDB