1. Tổng quan
Trong lớp học lập trình này, bạn sẽ tìm hiểu cách xây dựng một trình phân loại Keras. Thay vì cố gắng tìm ra sự kết hợp hoàn hảo giữa các lớp mạng nơron để nhận dạng hoa, trước tiên, chúng ta sẽ sử dụng một kỹ thuật gọi là học chuyển giao để điều chỉnh một mô hình mạnh mẽ đã được huấn luyện tiền kỳ cho tập dữ liệu của mình.
Lớp học lập trình này bao gồm các giải thích lý thuyết cần thiết về mạng nơron và là điểm xuất phát tốt cho các nhà phát triển tìm hiểu về học sâu.
Lớp học lập trình này là Phần 2 của loạt bài "Keras trên TPU". Bạn có thể thực hiện theo thứ tự sau hoặc thực hiện độc lập.
- Quy trình xử lý dữ liệu tốc độ TPU: tf.data.Dataset và TFRecords
- [LỚP HỌC LẬP TRÌNH NÀY] Mô hình Keras đầu tiên của bạn, có sử dụng phương pháp học chuyển giao
- Mạng nơron tích chập, có Keras và TPU
- Mạng nơron tích chập hiện đại, squeezenet, Xception, sử dụng Keras và TPU

Kiến thức bạn sẽ học được
- Cách xây dựng trình phân loại hình ảnh Keras của riêng bạn bằng lớp softmax và tổn thất cross-entropy
- Cách "gian lận" 😈 bằng cách sử dụng phương pháp học chuyển giao thay vì xây dựng mô hình của riêng bạn.
Phản hồi
Nếu bạn thấy có điều gì đó không ổn trong lớp học lập trình này, vui lòng cho chúng tôi biết. Bạn có thể gửi ý kiến phản hồi thông qua các vấn đề trên GitHub [ liên kết phản hồi].
2. Hướng dẫn bắt đầu nhanh về Google Colaboratory
Lớp học lập trình này sử dụng Google Collaboratory và không yêu cầu bạn thiết lập. Colaboratory là một nền tảng sổ tay trực tuyến dành cho mục đích giáo dục. Nền tảng này cung cấp dịch vụ huấn luyện miễn phí bằng CPU, GPU và TPU.

Bạn có thể mở sổ tay mẫu này và chạy qua một vài ô để làm quen với Colaboratory.
Chọn một phần phụ trợ TPU

Trong trình đơn Colab, hãy chọn Thời gian chạy > Thay đổi loại thời gian chạy rồi chọn TPU. Trong lớp học lập trình này, bạn sẽ sử dụng một TPU (Tensor Processing Unit) mạnh mẽ được hỗ trợ để huấn luyện tăng tốc phần cứng. Quá trình kết nối với thời gian chạy sẽ diễn ra tự động khi thực thi lần đầu tiên hoặc bạn có thể sử dụng nút "Kết nối" ở góc trên bên phải.
Thực thi sổ tay

Thực thi từng ô bằng cách nhấp vào một ô và sử dụng tổ hợp phím Shift-ENTER. Bạn cũng có thể chạy toàn bộ sổ tay bằng cách chọn Thời gian chạy > Chạy tất cả
Mục lục

Tất cả sổ tay đều có mục lục. Bạn có thể mở mục lục bằng mũi tên màu đen ở bên trái.
Ô ẩn

Một số ô sẽ chỉ hiển thị tiêu đề. Đây là một tính năng sổ tay dành riêng cho Colab. Bạn có thể nhấp đúp vào các ô này để xem mã bên trong nhưng thường thì mã này không thú vị lắm. Thông thường, các ô này hỗ trợ hoặc trực quan hoá các hàm. Bạn vẫn cần chạy các ô này để xác định các hàm bên trong.
Xác thực

