MariaDB
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> MariaDB

Phần 2:Phân loại hình ảnh với Máy chủ MariaDB và TensorFlow - Hướng dẫn

Định dạng dữ liệu cho TensorFlow

Phần 1 của loạt bài blog này đã trình bày những ưu điểm của việc sử dụng cơ sở dữ liệu quan hệ để lưu trữ và thực hiện khám phá dữ liệu về hình ảnh bằng cách sử dụng các câu lệnh SQL đơn giản. Trong hướng dẫn này, phần 2, dữ liệu được sử dụng trong phần một sẽ được truy cập từ cơ sở dữ liệu Máy chủ MariaDB và được chuyển đổi thành các cấu trúc dữ liệu mà TensorFlow cần. Kết quả của việc áp dụng mô hình để phân loại hình ảnh mới sẽ được lưu trữ trong một bảng quan hệ để phân tích thêm.

Đây là hướng dẫn nhanh về chương trình TensorFlow với các chi tiết được mô tả khi chúng ta tiếp tục. Nếu bạn chưa quen với các khái niệm cơ bản, thì một nơi tốt để bắt đầu là hướng dẫn TensorFlow này, “Phân loại cơ bản:Phân loại hình ảnh của quần áo”. Một số ví dụ và mã trong hướng dẫn được sử dụng tại đây.

Các gói bổ sung cần thiết

Một số gói bổ sung cần thiết để xây dựng và đào tạo mô hình phân loại ảnh:

  1. Dưa chua triển khai các giao thức nhị phân để tuần tự hóa và hủy tuần tự hóa cấu trúc đối tượng Python.
  2. NumPy cung cấp hỗ trợ cho các mảng và ma trận lớn, nhiều chiều, cùng với các hàm toán học cấp cao để hoạt động trên các mảng này.
  3. TensorFlow là một thư viện Python để tính toán số nhanh. Đây là một thư viện nền tảng có thể được sử dụng để tạo các mô hình Học sâu trực tiếp hoặc bằng cách sử dụng các thư viện trình bao bọc giúp đơn giản hóa quy trình được xây dựng trên TensorFlow.
  4. Keras là một thư viện mạng thần kinh mã nguồn mở được viết bằng 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  

Lấy hình ảnh

Khi các gói đã được nhập, bước tiếp theo là truy xuất hình ảnh đào tạo từ cơ sở dữ liệu và chia dữ liệu thành hai numpy mảng. Đầu tiên, chúng ta cần khởi tạo mảng ảnh huấn luyện (train_images) và nhãn huấn luyện (train_labels). Vì chúng ta đã vector hóa các hình ảnh, chúng ta có thể sử dụng thuộc tính img_vector để điền vào mảng train_images bằng câu lệnh SQL bên dưới.

 # Khởi tạo mảng numpystrain_images =np.empty ((60000,28,28), dtype ='uint8') train_labels =np.empty ((60000), dtype ='uint8') # Lấy hình ảnh huấn luyện từ databasesql ="SELECT 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 () # Điền các mảng numpy. row [2] chứa chỉ mục hình ảnh cho hàng trong kết quả:nparray =pickle.loads (row [1]) train_images [row [2]] =nparraytrain_labels [row [2]] =row [0] 

Theo cách tương tự, các hình ảnh để thử nghiệm có thể được truy xuất từ ​​cơ sở dữ liệu. numpy mảng được sử dụng trong trường hợp này là test_images và test_labels. Trong trường hợp này, dữ liệu thử nghiệm là 10.000 hình ảnh ở độ phân giải 28 × 28 pixel.

 # Khởi tạo numpy arraystest_images =np.empty ((10000,28,28), dtype ='uint8') test_labels =np.empty ((10000), dtype ='uint8') # Lấy hình ảnh thử nghiệm từ databasesql ="SELECT 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 () # Điền các mảng numpy. row [2] chứa chỉ mục hình ảnh cho hàng trong kết quả:nparray =pickle.loads (row [1]) test_images [row [2]] =nparraytest_labels [row [2]] =row [0] 

Cuối cùng, mỗi hình ảnh được ánh xạ tới một nhãn duy nhất. Tên nhãn được lưu trữ trong bảng danh mục và được tải vào mảng class_names:

 sql ="CHỌN class_name TỪ danh mục" cur.execute (sql) class_names =cur.fetchall () 

Xử lý trước dữ liệu

