Học sâu với Keras - Chuẩn bị dữ liệu

Trước khi chúng tôi cung cấp dữ liệu vào mạng của mình, dữ liệu đó phải được chuyển đổi sang định dạng theo yêu cầu của mạng. Đây được gọi là chuẩn bị dữ liệu cho mạng. Nó thường bao gồm việc chuyển đổi đầu vào đa chiều thành vectơ một chiều và chuẩn hóa các điểm dữ liệu.

Định hình lại Véc tơ đầu vào

Hình ảnh trong tập dữ liệu của chúng tôi bao gồm 28 x 28 pixel. Nó phải được chuyển đổi thành một vectơ một chiều có kích thước 28 * 28 = 784 để đưa nó vào mạng của chúng tôi. Chúng tôi làm như vậy bằng cách gọireshape phương pháp trên vector.

X_train = X_train.reshape(60000, 784)
X_test = X_test.reshape(10000, 784)

Bây giờ, vectơ đào tạo của chúng tôi sẽ bao gồm 60000 điểm dữ liệu, mỗi điểm bao gồm một vectơ một chiều có kích thước 784. Tương tự, vectơ thử nghiệm của chúng tôi sẽ bao gồm 10000 điểm dữ liệu của một vectơ một chiều có kích thước 784.

Chuẩn hóa dữ liệu

Dữ liệu mà vectơ đầu vào chứa hiện có giá trị rời rạc trong khoảng từ 0 đến 255 - các mức thang màu xám. Bình thường hóa các giá trị pixel này giữa 0 và 1 giúp tăng tốc quá trình đào tạo. Vì chúng ta sẽ sử dụng descent gradient ngẫu nhiên, việc chuẩn hóa dữ liệu cũng sẽ giúp giảm nguy cơ mắc kẹt trong optima cục bộ.

Để chuẩn hóa dữ liệu, chúng tôi biểu thị nó dưới dạng kiểu float và chia nó cho 255 như được hiển thị trong đoạn mã sau:

X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255

Bây giờ chúng ta hãy xem dữ liệu chuẩn hóa trông như thế nào.

Kiểm tra dữ liệu chuẩn hóa

Để xem dữ liệu chuẩn hóa, chúng tôi sẽ gọi hàm biểu đồ như được hiển thị ở đây:

plot.hist(X_train[0])
plot.title("Digit: {}".format(y_train[0]))

Ở đây, chúng tôi vẽ biểu đồ của phần tử đầu tiên của X_trainvectơ. Chúng tôi cũng in chữ số được đại diện bởi điểm dữ liệu này. Kết quả của việc chạy mã trên được hiển thị ở đây:

Bạn sẽ nhận thấy mật độ dày của các điểm có giá trị gần bằng không. Đây là những điểm chấm đen trong hình ảnh, rõ ràng là phần chính của hình ảnh. Phần còn lại của thang điểm màu xám, gần với màu trắng, đại diện cho chữ số. Bạn có thể kiểm tra sự phân bố các pixel cho một chữ số khác. Đoạn mã dưới đây in ra biểu đồ của một chữ số ở chỉ số 2 trong tập dữ liệu đào tạo.

plot.hist(X_train[2])
plot.title("Digit: {}".format(y_train[2])

Kết quả của việc chạy mã trên được hiển thị bên dưới:

So sánh hai hình trên, bạn sẽ nhận thấy rằng sự phân bố của các pixel màu trắng trong hai hình ảnh khác nhau cho thấy sự thể hiện của một chữ số khác - “5” và “4” trong hai hình trên.

Tiếp theo, chúng tôi sẽ kiểm tra sự phân bố dữ liệu trong tập dữ liệu đào tạo đầy đủ của chúng tôi.

Kiểm tra phân phối dữ liệu

Trước khi chúng tôi đào tạo mô hình học máy trên tập dữ liệu của mình, chúng tôi nên biết sự phân bố của các chữ số duy nhất trong tập dữ liệu của mình. Hình ảnh của chúng tôi đại diện cho 10 chữ số khác nhau từ 0 đến 9. Chúng tôi muốn biết số chữ số 0, 1, v.v., trong tập dữ liệu của chúng tôi. Chúng tôi có thể lấy thông tin này bằng cách sử dụngunique phương pháp của Numpy.

Sử dụng lệnh sau để in số lượng giá trị duy nhất và số lần xuất hiện của mỗi giá trị

print(np.unique(y_train, return_counts=True))

Khi bạn chạy lệnh trên, bạn sẽ thấy kết quả sau:

(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8), array([5923, 6742, 5958, 6131, 5842, 5421, 5918, 6265, 5851, 5949]))

Nó cho thấy rằng có 10 giá trị phân biệt - từ 0 đến 9. Có 5923 lần xuất hiện của chữ số 0, 6742 lần xuất hiện của chữ số 1, v.v. Ảnh chụp màn hình của đầu ra được hiển thị ở đây -

Bước cuối cùng trong quá trình chuẩn bị dữ liệu, chúng ta cần mã hóa dữ liệu của mình.

Mã hóa dữ liệu

Chúng tôi có mười danh mục trong tập dữ liệu của mình. Do đó, chúng tôi sẽ mã hóa đầu ra của mình trong mười danh mục này bằng cách sử dụng mã hóa một nóng. Chúng tôi sử dụng phương thức to_categorial của các tiện ích Numpy để thực hiện mã hóa. Sau khi dữ liệu đầu ra được mã hóa, mỗi điểm dữ liệu sẽ được chuyển đổi thành một vectơ đơn chiều có kích thước 10. Ví dụ: chữ số 5 bây giờ sẽ được biểu diễn là [0,0,0,0,0,1,0,0,0 , 0].

Mã hóa dữ liệu bằng đoạn mã sau:

n_classes = 10
Y_train = np_utils.to_categorical(y_train, n_classes)

Bạn có thể kiểm tra kết quả mã hóa bằng cách in 5 phần tử đầu tiên của vectơ Y_train đã phân loại.

Sử dụng mã sau để in 5 vectơ đầu tiên -

for i in range(5):
   print (Y_train[i])

Bạn sẽ thấy kết quả sau:

[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]

Phần tử đầu tiên đại diện cho chữ số 5, phần tử thứ hai đại diện cho chữ số 0, v.v.

Cuối cùng, bạn cũng sẽ phải phân loại dữ liệu thử nghiệm, điều này được thực hiện bằng cách sử dụng câu lệnh sau:

Y_test = np_utils.to_categorical(y_test, n_classes)

Ở giai đoạn này, dữ liệu của bạn đã được chuẩn bị đầy đủ để đưa vào mạng.

Tiếp theo, đến phần quan trọng nhất và đó là đào tạo mô hình mạng của chúng tôi.