Colab có thể truy cập vào các bộ chứa Google Cloud Storage riêng tư của bạn, miễn là bạn xác thực bằng một tài khoản được uỷ quyền. Đoạn mã ở trên sẽ kích hoạt một quy trình xác thực.
3. [INFO] Trình phân loại mạng nơron 101
Mô tả ngắn gọn
Nếu bạn đã biết tất cả các thuật ngữ được in đậm trong đoạn văn tiếp theo, bạn có thể chuyển sang bài tập tiếp theo. Nếu bạn chỉ mới bắt đầu tìm hiểu về học sâu, thì xin chào mừng bạn và vui lòng đọc tiếp.
Đối với các mô hình được xây dựng dưới dạng một chuỗi lớp, Keras cung cấp API Sequential. Ví dụ: bạn có thể viết trình phân loại hình ảnh sử dụng 3 lớp dày đặc trong Keras như sau:
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=[192, 192, 3]),
tf.keras.layers.Dense(500, activation="relu"),
tf.keras.layers.Dense(50, activation="relu"),
tf.keras.layers.Dense(5, activation='softmax') # classifying into 5 classes
])
# this configures the training of the model. Keras calls it "compiling" the model.
model.compile(
optimizer='adam',
loss= 'categorical_crossentropy',
metrics=['accuracy']) # % of correct answers
# train the model
model.fit(dataset, ... )

Mạng nơron dày đặc
Đây là mạng nơron đơn giản nhất để phân loại hình ảnh. Mạng này được tạo thành từ các "nơron" được sắp xếp theo lớp. Lớp đầu tiên xử lý dữ liệu đầu vào và đưa dữ liệu đầu ra vào các lớp khác. Lớp này được gọi là "dày đặc" vì mỗi nơron được kết nối với tất cả các nơron trong lớp trước đó.

Bạn có thể đưa hình ảnh vào một mạng như vậy bằng cách làm phẳng các giá trị RGB của tất cả các pixel thành một vectơ dài và sử dụng vectơ đó làm dữ liệu đầu vào. Đây không phải là kỹ thuật tốt nhất để nhận dạng hình ảnh nhưng chúng ta sẽ cải thiện kỹ thuật này sau.
Nơron, kích hoạt, RELU
"Nơron" tính toán tổng có trọng số của tất cả dữ liệu đầu vào, thêm một giá trị gọi là "độ chệch" và đưa kết quả thông qua một "hàm kích hoạt". Trọng số và độ chệch ban đầu chưa được biết. Chúng sẽ được khởi chạy ngẫu nhiên và "học" bằng cách huấn luyện mạng nơron trên nhiều dữ liệu đã biết.

Hàm kích hoạt phổ biến nhất được gọi là RELU cho Rectified Linear Unit. Đây là một hàm rất đơn giản như bạn có thể thấy trên biểu đồ ở trên.
Kích hoạt Softmax
Mạng ở trên kết thúc bằng một lớp gồm 5 nơron vì chúng ta đang phân loại hoa thành 5 danh mục (hoa hồng, hoa tulip, hoa bồ công anh, hoa cúc, hoa hướng dương). Các nơron trong các lớp trung gian được kích hoạt bằng hàm kích hoạt RELU cổ điển. Tuy nhiên, trong lớp cuối cùng, chúng ta muốn tính toán các số từ 0 đến 1 đại diện cho xác suất hoa này là hoa hồng, hoa tulip, v.v. Để thực hiện việc này, chúng ta sẽ sử dụng một hàm kích hoạt gọi là "softmax".
Việc áp dụng softmax trên một vectơ được thực hiện bằng cách lấy hàm mũ của từng phần tử rồi chuẩn hoá vectơ, thường là sử dụng chuẩn L1 (tổng các giá trị tuyệt đối) để các giá trị cộng lại thành 1 và có thể được diễn giải là xác suất.

Tổn thất cross-entropy
Bây giờ, mạng nơron của chúng ta tạo ra các dự đoán từ hình ảnh đầu vào, chúng ta cần đo lường mức độ chính xác của các dự đoán đó, tức là khoảng cách giữa những gì mạng cho chúng ta biết và câu trả lời chính xác, thường được gọi là "nhãn". Hãy nhớ rằng chúng ta có nhãn chính xác cho tất cả hình ảnh trong tập dữ liệu.
Bất kỳ khoảng cách nào cũng sẽ hoạt động, nhưng đối với các vấn đề phân loại, "khoảng cách cross-entropy" là hiệu quả nhất. Chúng ta sẽ gọi đây là hàm lỗi hoặc hàm "tổn thất":

