1. Tổng quan
Trong phòng thí nghiệm này, bạn sẽ tìm hiểu cách tạo thuật toán 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 biết hoa, trước tiên chúng ta sẽ sử dụng kỹ thuật có tên là học chuyển giao để điều chỉnh một mô hình đã được huấn luyện trước mạnh mẽ vào tập dữ liệu của mình.
Phòng thí nghiệm này đưa ra những nội dung giải thích lý thuyết cần thiết về mạng nơron và là xuất phát điểm phù hợp để các nhà phát triển tìm hiểu về công nghệ học sâu.
Phòng thí nghiệm này là Phần 2 của "Keras on TPU" (Keras trên TPU) loạt phim. Bạn có thể thực hiện các bước này theo thứ tự sau hoặc riêng lẻ.
- Quy trình dữ liệu tốc độ TPU: tf.data.Dataset và TFRecords
- [Previous LAB] Mô hình Keras đầu tiên của bạn có công nghệ học chuyển giao
- Mạng nơron tích chập, với Keras và TPU
- Convnet hiện đại, Chromiumnet, Xception, với Keras và TPU
Kiến thức bạn sẽ học được
- Xây dựng thuật toán phân loại hình ảnh Keras của riêng bạn bằng lớp softmax và mất entropy
- Để gian lận 😈, hãy 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ó thiếu sót 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ể cung cấp ý kiến phản hồi thông qua các vấn đề trên GitHub [ feedback link].
2. Bắt đầu nhanh với Google Colaboratory
Phòng thí nghiệm này sử dụng tính năng Cộng tác của Google và bạn không cần phải 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. Công cụ này cung cấp chương trình đào tạo miễn phí về CPU, GPU và TPU.
Bạn có thể mở sổ tay mẫu này và xem qua một số ô để làm quen với Colaboratory.
Chọn 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 (Bộ xử lý cảm biến) mạnh mẽ được hỗ trợ để huấn luyện có tăng tốc phần cứng. Kết nối với môi trường thời gian chạy sẽ tự động diễn ra trong lần thực thi đầu tiên, hoặc bạn có thể dùng tính năng "Kết nối" ở góc trên bên phải.
Thực thi trên sổ tay
Thực thi lần lượt từng ô bằng cách nhấp vào một ô và sử dụng Shift-ENTER. Bạn cũng có thể chạy toàn bộ sổ tay bằng 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 này bằng mũi tên màu đen ở bên trái.
Các ô bị ẩn
Một số ô sẽ chỉ hiển thị tiêu đề. Đây là một tính năng của sổ tay dành riêng cho Colab. Bạn có thể nhấp đúp vào chúng để xem mã bên trong nhưng thường không được thú vị lắm. Thường có các hàm hỗ trợ hoặc trực quan hoá. Bạn vẫn cần phải chạy các ô này để các hàm bên trong được xác định.
Xác thực
Colab có thể truy cập vào bộ chứa riêng tư của bạn trong Google Cloud Storage, 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 quá trình xác thực.
3. [INFO] Thuật toán phân loại mạng nơron 101
Tóm tắt
Nếu bạn đã biết tất cả những thuật ngữ in đậm trong đoạn tiếp theo, thì bạn có thể chuyển sang bài tập tiếp theo. Nếu bạn chỉ mới bắt đầu sử dụng công nghệ học sâu, 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 trình tự các lớp, Keras cung cấp API tuần tự. Ví dụ: thuật toán phân loại hình ảnh sử dụng ba lớp dày đặc có thể được viết 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. Nó đượ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à cấp dữ liệu đầu ra của nó vào các lớp khác. Nó đượ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 của hình ảnh đó thành một vectơ dài và sử dụng hình ảnh đó làm đầ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 tôi sẽ cải thiện kỹ thuật này sau.
nơ-ron, kích hoạt, RELU
Một "nơ-ron" tính tổng có trọng số của tất cả các đầu vào, rồi cộng một giá trị được gọi là "độ lệch" và cung cấp kết quả thông qua cái gọi là "hàm kích hoạt". Lúc đầu, trọng số và độ chệch không được xác định. Chúng sẽ được khởi tạo ngẫu nhiên và "đã học" bằng cách huấn luyện mạng nơron dựa trên nhiều dữ liệu đã biết.
Hàm kích hoạt phổ biến nhất có tên là RELU cho Đơn vị tuyến tính đã chỉnh sửa. Đây là một hàm rất đơn giản như bạn có thể thấy trong biểu đồ ở trên.
Kích hoạt Softmax
Mạng lưới ở trên kết thúc bằng một lớp 5 tế bào thần kinh vì chúng ta đang phân loại hoa thành 5 loại (hoa hồng, hoa tulip, bồ công anh, hoa cúc, hoa hướng dương). Nơ-ron trong lớp trung gian được kích hoạt bằng hàm kích hoạt RELU cổ điển. Tuy nhiên, ở lớp cuối cùng, chúng ta muốn tính toán các số từ 0 đến 1 thể hiện xác suất để bông hoa này là hoa hồng, hoa tulip, v.v. Để làm được điều này, chúng tôi sẽ sử dụng chức năng kích hoạt có tên là "softmax".
Áp dụng softmax trên một vectơ được thực hiện bằng cách lấy số mũ của từng phần tử và sau đó chuẩn hoá vectơ, thường sử dụng định mức L1 (tổng các giá trị tuyệt đối) để các giá trị cộng lại bằng 1 và có thể được hiểu là xác suất.
Tổn thất entropy
Giờ đây, 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 độ tốt của chúng, tức là khoảng cách giữa những gì mạng cho chúng ta biết và các câu trả lời chính xác, thường được gọi là "nhãn". Hãy nhớ rằng chúng tôi 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 được, nhưng đối với các bài toán phân loại, khoảng cách được gọi là "khoảng cách entropy chéo" là cách hiệu quả nhất. Chúng tôi sẽ gọi đây là lỗi của mình hay "mất mát" hàm:
Xuống kiểu chuyển màu
"Huấn luyện" mạng nơron thực ra là sử dụng hình ảnh và nhãn huấn luyện để điều chỉnh trọng số và độ chệch sao cho giảm thiểu hàm mất entropy. Dưới đây là cách thức hoạt động.
Entropy chéo 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 các đạo hàm riêng của entropy chéo tương đối với tất cả các trọng số và tất cả độ chệch, chúng ta sẽ có được độ dốc, được tính cho một hình ảnh, nhãn, 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à độ lệch, vì vậy việc tính toán độ dốc nghe có vẻ mất nhiều công sức. Rất may là Tensorflow sẽ giúp chúng tôi làm việc này. Thuộc tính toán học của dải chuyển màu là nó trỏ "lên trên". Vì muốn đi tới nơi có giá trị chéo entropy thấp, nên chúng ta đi theo hướng ngược lại. Chúng tôi cập nhật trọng số và độ chệch theo một phần nhỏ của độ dốc. Sau đó, chúng ta làm tương tự 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 giá trị này hội tụ đến một nơi mà giá trị chéo entropy là 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.
Nhóm nhỏ và động lượng
Bạn có thể tính toán độ dốc của mình chỉ trên một hình ảnh ví dụ và cập nhật ngay lập tức trọng số và độ chệch, nhưng làm như vậy trên một loạt, ví dụ 128 hình ảnh sẽ tạo ra một độ dốc thể hiện tốt hơn các hạn chế do các hình ảnh mẫu khác nhau áp đặt và do đó có khả năng hội tụ về phía giải pháp nhanh hơn. 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 khác thực tế hơn: xử lý 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à các ma trận này thường dễ tối ưu hoá trên GPU và TPU hơn.
Tuy nhiên, sự hội tụ vẫn có thể hơi hỗn loạn và thậm chí có thể dừng nếu vectơ chuyển màu đều bằng 0. Có phải điều đó có nghĩa là chúng tôi đã tìm ra mức tối thiểu không? Không phải lúc nào cũng vậy. 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 vectơ độ dốc có hàng triệu phần tử, nếu tất cả các phần tử đều bằng 0, xác suất mà mọi số 0 đều tương ứng với giá trị tối thiểu và không có phần tử nào trong số đó đạ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 khá phổ biến và chúng tôi không muốn dừng lại ở đó.
Hình minh hoạ: một điểm yên xe. Độ dốc là 0 nhưng không phải là giá trị nhỏ nhất theo mọi hướng. (Ghi nhận tác giả hình ảnh Wikimedia: Của Nicoguaro – Tác phẩm riêng, CC BY 3.0)
Giải pháp là thêm động lượng vào thuật toán tối ưu hoá để thuật toán có thể vượt qua các điểm an toàn 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 và nhãn huấn luyện. Làm như vậy sẽ giúp thuật toán hội tụ. "Lô" thường là chiều đầu tiên của tensor dữ liệu. Ví dụ: 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 ba giá trị mỗi pixel (RGB).
mất entropy chéo: một hàm mất đặc biệt thường dùng trong thuật toán 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.
tính năng: đầu vào của mạng nơron đôi khi được gọi là "tính năng". Nghệ thuật xác định các phần nào của tập dữ liệu (hoặc tổ hợp các phần) cần đưa vào mạng nơron để có được các dự đoán chính xác được gọi là "kỹ thuật tính năng".
nhãn: tên khác của "lớp học" hoặc câu trả lời chính xác trong một bài toán phân loại được giám sát
tốc độ học tập: tỷ lệ độ dốc mà theo đó trọng số và độ chệch được cập nhật ở mỗi lần lặp lại của vòng lặp huấn luyện.
logit: dữ liệu đầu ra của một lớp nơron trước khi áp dụng hàm kích hoạt được gọi là "logit". Thuật ngữ này bắt nguồn từ "hàm logistic" còn gọi là "hàm sigmoid" từng là chức năng kích hoạt phổ biến nhất. "Đầu ra nơron trước hàm logistic" đã được rút ngắn thành "logits".
loss: hàm lỗi so sánh đầu ra của mạng nơron với câu trả lời đúng
nơ-ron: tính toán tổng có trọng số của các giá trị đầu vào, thêm độ chệch và cung cấp kết quả thông qua một hàm kích hoạt.
mã hoá một nóng: lớp 3/5 được mã hoá dưới dạng một vectơ gồm 5 phần tử, tất cả đều là số 0, ngoại trừ phần thứ 3 là 1.
relu: đơn vị tuyến tính đã chỉnh sửa. Một hàm kích hoạt phổ biến cho nơron.
sigmoid: một hàm kích hoạt khác từng phổ biến và hiện 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ơ, tăng hiệu số 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 để có thể hiểu vectơ đó là vectơ xác suất. Được dùng làm bước cuối cùng trong thuật toán phân loại.
tensor: "tensor" giống như ma trận nhưng có số lượng kích thước tuỳ ý. Tensor 1 chiều là một vectơ. Tensor 2 chiều là một ma trận. Và sau đó bạn có thể có các tensor với 3, 4, 5 hoặc nhiều chiều.
4. Học chuyển
Đố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 chúng.
Nhưng chúng ta cũng có thể tạo lối tắt! Bạn có thể tải xuống các mạng nơron tích chập đã được huấn luyện đầy đủ. Bạn có thể cắt lớp cuối cùng của chúng, phần đầu phân loại softmax và thay thế bằng của riêng bạn. Tất cả các trọng số và độ chệch đã qua 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à thật đáng kinh ngạc, nó 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" của bạn.
Thực hành
Vui lòng mở sổ tay dưới đây, thực thi các ô (Shift-ENTER) và làm theo hướng dẫn ở bất cứ nơi nào bạn thấy "YÊU CẦU CÔNG VIỆC" .
Keras Flowers transfer learning (playground).ipynb
Thông tin khác
Với công nghệ học chuyển giao, bạn đượ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 đào tạo trước về một tập dữ liệu hình ảnh khổng lồ. Trong trường hợp này, chúng ta sẽ chuyển nội dung học được từ một mạng được đào tạo trên ImageNet – một cơ sở dữ liệu gồm nhiều hình ảnh thực vật và cảnh ngoài trời, gần giống 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 dưới dạng một 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 sắp xếp phức tạp của các lớp tích chập này hoạt động sau này. Hiện tại, vấn đề là do người khác.
Chuyển giao nội dung học tập trong Keras
Trong Keras, bạn có thể tạo thực thể cho một mô hình huấn luyện trước từ bộ sưu tậ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 trước mà không có lớp Softmax cuối cùng để bạn có thể thêm mô hình 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
. Phương pháp này cố định các trọng số và độ chệch của mô hình huấn luyện trước để bạn chỉ huấn luyện lớp softmax của mình. Việc này thường tương đối ít trọng số và có thể được thực hiện nhanh chóng mà không cần đến một tập dữ liệu quá lớn. Tuy nhiên, nếu bạn có nhiều dữ liệu, tính năng học chuyển có thể hoạt động hiệu quả hơn nữa với pretrained_model.trainable = True
. Sau đó, các trọng số đã huấn luyện trước sẽ cung cấp các giá trị ban đầu rất tốt và bạn vẫn có thể điều chỉnh các trọng số này bằng quá trình huấn luyện cho phù hợp hơn với bài tập của mình.
Cuối cùng, hãy lưu ý rằng 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ơ phẳng của dữ liệu nhưng chúng ta không biết đó có phải là điều mà mô hình huấn luyện trước trả về hay không. Đó là lý do chúng ta cần phải làm phẳng. Trong chương tiếp theo, khi tìm hiểu sâu về kiến trúc tích chập, chúng ta sẽ giải thích định dạng dữ liệu mà 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 nếu gặp khó khăn.
Keras Flowers transfer learning (solution).ipynb
Nội dung đã đề cập
- 🤔 Cách viết thuật toán phân loại trong Keras
- 🤓 được định cấu hình với lớp cuối cùng của softmax và mất entropy
- 😈 Chuyển đổi nội dung học tập
- 🤔 Đào tạo mô hình đầu tiên
- 🧐 Theo dõi sự mất mát và độ chính xác trong quá trình tập luyện
Vui lòng dành chút thời gian để xem danh sách kiểm tra này trong đầu bạn.
5. Xin chúc mừng!
Bây giờ, bạn có thể xây dựng mô hình Keras. Vui lòng chuyển đến phòng thí nghiệm tiếp theo để tìm hiểu cách tập hợp các lớp tích chập.
- Quy trình dữ liệu tốc độ TPU: tf.data.Dataset và TFRecords
- [this LAB] Mô hình Keras đầu tiên của bạn có công nghệ học chuyển giao
- Mạng nơron tích chập, với Keras và TPU
- Convnet hiện đại, Chromiumnet, Xception, với Keras và TPU
TPU trong thực tế
TPU và GPU có trên Cloud AI Platform:
- Máy ảo học sâu
- Trong mục Sổ tay dựa trên nền tảng AI
- Trong việc làm Đào tạo 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 của bạn. Vui lòng cho chúng tôi biết nếu bạn thấy có gì thiếu trong phòng thí nghiệm này hoặc nếu bạn cho rằng điều đó cần được cải thiện. Bạn có thể cung cấp ý kiến phản hồi thông qua các vấn đề trên GitHub [ feedback link].
|