Trước khi chúng tôi cung cấp dữ liệu cho mạng của mình, dữ liệu đó phải được chuyển đổi thành định dạng mà mạng yêu cầu. Điều nà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 một đầu vào đa chiều thành một vectơ một chiều và chuẩn hóa các điểm dữ liệu.
Định hình lại Vector đầu vào
Hình ảnh trong bộ dữ liệu của chúng tôi bao gồm 28 x 28 pixel. Điều này 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ọi phương thức định hình lại trên vectơ
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ơ kiểm tra 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ị riêng biệt trong khoảng từ 0 đến 255 – mức thang màu xám. Bình thường hóa các giá trị pixel này trong khoảng từ 0 đến 1 giúp tăng tốc quá trình đào tạo. Vì chúng ta sẽ sử dụng phương pháp giảm độ dốc ngẫu nhiên, nên việc chuẩn hóa dữ liệu cũng sẽ giúp giảm khả năng bị mắc kẹt trong vùng tối ưu cục bộ. Để chuẩn hóa dữ liệu, chúng tôi biểu diễn dữ liệu dưới dạng float và chia cho 255 như 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 được 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 ta 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 vectơ X_train . Chúng tôi cũng in chữ số được đại diện bởi điểm dữ liệu này. Đầu ra của việc chạy đoạn mã trên được hiển thị ở đây
Bạn sẽ nhận thấy mật độ dày đặc 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, đây rõ ràng là phần chính của hình ảnh. Phần còn lại của các đ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 phân phối pixel cho một chữ số khác. Mã bên dưới in biểu đồ của một chữ số ở chỉ số 2 trong tập dữ liệu huấn luyện.
plot.hist(X_train[2])
plot.title("Digit: {}".format(y_train[2])
Đầu ra của đoạn 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 điểm ảnh màu trắng trong hai hình ảnh khác nhau cho thấy biểu thị 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 việc phân phối 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 đào tạo mô hình máy học trên tập dữ liệu của mình, chúng ta nên biết phân phối 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ố riêng biệt từ 0 đến 9. Chúng tôi muốn biết số lượng chữ số 0, 1, v.v. trong tập dữ liệu của mình. Chúng tôi có thể lấy thông tin này bằng cách sử dụng phương pháp duy nhất 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 đầu ra 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ị riêng 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
Là 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 lần 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ơ một chiều có kích thước 10. Ví dụ: chữ số 5 bây giờ sẽ được biểu thị 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 đoạn mã sau để in 5 vectơ đầu tiên
for i in range(5):
print (Y_train[i])
Bạn sẽ thấy đầu ra 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à huấn luyện mô hình mạng của chúng ta
Xem thêm : Deep Learning – Đào tạo người mẫu