Phương pháp giảm độ dốc
"Huấn luyện" mạng nơron thực sự có nghĩa là sử dụng hình ảnh và nhãn huấn luyện để điều chỉnh trọng số và độ chệch nhằm giảm thiểu hàm tổn thất cross-entropy. Sau đây là cách hoạt động.
Cross-entropy là một hàm của trọng số, độ chệch, pixel của hình ảnh huấn luyện và lớp đã biết của hình ảnh đó.
Nếu chúng ta tính toán các đạo hàm riêng của cross-entropy tương đối với tất cả các trọng số và tất cả các độ chệch, chúng ta sẽ thu được một "độ dốc", được tính cho một hình ảnh, nhãn và giá trị hiện tại của trọng số và độ chệch. Hãy nhớ rằng chúng ta có thể có hàng triệu trọng số và độ chệch, vì vậy, việc tính toán độ dốc nghe có vẻ là một công việc tốn nhiều thời gian. May mắn là Tensorflow sẽ thực hiện việc này cho chúng ta. Thuộc tính toán học của độ dốc là nó trỏ "lên". Vì chúng ta muốn đi đến nơi có cross-entropy thấp, nên chúng ta sẽ đi theo hướng ngược lại. Chúng ta cập nhật trọng số và độ chệch theo một phần của độ dốc. Sau đó, chúng ta thực hiện lại việc này nhiều lần bằng cách sử dụng các lô hình ảnh và nhãn huấn luyện tiếp theo trong một vòng lặp huấn luyện. Hy vọng rằng điều này sẽ hội tụ đến một nơi có cross-entropy tối thiểu, mặc dù không có gì đảm bảo rằng giá trị tối thiểu này là duy nhất.

Lô nhỏ và quán tính
Bạn có thể tính toán độ dốc chỉ trên một hình ảnh mẫu và cập nhật ngay trọng số và độ chệch, nhưng việc thực hiện trên một lô gồm, chẳng hạn như 128 hình ảnh sẽ cho ra một độ dốc thể hiện tốt hơn các ràng buộc do các hình ảnh mẫu khác nhau áp đặt và do đó có khả năng hội tụ nhanh hơn về giải pháp. Kích thước của lô nhỏ là một tham số có thể điều chỉnh.
Kỹ thuật này, đôi khi được gọi là "giảm độ dốc ngẫu nhiên" có một lợi ích thực tế hơn: làm việc với các lô cũng có nghĩa là làm việc với các ma trận lớn hơn và thường dễ tối ưu hoá hơn trên GPU và TPU.
Tuy nhiên, quá trình hội tụ vẫn có thể hơi hỗn loạn và thậm chí có thể dừng lại nếu vectơ độ dốc là tất cả các số 0. Điều đó có nghĩa là chúng ta đã tìm thấy một giá trị tối thiểu? Không phải lúc nào cũng vậy. Một thành phần độ dốc có thể bằng 0 trên giá trị tối thiểu hoặc tối đa. Với một vectơ độ dốc có hàng triệu phần tử, nếu tất cả đều là 0, thì xác suất mà mọi số 0 tương ứng với một giá trị tối thiểu và không có số 0 nào tương ứng với một điểm tối đa là khá nhỏ. Trong một không gian có nhiều chiều, các điểm yên ngựa khá phổ biến và chúng ta không muốn dừng lại ở các điểm đó.