Dữ liệu phải được xử lý trước trước khi huấn luyện mạng. Nếu bạn kiểm tra hình ảnh đầu tiên trong tập hợp đào tạo, bạn sẽ thấy rằng các giá trị pixel nằm trong khoảng từ 0 đến 255:

 plt.figure () plt.imshow (train_images [0]) plt.colorbar () plt.grid (Sai) plt.show () 


ở trên:hình ảnh từ tập dữ liệu fashion_mnist

Trước khi cung cấp hình ảnh cho mô hình mạng nơ ron, các giá trị cần được chia tỷ lệ thành phạm vi từ 0 đến 1. Để làm như vậy, hãy chia các giá trị cho 255. Điều quan trọng là tập huấn luyện và tập thử nghiệm phải được xử lý trước theo cùng một cách .

Bạn có thể sử dụng matplotlib để hiển thị 25 hình ảnh đầu tiên để xác minh dữ liệu ở định dạng chính xác và sẵn sàng để xây dựng và đào tạo mạng:

 train_images =train_images / 255.0test_images =test_images / 255.0plt.figure (figsize =(10,10)) cho tôi trong phạm vi (25):plt.subplot (5,5, i + 1) plt.xticks ([ ]) plt.yticks ([]) plt.grid (Sai) plt.imshow (train_images [i], cmap =plt.cm.binary) plt.xlabel (class_names [train_labels [i]]) plt.show () 


ở trên:hình ảnh từ tập dữ liệu fashion_mnist

Xây dựng mô hình

Sau khi dữ liệu đã được xử lý trước thành hai tập con, bạn có thể tiến hành đào tạo mô hình. Quá trình này đòi hỏi phải "cung cấp" cho thuật toán với dữ liệu huấn luyện. Thuật toán sẽ xử lý dữ liệu và xuất ra một mô hình có thể tìm thấy giá trị đích (thuộc tính) trong dữ liệu mới - nghĩa là phân loại hình ảnh được hiển thị cho mạng nơ-ron.

Hầu hết các mạng nơ-ron học sâu được tạo ra bằng cách xâu chuỗi các lớp đơn giản lại với nhau.

Lớp đầu tiên trong mạng chuyển đổi định dạng hình ảnh từ mảng hai chiều (28 x 28 pixel) thành mảng một chiều (28 * 28 =784 pixel). Lớp này không có tham số nào để học; nó chỉ định dạng lại dữ liệu.

Sau khi các pixel được làm phẳng, mạng bao gồm hai lớp được kết nối hoàn chỉnh cần được kích hoạt. Trong mạng nơ ron, hàm kích hoạt chịu trách nhiệm chuyển đổi đầu vào có trọng số tổng từ nút thành kích hoạt nút hoặc đầu ra cho đầu vào đó.

Lớp dày đặc đầu tiên có 128 nút (hoặc nơ-ron) và đang sử dụng phương pháp kích hoạt Đơn vị tuyến tính chỉnh lưu (ReLU). Hàm kích hoạt tuyến tính được chỉnh lưu là một hàm tuyến tính từng đoạn sẽ xuất đầu vào trực tiếp nếu nó là dương, nếu không, nó sẽ xuất ra bằng không.

Lớp thứ hai (và cuối cùng) là lớp softmax 10 nút. Một hàm softmax xuất ra một vectơ đại diện cho các phân phối xác suất của một danh sách các kết quả tiềm năng. Nó trả về một mảng gồm 10 điểm xác suất có tổng bằng 1. Mỗi nút chứa một điểm cho biết xác suất hình ảnh hiện tại thuộc về một trong 10 lớp.

Hầu hết các lớp, chẳng hạn như tf.keras.layers.Dense, có các tham số được học trong quá trình đào tạo.

 model =keras.Sequential ([keras.layers.Flatten (input_shape =(28, 28)), keras.layers.Dense (128, kích hoạt ='relu'), keras.layers.Dense (10, kích hoạt ='softmax')]) 

Biên dịch mô hình

Bước biên dịch mô hình được sử dụng để thêm một vài cài đặt khác trước khi nó sẵn sàng để đào tạo. Trong trường hợp này, các cài đặt sau được bật.

  1. Trình tối ưu hoá — Cập nhật mô hình dựa trên dữ liệu mà nó thấy và chức năng mất mát của nó (xem bên dưới).
  2. Hàm mất mát — Đo lường mức độ chính xác của mô hình trong quá trình đào tạo. Bạn muốn giảm thiểu chức năng này để “điều khiển” mô hình đi đúng hướng.
  3. Chỉ số — Giám sát các bước đào tạo và thử nghiệm. Ví dụ sau sử dụng độ chính xác, phần hình ảnh được phân loại chính xác.
 model.compile (Optimizer ='adam', loss ='precision_categorical_crossentropy', metrics =['precision']) 

