Mô hình Keras đầu tiên của bạn có công nghệ học chuyển

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 cách kết hợp hoàn hảo 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 có tên là học chuyển đổi để điều chỉnh một mô hình được huấn luyện trước mạnh mẽ cho phù hợp với 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 loạt video "Keras on TPU". Bạn có thể thực hiện các bước này theo thứ tự sau hoặc riêng lẻ.

ca8cc21f6838eccc.png

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
  • Để lừa đảo 😈, hãy dùng phương pháp học chuyển giao thay vì tự xây dựng mô hình của riêng bạn.

Phản hồi

Nếu bạn thấy có 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ể 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

Lớp học này sử dụng Google Colaboratory và bạn không cần thiết lập gì cả. Colaboratory là một nền tảng sổ tay trực tuyến phục vụ 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.

688858c21e3beff2.png

Bạn có thể mở sổ tay mẫu này và xem qua một số ô để làm quen với Colaboratory.

c3df49e90e5a654f.png Welcome to Colab.ipynb

Chọn phần phụ trợ TPU

8832c6208c99687d.png

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. Quá trình 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ể sử dụng nút "Kết nối" ở góc trên bên phải.

Thực thi sổ tay

76d05caa8b4db6da.png

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 tuỳ chọn Thời gian chạy > Chạy tất cả

Mục lục

429f106990037ec4.png

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

Các ô bị ẩn

edc3dba45d26f12a.png

Một số ô sẽ chỉ hiển thị tiêu đề. Đây là một tính năng dành riêng cho sổ tay trên Colab. Bạn có thể nhấp đúp vào các tệp này để xem mã bên trong, nhưng thường thì mã này không thú vị lắm. Thường là 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

cdd4b41413100543.png

Colab có thể truy cập vào các bộ chứa riêng tư trên Google Cloud Storage 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 quy trình xác thực.

3. [INFO] Kiến thức cơ bản về bộ phân loại mạng nơron

Tóm tắt

Nếu đã biết tất cả các thuật ngữ được in đậm trong đoạ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 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 bằng 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, ... )

688858c21e3beff2.pngS

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à đưa dữ liệu đầu ra vào các lớp khác. Lớp này được gọi là "mật" vì mỗi tế bào thần kinh được kết nối với tất cả các tế bào thần kinh trong lớp trước.

c21bae6dade487bc.png

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, hoạt động, RELU

Một "nơ-ron" tính tổng của tất cả các giá trị đầu vào, thêm giá trị được gọi là "độ lệch" và cung cấp kết quả thông qua một hàm được gọi là "hàm kích hoạt". Ban đầu, trọng số và độ chệch không được xác định. Các giá trị này 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 trên nhiều dữ liệu đã biết.

644f4213a4ee70e5.pngs

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 trên 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 ta sẽ sử dụng một hàm 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.

ef0d98c0952c262d.png d51252f75894479e.gif

Hệ số hao tổn entropy chéo

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 sẽ hoạt động, nhưng đối với các vấn đề phân loại, "khoảng cách entropy chéo" được gọi là hiệu quả nhất. Chúng tôi gọi hàm này là hàm lỗi hay hàm "mất":

7bdf8753d20617fb.png

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 mất mát entropy chéo. Sau đây là cách hoạt động của tính năng này.

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 tính toán đạo hàm riêng của entropy chéo tương ứng với tất cả các trọng số và tất cả các độ lệch, chúng ta sẽ thu được một "độ dốc", được tính toán cho một hình ảnh, nhãn và giá trị hiện tại của các trọng số và độ lệ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 các 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 quá trình này sẽ hội tụ đến một điểm mà entropy chéo ở mức 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.

gradient descent2.png

Tạo lô 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 và 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à các phương pháp 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 ở đó.

52e824fe4716c4a0.pngS

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ữ

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. Việc này giúp thuật toán hội tụ. Phương diện "bộ dữ liệu" thường là phương diện đầu tiên của 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).

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 tế bào thần kinh, trong đó mỗi tế bào thần kinh được kết nối với tất cả các tế bào thần kinh trong lớp trước.

tính năng: dữ liệu đầu vào của mạng nơron đôi khi được gọi là "tính năng". Nghệ thuật tìm ra những phần 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 kết quả dự đoán chính xác được gọi là "kỹ thuật xử lý đặc điểm".

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" hay còn gọi là "hàm sigmoid", từng là hàm kích hoạt phổ biến nhất. "Đầu ra nơron trước hàm logistic" bị rút gọ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á thành 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 được sửa đổi. Một hàm kích hoạt phổ biến cho các tế bào thần kinh.

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ơ, 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 là 1 để có thể được diễn giải là một vectơ xác suất. Được dùng làm bước cuối cùng trong các thuật toán 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ó tensor có 3, 4, 5 hoặc nhiều chiều.

4. Học chuyển giao

Đối với vấn đề phân loại hình ảnh, có thể các lớp dày đặc sẽ không đủ. Chúng ta cần tìm hiểu về các lớp convolutional và nhiều cách sắp xếp các lớp đó.

Nhưng chúng ta cũng có thể sử dụng một lối tắt! Bạn có thể tải các mạng nơron tích chập đã được huấn luyện đầy đủ xuống. Bạn có thể cắt bỏ lớp cuối cùng của họ, đầ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 đã 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 đổi và thật đáng kinh ngạc, 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.

Tự 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 cứ khi nào bạn thấy nhãn "WORK REQUIRED" (CẦN LÀM).

c3df49e90e5a654f.png 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 đổi việc học 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ây và cảnh ngoài trời, khá gần với hoa.

b8fc1efd2001f072.png

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 hoạt động của các lớp convolutional phức tạp này sau. Hiện tại, vấn đề là do người khác.

Học chuyển giao trong Keras

Trong Keras, bạn có thể tạo bản sao của một mô hình được 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 ý chế độ cài đặt pretrained_model.trainable = False. Hàm này sẽ cố định các trọng số và độ chệch của mô hình được huấn luyện trước để bạn chỉ huấn luyện lớp softmax. Việc này thường chỉ liên quan đến một số ít trọng số và có thể được thực hiện nhanh chóng mà không cần tập dữ liệu rất lớn. Tuy nhiên, nếu bạn có nhiều dữ liệu, thì việc học chuyển đổi có thể hoạt động hiệu quả hơn nữa với pretrained_model.trainable = True. Sau đó, 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 ý 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ơ dữ liệu phẳng, nhưng chúng ta không biết liệu đó có phải là kết quả mà 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ề 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

Dưới đây là sổ tay giải pháp. Bạn có thể sử dụng nếu gặp khó khăn.

c3df49e90e5a654f.png 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 bằng lớp cuối softmax và tổn thất entropy chéo
  • 😈 Học chuyển giao
  • 🤔 Đào tạo mô hình đầu tiên
  • 🧐 Theo dõi mức độ hao tổn và độ chính xác trong quá trình huấn 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.

TPU trong thực tế

TPU và GPU có trên Cloud AI Platform:

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ì đó không ổn trong lớp học này hoặc nếu bạn cho rằng lớp học này 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].

HR.png

Martin Görner ID nhỏ.jpg
Tác giả: Martin Görner
Twitter: @martin_gorner

tensorflow logo.jpg
www.tensorflow.org