Hình minh hoạ: một điểm yên ngựa. Độ dốc là 0 nhưng không phải là giá trị tối thiểu theo mọi hướng. (Ghi nhận hình ảnh Wikimedia: By Nicoguaro - Own work, CC BY 3.0)
Giải pháp là thêm một số Momentum vào thuật toán tối ưu hoá để thuật toán này có thể vượt qua các điểm yên ngựa mà không dừng lại.
Bảng thuật ngữ
lô hoặc lô nhỏ: quá trình huấn luyện luôn được thực hiện trên các lô dữ liệu huấn luyện và nhãn. Việc này giúp thuật toán hội tụ. Phương diện "lô" thường là phương diện đầu tiên của các tensor dữ liệu. Ví dụ: một tensor có hình dạng [100, 192, 192, 3] chứa 100 hình ảnh có kích thước 192x192 pixel với 3 giá trị trên mỗi pixel (RGB).
tổn thất cross-entropy: một hàm tổn thất đặc biệt thường được sử dụng trong các trình phân loại.
lớp dày đặc: một lớp nơron trong đó mỗi nơron được kết nối với tất cả các nơron trong lớp trước đó.
đặc điểm: dữ liệu đầu vào của mạng nơron đôi khi được gọi là "đặc điểm". Nghệ thuật tìm ra những phần nào của tập dữ liệu (hoặc sự kết hợp của các phần) để đưa vào mạng nơron nhằm thu được các dự đoán tốt được gọi là "kỹ thuật trích xuất tính chất".
nhãn: một tên khác cho "lớp" hoặc câu trả lời chính xác trong một vấn đề phân loại có giám sát
tốc độ học: phần của độ dốc mà trọng số và độ chệch được cập nhật ở mỗi lần lặp của vòng lặp huấn luyện.
logit: đầu ra của một lớp nơron trước khi hàm kích hoạt được áp dụng được gọi là "logit". Thuật ngữ này xuất phát từ "hàm logistic" hay còn gọi là "hàm sigmoid", vốn là hàm kích hoạt phổ biến nhất. "Đầu ra của nơron trước hàm logistic" được rút gọn thành "logit".
tổn thất: hàm lỗi so sánh đầu ra của mạng nơron với câu trả lời chính xác
nơron: tính toán tổng có trọng số của dữ liệu đầu vào, thêm một độ chệch và đưa kết quả thông qua một hàm kích hoạt.
mã one-hot: loại 3 trong 5 được mã hoá dưới dạng một vectơ gồm 5 phần tử, tất cả đều là 0 ngoại trừ phần tử thứ 3 là 1.
relu: rectified linear unit. Một hàm kích hoạt phổ biến cho các nơron.
sigmoid: một hàm kích hoạt khác từng phổ biến và vẫn hữu ích trong các trường hợp đặc biệt.
softmax: một hàm kích hoạt đặc biệt hoạt động trên một vectơ, làm tăng sự khác biệt giữa thành phần lớn nhất và tất cả các thành phần khác, đồng thời chuẩn hoá vectơ để có tổng bằng 1, nhờ đó có thể được diễn giải là một vectơ xác suất. Được sử dụng làm bước cuối cùng trong các trình phân loại.
tensor: "Tensor" giống như một ma trận nhưng có số lượng chiều tuỳ ý. Tensor 1 chiều là một vectơ. Tensor 2 chiều là một ma trận. Sau đó, bạn có thể có các tensor có 3, 4, 5 hoặc nhiều chiều hơn.
4. Học chuyển giao
Đối với vấn đề phân loại hình ảnh, các lớp dày đặc có thể sẽ không đủ. Chúng ta phải tìm hiểu về các lớp tích chập và nhiều cách sắp xếp các lớp này.
Nhưng chúng ta cũng có thể đi đường tắt! Có các mạng nơron tích chập được huấn luyện đầy đủ để tải xuống. Bạn có thể cắt bỏ lớp cuối cùng của chúng, đầu phân loại softmax và thay thế bằng lớp của riêng bạn. Tất cả các trọng số và độ chệch đã huấn luyện vẫn giữ nguyên, bạn chỉ cần huấn luyện lại lớp softmax mà bạn thêm vào. Kỹ thuật này được gọi là học chuyển giao và đáng ngạc nhiên là kỹ thuật này hoạt động miễn là tập dữ liệu mà mạng nơron được huấn luyện trước "đủ gần" với tập dữ liệu của bạn.
Thực hành
Vui lòng mở sổ tay sau, thực thi các ô (Shift-ENTER) và làm theo hướng dẫn ở bất kỳ nơi nào bạn thấy nhãn "WORK REQUIRED" (CẦN THỰC HIỆN).
Keras Flowers transfer learning (playground).ipynb
Thông tin khác
Với phương pháp học chuyển giao, bạn sẽ được hưởng lợi từ cả kiến trúc mạng nơron tích chập nâng cao do các nhà nghiên cứu hàng đầu phát triển và từ quá trình huấn luyện trước trên một tập dữ liệu hình ảnh khổng lồ. Trong trường hợp này, chúng ta sẽ học chuyển giao từ một mạng được huấn luyện trên ImageNet, một cơ sở dữ liệu hình ảnh chứa nhiều cảnh thực vật và ngoài trời, đủ gần với hoa.