Đào tạo người mẫu

Việc đào tạo mô hình mạng nơ-ron yêu cầu các bước sau.

  1. Cung cấp dữ liệu đào tạo vào mô hình.
  2. Mô hình học cách liên kết hình ảnh và nhãn.
  3. Đưa ra dự đoán về một tập hợp thử nghiệm.
  4. Xác minh rằng các dự đoán khớp với các nhãn từ mảng test_labels.

Để bắt đầu đào tạo, hãy gọi phương thức model.fit — được gọi như vậy vì nó “khớp” mô hình với dữ liệu đào tạo:

 model.fit (train_images, train_labels, epochs =10) Đào tạo trên 60000 mẫuEpoch 1/1060000/60000 [==============================] - 5s 83usd / mẫu - hao hụt:0,4964 - độ chính xác:0,8236Epoch 2/1060000/60000 [===============================] - 4 giây 65usd / mẫu - hao hụt:0,3735 - độ chính xác:0,8642Epoch 3/1060000/60000 [=========================================] - 3s 55usd / mẫu - hao hụt:0,3347 - độ chính xác:0,8773Epoch 4/1060000/60000 [=================================] - 3s 56usd / mẫu - hao hụt:0,3106 - độ chính xác:0,8861Epoch 5/1060000/60000 [==============================] - 3 giây 58us / mẫu - mất:0,2921 - chính xác:0,8924 giây - mất:0,2928 - acquy - ETA:0 giây - mất:0,2925 - độ chính xácEpoch 6/1060000/60000 [==============================] - 3 giây 57usd / mẫu - hao hụt:0,2796 - độ chính xác:0,8969 giâyEpoch 7/1060000/60000 [==============================] - 4 giây 70usd / mẫu - hao hụt:0,2659 - độ chính xác:0,9007Epoch 8/1060000/60000 [==============================] - 4 giây 61usd / mẫu - hao hụt:0,2548 - độ chính xác:0,9042Epoch 9/1060000/60000 [ ==============================] - 4 giây 61usd / mẫu - hao hụt:0,2449 - độ chính xác:0,9084Epoch 10/1060000/60000 [==============================] - 5 giây 76usd / mẫu - hao hụt:0,2358 - độ chính xác:0,9118 

Vào cuối mỗi kỷ nguyên, mạng nơ-ron được đánh giá dựa trên tập xác thực. Đây là những gì liên quan đến sự mất mát và độ chính xác.

Đánh giá độ chính xác và dự đoán

Để ước tính độ chính xác tổng thể của mô hình, hãy tính giá trị trung bình của tất cả mười lần xuất hiện của giá trị độ chính xác, trong trường hợp này là 88%.

Sau đó, thực thi model.evaluate trên bộ kiểm tra để có được độ chính xác dự đoán của mạng nơ-ron được đào tạo trên dữ liệu chưa từng thấy trước đó.

 test_loss, test_acc =model.evaluate (test_images, test_labels, verbose =2) 10000/1 - 0 giây - mất:0,2766 - độ chính xác:0,8740 

Tập dữ liệu kiểm tra kém chính xác hơn tập dữ liệu đào tạo. Trong trường hợp này, khoảng cách giữa độ chính xác của quá trình huấn luyện và độ chính xác của bài kiểm tra thể hiện sự quá mức. Ngược lại là trang bị kém. Nếu bạn muốn tìm hiểu thêm về chủ đề này, tôi khuyên bạn nên chọn Overfitting so với Underfitting:A Conceptual Explanation của Will Koehrsen.

Tại thời điểm này, chúng tôi có thể đưa ra một số dự đoán về hình ảnh trong tập dữ liệu đào tạo của mình.

Dự đoán
 =model.p Dự đoán (test_images) [0] mảng ([1.90860412e-08, 8.05085235e-11, 1.56402713e-08, 1.66699390e-10.7.86950158e-11, 4.33062996e-06, 2.49049066e -08, 1.20656565e-02,3.80084719e-09, 9.87929940e-01], dtype =float32) 