Hình minh hoạ: sử dụng một mạng nơron tích chập phức tạp đã được huấn luyện làm hộp đen, chỉ huấn luyện lại đầu phân loại. Đây là phương pháp học chuyển giao. Chúng ta sẽ xem cách hoạt động của các sắp xếp phức tạp này của các lớp tích chập sau. Hiện tại, đây là vấn đề của người khác.
Học chuyển giao trong Keras
Trong Keras, bạn có thể tạo thực thể cho một mô hình được huấn luyện tiền kỳ từ tập hợp tf.keras.applications.*. Ví dụ: MobileNet V2 là một kiến trúc tích chập rất tốt, có kích thước hợp lý. Bằng cách chọn include_top=False, bạn sẽ nhận được mô hình được huấn luyện tiền kỳ mà không có lớp softmax cuối cùng để bạn có thể thêm lớp của riêng mình:
pretrained_model = tf.keras.applications.MobileNetV2(input_shape=[*IMAGE_SIZE, 3], include_top=False)
pretrained_model.trainable = False
model = tf.keras.Sequential([
pretrained_model,
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(5, activation='softmax')
])
Ngoài ra, hãy lưu ý đến chế độ cài đặt pretrained_model.trainable = False. Chế độ cài đặt này cố định trọng số và độ chệch của mô hình được huấn luyện tiền kỳ để bạn chỉ huấn luyện lớp softmax. Việc này thường liên quan đến tương đối ít trọng số và có thể được thực hiện nhanh chóng mà không cần một tập dữ liệu rất lớn. Tuy nhiên, nếu bạn có nhiều dữ liệu, thì phương pháp học chuyển giao có thể hoạt động tốt hơn nữa với pretrained_model.trainable = True. Khi đó, các trọng số được huấn luyện trước sẽ cung cấp các giá trị ban đầu tuyệt vời và vẫn có thể được điều chỉnh bằng quá trình huấn luyện để phù hợp hơn với vấn đề của bạn.
Cuối cùng, hãy lưu ý đến lớp Flatten() được chèn trước lớp softmax dày đặc. Các lớp dày đặc hoạt động trên các vectơ dữ liệu phẳng nhưng chúng ta không biết liệu đó có phải là những gì mô hình được huấn luyện trước trả về hay không. Đó là lý do chúng ta cần làm phẳng. Trong chương tiếp theo, khi tìm hiểu sâu về các kiến trúc tích chập, chúng ta sẽ giải thích định dạng dữ liệu do các lớp tích chập trả về.
Bạn sẽ đạt được độ chính xác gần 75% với phương pháp này.
Giải pháp
Đây là sổ tay giải pháp. Bạn có thể sử dụng sổ tay này nếu gặp khó khăn.
Keras Flowers transfer learning (solution).ipynb
Nội dung chúng ta đã đề cập
- 🤔 Cách viết trình phân loại trong Keras
- 🤓 được định cấu hình với lớp softmax cuối cùng và tổn thất cross-entropy
- 😈 Học chuyển giao
- 🤔 Huấn luyện mô hình đầu tiên
- 🧐 Theo dõi tổn thất và độ chính xác của mô hình trong quá trình huấn luyện
Vui lòng dành một chút thời gian để xem qua danh sách kiểm tra này trong đầu.
5. Xin chúc mừng!
Bây giờ, bạn có thể xây dựng một mô hình Keras. Vui lòng tiếp tục đến lớp học lập trình tiếp theo để tìm hiểu cách lắp ráp các lớp tích chập.
- Quy trình xử lý dữ liệu tốc độ TPU: tf.data.Dataset và TFRecords
- [LỚP HỌC LẬP TRÌNH NÀY] Mô hình Keras đầu tiên của bạn, có sử dụng phương pháp học chuyển giao
- Mạng nơron tích chập, có Keras và TPU
- Mạng nơron tích chập hiện đại, squeezenet, Xception, sử dụng Keras và TPU
TPU trong thực tế
TPU và GPU có trên Nền tảng Trí tuệ nhân tạo trên đám mây:
- Trên Deep Learning VM
- Trong Nền tảng Trí tuệ nhân tạo Notebooks
- Trong các công việc Huấn luyện Nền tảng AI
Cuối cùng, chúng tôi rất mong nhận được ý kiến phản hồi. Vui lòng cho chúng tôi biết nếu bạn thấy có điều gì đó không ổn trong lớp học lập trình này hoặc nếu bạn nghĩ rằng lớp học lập trình này cần được cải thiện. Bạn có thể gửi ý kiến phản hồi thông qua các vấn đề trên GitHub [ liên kết phản hồi].

|