Đầu ra của model.p dự đoán là một mảng 10 số với xác suất của một cá thể thuộc mỗi lớp. Lưu trữ các kết quả trong cơ sở dữ liệu MariaDB để phân tích và báo cáo thêm là một ý kiến ​​hay. Dưới đây là ví dụ về cách lặp lại trên mảng dự đoán để tạo một bộ giá trị và sau đó chèn nó vào dự đoán_ kết quả bảng.

 sql ="CHÈN VÀO dự đoán_results (img_idx, img_use, T_shirt_Top, Trouser, Pullover, Dress, Coat, Sandal, Áo sơ mi, Sneaker, Túi, Ankle_boot, nhãn) VALUES (% s,% s,% s,% s, % s,% s,% s,% s,% s,% s,% s,% s,% s); "i =0cho hàng trong các dự đoán:insert_tuple =(str (i), str (2), str (row [0]), str (row [1]), str (row [2]), str (row [3]), str (row [4]), str (row [5]), str (row [6]), str (row [7]), str (row [8]), str (row [9]), str (test_labels [i])) cur.execute (sql, insert_tuple) conn.commit () i + =1 

Một lần nữa, một câu lệnh SQL đơn giản có thể được sử dụng để xác minh dữ liệu đã được tải.

 sql ="CHỌN T_shirt_Top, Quần, Áo chui đầu, Váy, Áo khoác, Sandal, Áo sơ mi, Giày thể thao, Túi, Cổ chân_boot, class_name làm 'Nhãn kiểm tra' read_sql (sql, conn)) 

Túi
T_shirt_Top Quần Áo chui đầu Váy Áo khoác Sandal Áo sơ mi Giày thể thao Ankle_boot Nhãn kiểm tra
0,00001 0,0 0,997912 0,0 0,001267 0,0 0.00081 0,0 0,0 0,0 Áo chui đầu

Dự đoán âm mưu

Một số hàm vẽ biểu đồ để hiển thị các dự đoán được định nghĩa bên dưới (Hàm vẽ đồ thị).

Hãy truy xuất hình ảnh mới từ bộ thử nghiệm và hiển thị phân loại mạng nơron dựa trên xác suất dự đoán.

 sql ="SELECT img_idx, label FROM suggest_results WHERE img_idx =1" cur.execute (sql) result =cur.fetchone () plt.figure (figsize =(6,3)) plt.subplot (1,2, 1) plot_image (kết quả [0], dự đoán [result [0]], test_labels, test_images) plt.subplot (1,2,2) plot_value_array (kết quả [0], dự đoán [kết quả [0]], test_labels) plt. show () 


ở trên:hình ảnh từ tập dữ liệu fashion_mnist

Trong trường hợp này, mô hình có thể phân loại hình ảnh một cách chính xác với độ chính xác 100%. Tiếp theo, hãy thực hiện một truy vấn để lấy 15 hình ảnh đầu tiên từ bộ thử nghiệm và phân loại chúng.

 sql ="SELECT img_idx, nhãn TỪ DỰ đoán_results LIMIT 15" num_rows =5num_cols =3plt.figure (figsize =(2 * 2 * num_cols, 2 * num_rows)) cur.execute (sql) result =cur.fetchall () cho hàng trong kết quả:plt.subplot (num_rows, 2 * num_cols, 2 * row [0] +1) plot_image (row [0], dự đoán [row [0]], test_labels, test_images) plt.subplot (num_rows, 2 * num_cols, 2 * row [0] +2) plot_value_array (row [0], dự đoán [row [0]], test_labels) plt.tight_layout () plt.show () 


ở trên:hình ảnh từ tập dữ liệu fashion_mnist

Như bạn thấy, sẽ có trường hợp mô hình có thể bị sai như được hiển thị ở hàng cuối cùng, cột bên trái. Trong trường hợp này, giày thể thao được phân loại là sandal (màu đỏ).

Tóm tắt

Mặc dù việc tích hợp giữa TensorFlow và Máy chủ MariaDB rất dễ dàng, nhưng lợi ích từ việc tích hợp này là rất đáng kể:

  • Việc sử dụng dữ liệu quan hệ trong học máy có thể làm giảm độ phức tạp của việc triển khai. Các nhà khoa học dữ liệu và Kỹ sư dữ liệu đều có thể sử dụng một ngôn ngữ chung để thực hiện các nhiệm vụ tìm hiểu và thu thập dữ liệu.
  • Hiệu quả đạt được khi truy cập, cập nhật, chèn, thao tác và sửa đổi dữ liệu có thể đẩy nhanh thời gian đưa ra thị trường.
  • Khả năng lưu trữ kết quả của mô hình trở lại cơ sở dữ liệu cho phép người dùng cuối và nhà phân tích thực hiện các truy vấn và báo cáo bằng cách sử dụng các công cụ báo cáo thân thiện như Tableau.

Giấy phép MIT

Tập dữ liệu Fashion MNIST (fashion_mnist) được blog này tận dụng được cấp phép theo Giấy phép MIT, Bản quyền © 2017 Zalando SE, https://tech.zalando.com

Mã nguồn được blog này tận dụng được điều chỉnh từ hướng dẫn "Phân loại cơ bản:Phân loại hình ảnh quần áo" được cấp phép theo Giấy phép MIT, Bản quyền (c) 2017 François Chollet.

Theo đây, quyền được cấp miễn phí cho bất kỳ người nào có được bản sao của phần mềm này và các tệp tài liệu liên quan (“Phần mềm”), để giao dịch trong Phần mềm mà không bị hạn chế, bao gồm nhưng không giới hạn các quyền sử dụng, sao chép, sửa đổi, hợp nhất , xuất bản, phân phối, cấp phép lại và / hoặc bán các bản sao của Phần mềm và cho phép những người được cung cấp Phần mềm làm như vậy, tuân theo các điều kiện sau:

Thông báo bản quyền ở trên và thông báo cấp phép này sẽ được bao gồm trong tất cả các bản sao hoặc các phần quan trọng của Phần mềm.

PHẦN MỀM ĐƯỢC CUNG CẤP “NGUYÊN TRẠNG”, KHÔNG BẢO ĐẢM BẤT KỲ HÌNH THỨC NÀO, RÕ RÀNG HOẶC NGỤ Ý, BAO GỒM NHƯNG KHÔNG GIỚI HẠN ĐẢM BẢO VỀ KHẢ NĂNG LAO ĐỘNG, PHÙ HỢP VỚI MỤC ĐÍCH CỤ THỂ VÀ KHÔNG HỢP LỆ. TRONG MỌI TRƯỜNG HỢP SẼ KHÔNG CÓ TÁC GIẢ HOẶC CHỦ BẢN QUYỀN CHỊU TRÁCH NHIỆM VỀ BẤT KỲ KHIẾU NẠI, THIỆT HẠI HOẶC TRÁCH NHIỆM PHÁP LÝ KHÁC NÀO TRONG MỘT HÀNH VI HỢP ĐỒNG, KHAI THÁC HOẶC CÁCH KHÁC, PHÁT SINH TỪ, NGOÀI HOẶC KẾT NỐI VỚI PHẦN MỀM HOẶC VIỆC SỬ DỤNG HOẶC KINH DOANH KHÁC TRONG PHẦN MỀM.

Tài liệu tham khảo

Chuyển đổi hình ảnh của chính mình thành hình ảnh của MNIST
matplotlib:Hướng dẫn bằng hình ảnh
5 cách AI đang chuyển đổi trải nghiệm khách hàng
Số hóa đang tái tạo lại hoạt động kinh doanh
Phân loại hình ảnh là gì?
Giới thiệu về Python Thư viện học sâu TensorFlow

Các chức năng vẽ đồ thị

 def plot_image (i, domains_array, true_label, img):dự đoán_array, true_label, img =domains_array, true_label [i], img [i] plt.grid (False) plt.xticks ([]) plt.yticks ([ ]) plt. :2.0f}% ({}) ". Format (class_names [Pred_label], 100 * np.max (Pred_array), class_names [true_label]), color =color) def plot_value_array (i, dự đoán_array, true_label):dự đoán_array, true_label =dự đoán_array, true_label [i] plt.grid (Sai) plt.xticks (phạm vi (10)) plt.yticks ([]) thisplot =plt.bar (phạm vi (10), dự đoán_array, color ="# 777777") plt .ylim ([0, 1]) secure_label =np.argmax (suggest_array) thisplot [suggest_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. Cách hoạt động của nhà điều hành Modulo trong MariaDB

  2. 8 cách để thêm phút vào ngày giờ trong MariaDB

  3. Trả lại số ngày trong tháng bằng MariaDB

  4. Cách TIME_TO_SEC () hoạt động trong MariaDB

  5. Nhập phân vùng InnoDB trong MariaDB 10.0 / 10.1