Continnet hiện đại, Chromiumnet, Xception, với Keras và TPU

1. Tổng quan

Trong phòng thí nghiệm này, bạn sẽ tìm hiểu về kiến trúc tích chập hiện đại và sử dụng kiến thức của mình để triển khai một mạng chập đơn giản nhưng hiệu quả có tên là "chẳng hạn như "assenet".

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 tích chập 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.

Đây là Phần 4 của loạt bài "Keras trên 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

  • Tìm hiểu kiểu hàm Keras
  • Cách xây dựng một mô hình bằng kiến trúc cuộc vắt mạng
  • Sử dụng TPU nhằm đào tạo nhanh và lặp lại trên kiến trúc của bạn
  • Cách triển khai tính năng tăng cường dữ liệu bằng tf.data.dataset
  • Để tinh chỉnh một mô hình lớn đã được huấn luyện trước (Xception) trên TPU

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ể gửi ý kiến phản hồi thông qua các vấn đề trên GitHub [ đường liên kết phản hồi].

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 dành cho mục đích giáo dục. Trang web này cung cấp các khoá đà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à chạy qua một vài ô để 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ý tensor) 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 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 trên 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 cách 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ở mục 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 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] Bộ xử lý tensor (TPU) là gì?

Tóm tắt

f88cf6facfc70166.png

Mã để huấn luyện một mô hình trên TPU trong Keras (và quay lại sử dụng GPU hoặc CPU nếu không có TPU):

try: # detect TPUs
    tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()
    strategy = tf.distribute.TPUStrategy(tpu)
except ValueError: # detect GPUs
    strategy = tf.distribute.MirroredStrategy() # for CPU/GPU or multi-GPU machines

# use TPUStrategy scope to define model
with strategy.scope():
  model = tf.keras.Sequential( ... )
  model.compile( ... )

# train model normally on a tf.data.Dataset
model.fit(training_dataset, epochs=EPOCHS, steps_per_epoch=...)

Hôm nay, chúng tôi sẽ dùng TPU để xây dựng và tối ưu hoá một thuật toán phân loại hoa với tốc độ tương tác (số phút mỗi lượt chạy huấn luyện).

688858c21e3beff2.png

Tại sao nên chọn TPU?

Các GPU hiện đại được sắp xếp dựa trên các "lõi" có thể lập trình được, một cấu trúc rất linh hoạt cho phép chúng xử lý nhiều tác vụ như kết xuất 3D, học sâu, mô phỏng vật lý, v.v. Mặt khác, TPU ghép nối một bộ xử lý vectơ cổ điển với một đơn vị nhân ma trận chuyên dụng và vượt trội trong mọi tác vụ mà phép nhân ma trận lớn chiếm ưu thế, chẳng hạn như mạng nơron.

8eb3e718b8e2ed08.png

Hình minh hoạ: một lớp mạng nơron dày đặc dưới dạng phép nhân ma trận, với một loạt 8 hình ảnh được xử lý thông qua mạng nơron cùng một lúc. Vui lòng thực hiện phép nhân một dòng x cột để xác minh rằng hàm này thực sự đang tính tổng tất cả giá trị pixel của một hình ảnh có trọng số. Các lớp Convolutional cũng có thể được biểu diễn dưới dạng phép nhân ma trận, mặc dù phức tạp hơn một chút ( giải thích tại đây, trong phần 1).

Phần cứng

MXU và VPU

Lõi TPU v2 được tạo thành từ một Đơn vị nhân ma trận (MXU) chạy các phép nhân ma trận và một Đơn vị xử lý vectơ (VPU) cho tất cả các tác vụ khác như kích hoạt, softmax, v.v. VPU xử lý các phép tính float32 và int32. Mặt khác, MXU hoạt động ở định dạng dấu phẩy động 16-32 bit có độ chính xác hỗn hợp.

7d68944718f76b18.png

Dấu phẩy động có độ chính xác hỗn hợp và bfloat16

MXU tính toán phép nhân ma trận bằng cách sử dụng đầu vào bfloat16 và đầu ra float32. Các phép tích luỹ trung gian được thực hiện ở độ chính xác float32.

19c5fc432840c714.png

Quá trình huấn luyện mạng nơron thường có khả năng chống lại tiếng ồn do độ chính xác của dấu phẩy động giảm. Trong một số trường hợp, tiếng ồn thậm chí còn giúp trình tối ưu hoá hội tụ. Độ chính xác dấu phẩy động 16 bit thường được dùng để tăng tốc tính toán, nhưng định dạng float16 và float32 có phạm vi rất khác nhau. Việc giảm độ chính xác từ float32 xuống float16 thường dẫn đến hiện tượng tràn qua và chạy dưới luồng. Đã có các giải pháp nhưng thường thì bạn cần thực hiện thêm các thao tác để float16 hoạt động.

Đó là lý do Google giới thiệu định dạng bfloat16 trong TPU. bfloat16 là một float32 bị cắt bớt với số mũ và phạm vi giống hệt với float32. Điều này, cùng với việc TPU tính toán phép nhân ma trận ở độ chính xác kết hợp với đầu vào bfloat16 nhưng đầu ra float32, có nghĩa là thường thì bạn không cần thay đổi mã để hưởng lợi từ hiệu suất tăng lên khi giảm độ chính xác.

Mảng hệ thống

MXU triển khai các phép nhân ma trận trong phần cứng bằng cách sử dụng kiến trúc được gọi là "mảng tâm thu", trong đó các phần tử dữ liệu chuyển qua một mảng các đơn vị tính toán phần cứng. (Trong y học, "tâm thu" dùng để chỉ các cơn co thắt tim và lưu lượng máu, đây là dòng dữ liệu.)

Phần tử cơ bản của phép nhân ma trận là tích dấu chấm giữa một đường của một ma trận và một cột của ma trận khác (xem hình minh hoạ ở đầu phần này). Đối với phép nhân ma trận Y=X*W, một phần tử của kết quả sẽ là:

Y[2,0] = X[2,0]*W[0,0] + X[2,1]*W[1,0] + X[2,2]*W[2,0] + ... + X[2,n]*W[n,0]

Trên GPU, người ta sẽ lập trình sản phẩm chấm này thành một "lõi" GPU rồi thực thi trên số lượng "lõi" có sẵn song song để thử và tính toán mọi giá trị của ma trận thu được cùng một lúc. Nếu ma trận thu được có kích thước 128x128, thì bạn cần có 128x128=16K "lõi", điều này thường không thể thực hiện được. Các GPU lớn nhất có khoảng 4.000 lõi. Mặt khác, TPU sử dụng phần cứng tối thiểu cho các đơn vị điện toán trong MXU: chỉ bfloat16 x bfloat16 => float32 các giá trị tích luỹ, không có gì khác. Các phép tính này nhỏ đến mức TPU có thể triển khai 16K phép tính trong một MXU 128x128 và xử lý phép nhân ma trận này cùng một lúc.

f1b283fc45966717.gif

Hình minh hoạ: mảng tâm thu MXU. Các phần tử điện toán là bộ tích luỹ nhân. Các giá trị của một ma trận được tải vào mảng (các dấu chấm màu đỏ). Các giá trị của ma trận khác đi qua mảng (các chấm màu xám). Các đường dọc truyền giá trị lên trên. Các đường ngang truyền bá các tổng riêng. Người dùng sẽ được thực hành để xác minh rằng khi dữ liệu chảy qua mảng, bạn sẽ nhận được kết quả của phép nhân ma trận ở bên phải.

Ngoài ra, trong khi các tích vô hướng được tính trong một MXU, các tổng trung gian chỉ trao đổi qua lại giữa các đơn vị điện toán liền kề. Bạn không cần lưu trữ và truy xuất các giá trị này vào/từ bộ nhớ hoặc thậm chí là tệp đăng ký. Kết quả cuối cùng là kiến trúc mảng tâm thu TPU có lợi thế đáng kể về mật độ và năng lượng, đồng thời có lợi thế về tốc độ không nhỏ so với GPU khi tính toán các phép nhân ma trận.

Cloud TPU

Khi yêu cầu một "TPU trên đám mây phiên bản 2" trên Google Cloud Platform, bạn sẽ nhận được một máy ảo (VM) có bo mạch TPU gắn PCI. Bảng TPU có 4 khối TPU lõi kép. Mỗi lõi TPU có một VPU (Bộ xử lý vectơ) và một MXU 128x128 (Bộ nhân ma trận). Sau đó, "TPU trên đám mây" này thường được kết nối thông qua mạng với máy ảo đã yêu cầu. Do đó, toàn bộ thông tin sẽ có dạng như sau:

dfce5522ed644ece.png

Hình minh hoạ: máy ảo của bạn có trình tăng tốc "Cloud TPU" được gắn mạng. Bản thân "Cloud TPU" được tạo thành từ một máy ảo có bo mạch TPU gắn PCI với 4 khối TPU lõi kép trên đó.

Nhóm TPU

Trong các trung tâm dữ liệu của Google, TPU được kết nối với một kết nối điện toán hiệu suất cao (HPC). Nhờ vậy, chúng có thể xuất hiện như một trình tăng tốc rất lớn. Google gọi chúng là các nhóm và chúng có thể bao gồm tối đa 512 lõi TPU v2 hoặc 2048 lõi TPU v3.

2ec1e0d341e7fc34.jpeg

Hình minh hoạ: một nhóm TPU phiên bản 3. Các bo mạch và giá đỡ TPU được kết nối thông qua kết nối HPC.

Trong quá trình huấn luyện, độ dốc được trao đổi giữa các nhân TPU bằng cách sử dụng thuật toán all-reduce ( giải thích rõ về all-reduce ở đây). Mô hình đang được huấn luyện có thể tận dụng phần cứng bằng cách huấn luyện trên các lô lớn.

d97b9cc5d40fdb1d.gif

Hình minh hoạ: đồng bộ hoá độ dốc trong quá trình huấn luyện bằng thuật toán giảm tất cả trên mạng HPC lưới 2-D của Google TPU.

Phần mềm

Huấn luyện với kích thước lô lớn

Kích thước lô lý tưởng cho TPU là 128 mục dữ liệu trên mỗi lõi TPU, nhưng phần cứng đã có thể hiển thị khả năng sử dụng tốt từ 8 mục dữ liệu trên mỗi lõi TPU. Hãy nhớ rằng một Cloud TPU có 8 lõi.

Trong lớp học lập trình này, chúng ta sẽ sử dụng Keras API. Trong Keras, lô bạn chỉ định là kích thước lô toàn cục cho toàn bộ TPU. Các lô của bạn sẽ tự động được chia thành 8 và chạy trên 8 lõi của TPU.

da534407825f01e3.png

Để biết thêm các mẹo về hiệu suất, hãy xem Hướng dẫn về hiệu suất của TPU. Đối với các kích thước lô rất lớn, bạn có thể cần phải đặc biệt chú ý trong một số mô hình. Hãy xem LARSOptimizer để biết thêm chi tiết.

Nâng cao: XLA

Chương trình Tensorflow xác định biểu đồ tính toán. TPU không trực tiếp chạy mã Python mà chạy biểu đồ tính toán do chương trình Tensorflow xác định. Trong phần nội dung, một trình biên dịch có tên XLA (trình biên dịch Đại số tuyến tính tăng tốc) sẽ chuyển đổi biểu đồ Tensorflow của các nút tính toán thành mã máy TPU. Trình biên dịch này cũng thực hiện nhiều hoạt động tối ưu hoá nâng cao trên mã và bố cục bộ nhớ của bạn. Quá trình biên dịch diễn ra tự động khi công việc được gửi đến TPU. Bạn không cần phải đưa XLA vào chuỗi xây dựng một cách rõ ràng.

edce61112cd57972.png

Hình minh hoạ: để chạy trên TPU, trước tiên, đồ thị tính toán do chương trình Tensorflow xác định sẽ được dịch sang biểu diễn XLA (trình biên dịch đại số tuyến tính tăng tốc), sau đó được XLA biên dịch thành mã máy TPU.

Sử dụng TPU trong Keras

TPU được hỗ trợ thông qua API Keras kể từ Tensorflow 2.1. Tính năng hỗ trợ của Keras hoạt động trên các nhóm TPU và TPU. Sau đây là một ví dụ hoạt động trên TPU, GPU và CPU:

try: # detect TPUs
    tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()
    strategy = tf.distribute.TPUStrategy(tpu)
except ValueError: # detect GPUs
    strategy = tf.distribute.MirroredStrategy() # for CPU/GPU or multi-GPU machines

# use TPUStrategy scope to define model
with strategy.scope():
  model = tf.keras.Sequential( ... )
  model.compile( ... )

# train model normally on a tf.data.Dataset
model.fit(training_dataset, epochs=EPOCHS, steps_per_epoch=...)

Trong đoạn mã này:

  • TPUClusterResolver().connect() tìm thấy TPU trên mạng. Công cụ này hoạt động mà không cần tham số trên hầu hết các hệ thống Google Cloud (công việc trên Nền tảng AI, Colaboratory, Kubeflow, máy ảo Học sâu được tạo thông qua tiện ích "ctpu up"). Những hệ thống này biết được TPU của chúng ở đâu nhờ một biến môi trường TPU_NAME. Nếu bạn tạo một TPU theo cách thủ công, hãy đặt môi trường TPU_NAME trên máy ảo mà bạn đang sử dụng hoặc gọi TPUClusterResolver với các tham số rõ ràng: TPUClusterResolver(tp_uname, zone, project)
  • TPUStrategy là bộ phận triển khai quá trình phân phối và thuật toán đồng bộ hoá độ dốc "all-reduce".
  • Chiến lược được áp dụng thông qua một phạm vi. Mô hình phải được xác định trong phạm vi chiến lược().
  • Hàm tpu_model.fit cần một đối tượng tf.data.Dataset làm dữ liệu đầu vào để huấn luyện TPU.

Các thao tác phổ biến khi chuyển TPU

  • Mặc dù có nhiều cách tải dữ liệu trong mô hình Tensorflow, nhưng đối với TPU, bạn bắt buộc phải sử dụng API tf.data.Dataset.
  • TPU rất nhanh và việc nhập dữ liệu thường trở thành điểm tắc nghẽn khi chạy trên chúng. Bạn có thể sử dụng các công cụ để phát hiện điểm tắc nghẽn về dữ liệu và các mẹo khác về hiệu suất trong Hướng dẫn về hiệu suất của TPU.
  • Số int8 hoặc int16 được coi là int32. TPU không có phần cứng số nguyên hoạt động dưới 32 bit.
  • Một số thao tác Tensorflow không được hỗ trợ. Danh sách này có tại đây. Tin vui là giới hạn này chỉ áp dụng cho mã huấn luyện, tức là truyền dữ liệu qua lại qua mô hình của bạn. Bạn vẫn có thể sử dụng tất cả các thao tác Tensorflow trong quy trình nhập dữ liệu vì quy trình này sẽ được thực thi trên CPU.
  • tf.py_func không được hỗ trợ trên TPU.

4. [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 mới bắt đầu tìm hiểu về học sâu, vui lòng đọc tiếp.

Đối với các mô hình được tạo dưới dạng một trình tự các lớp, Keras cung cấp API Tuần tự. Ví dụ: một trình 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, ... )

688858c21e3beff2.png

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.

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 điểm ảnh 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, hoạt động, RELU

Một "neuron" (tế bào thần kinh) tính toán tổng trọng số của tất cả các đầu vào, thêm một giá trị gọi là "độ lệch" và đưa kết quả vào thông qua một "hàm kích hoạt". Ban đầu, chúng ta không biết trọng số và độ lệch. Chúng sẽ được khởi tạo ngẫu nhiên và "học được" bằng cách huấn luyện mạng nơron dựa 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 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 danh mục (hoa hồng, hoa tulip, hoa 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, trong 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 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".

Bạn có thể áp dụng hàm softmax cho một vectơ bằng cách lấy hàm mũ của mỗi phần tử rồi chuẩn hoá vectơ, thường là bằng cách sử dụng chuẩn 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 diễn giải 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 hoạt động, 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" 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 ra 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 sao cho giảm thiểu hàm mất entropy. 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 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 có vẻ như là một công việc rất lớn. 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ì chúng ta muốn đi đến nơi có entropy chéo 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à độ lệch bằng một phần của độ dốc. Sau đó, chúng ta lặp lại thao tá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 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.

gradient descent2.png

Nhóm nhỏ và động lượng

Bạn có thể chỉ tính toán độ dốc trên một hình ảnh mẫu và cập nhật trọng số và độ lệch ngay lập tức, nhưng việc làm như vậy trên một lô, ví dụ: 128 hình ảnh sẽ cho ra một độ dốc thể hiện tốt hơn các quy tắc ràng buộc do các hình ảnh mẫu khác nhau áp đặt, do đó có thể hội tụ nhanh hơn đến 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 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. Điều đó có nghĩa là chúng ta đã tìm thấy giá trị 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 một 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, thì xác suất để mỗi phần tử bằng 0 tương ứng với một giá trị tối thiểu và không có phần tử nào tương ứng với một giá trị tối đa là khá nhỏ. Trong không gian 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 ở đó.

52e824fe4716c4a0.pngS

Hình minh hoạ: điểm yên ngựa. Độ 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ữ

hàng loạt hoặc hàng loạt 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ụ. Tham số "lô" thường là tham số đầ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).

tổn thất entropy chéo: một hàm tổn thất đặc biệt thường được dùng trong các 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: đầ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" 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

neuron: tính tổng trọng số của các đầu vào, thêm một độ lệch và truyền kết quả thông qua một hàm kích hoạt.

mã hoá one-hot: lớp 3/5 được mã hoá dưới dạng một vectơ gồm 5 phần tử, tất cả đều bằng 0 ngoại trừ phần tử 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 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ư một ma trận nhưng có số chiều 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.

5. [INFO] Mạng nơron tích chập

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 mới bắt đầu tìm hiểu về mạng nơron tích chập, vui lòng đọc tiếp.

convolutional.gif

Hình minh hoạ: lọc hình ảnh bằng hai bộ lọc liên tiếp, mỗi bộ lọc có 4x4x3=48 trọng số có thể học.

Sau đây là giao diện của một mạng nơron tích chập đơn giản trong Keras:

model = tf.keras.Sequential([
  # input: images of size 192x192x3 pixels (the three stands for RGB channels)
  tf.keras.layers.Conv2D(kernel_size=3, filters=24, padding='same', activation='relu', input_shape=[192, 192, 3]),
  tf.keras.layers.Conv2D(kernel_size=3, filters=24, padding='same', activation='relu'),
  tf.keras.layers.MaxPooling2D(pool_size=2),
  tf.keras.layers.Conv2D(kernel_size=3, filters=12, padding='same', activation='relu'),
  tf.keras.layers.MaxPooling2D(pool_size=2),
  tf.keras.layers.Conv2D(kernel_size=3, filters=6, padding='same', activation='relu'),
  tf.keras.layers.Flatten(),
  # classifying into 5 categories
  tf.keras.layers.Dense(5, activation='softmax')
])

model.compile(
  optimizer='adam',
  loss= 'categorical_crossentropy',
  metrics=['accuracy'])

688858c21e3beff2.pngS

Mạng nơron tích chập 101

Trong một lớp của mạng tích chập, một "nơ-ron" thực hiện tổng số pixel có trọng số ngay phía trên lớp đó, chỉ qua một vùng nhỏ của hình ảnh. Phương thức này thêm độ chệch và cung cấp giá trị tổng thông qua một hàm kích hoạt, giống như một nơron trong một lớp dày đặc thông thường. Sau đó, thao tác này được lặp lại trên toàn bộ hình ảnh bằng cách sử dụng cùng một trọng số. Hãy nhớ rằng trong các lớp dày đặc, mỗi nơron có trọng số riêng. Ở đây, một "miếng vá" trọng số trượt trên hình ảnh theo cả hai hướng ("convolution" – tích chập). Đầu ra có nhiều giá trị như pixel trong hình ảnh (tuy nhiên, cần có một số khoảng đệm ở các cạnh). Đây là một phép toán lọc, sử dụng bộ lọc có trọng số 4x4x3=48.

Tuy nhiên, 48 trọng số là không đủ. Để thêm nhiều bậc tự do hơn, chúng ta lặp lại cùng một phép toán với một bộ trọng số mới. Thao tác này sẽ tạo ra một tập hợp đầu ra bộ lọc mới. Hãy gọi nó là "kênh" của các đầu ra bằng cách tương tự với các kênh R,G,B trong hình ảnh đầu vào.

Ảnh chụp màn hình 29/07/2016 lúc 16.02.37.png

Hai (hoặc nhiều) tập hợp trọng số có thể được tổng hợp dưới dạng một tensor bằng cách thêm một chiều mới. Điều này cho chúng ta hình dạng chung của tensor trọng số cho một lớp tích chập. Vì số lượng kênh đầu vào và đầu ra là các tham số, nên chúng ta có thể bắt đầu xếp chồng và tạo chuỗi các lớp convolutional.

d1b557707bcd1cb9.png

Hình minh hoạ: một mạng nơron tích chập biến đổi các "khối" dữ liệu thành các "khối" dữ liệu khác.

Số tích chập chậm, gộp tối đa

Bằng cách thực hiện phép tích chập với bước là 2 hoặc 3, chúng ta cũng có thể thu nhỏ khối dữ liệu thu được theo chiều ngang. Có hai cách phổ biến để thực hiện việc này:

  • Động lực xoá bỏ theo bước: một bộ lọc trượt như trên nhưng có bước >1
  • Gộp tối đa: một cửa sổ trượt áp dụng thao tác MAX (thường là trên 2x2 bản vá, lặp lại mỗi 2 pixel)

2b2d4263bb8470b.gif

Hình minh hoạ: trượt cửa sổ tính toán 3 pixel dẫn đến giá trị đầu ra ít hơn. Tích chập sải chân hoặc gộp nhóm tối đa (tối đa trên cửa sổ 2x2 trượt với một sải chân là 2) là một cách thu gọn khối dữ liệu theo kích thước ngang.

Thuật toán phân loại dựa trên môi trường

Cuối cùng, chúng tôi đính kèm phần đầu phân loại bằng cách làm phẳng khối dữ liệu cuối cùng và đưa khối này qua một lớp dày đặc, được kích hoạt bằng max mềm. Một thuật toán phân loại tích chập điển hình có thể có dạng như sau:

4a61aaffb6cba3d1.png

Hình minh hoạ: một thuật toán phân loại hình ảnh sử dụng các lớp tích chập và softmax. Sử dụng bộ lọc 3x3 và 1x1. Các lớp maxpool lấy giá trị tối đa của các nhóm gồm 2x2 điểm dữ liệu. Phần đầu phân loại được triển khai bằng một lớp dày đặc có kích hoạt softmax.

Trong Keras

Bạn có thể viết ngăn xếp tích chập được minh hoạ ở trên trong Keras như sau:

model = tf.keras.Sequential([
  # input: images of size 192x192x3 pixels (the three stands for RGB channels)    
  tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu', input_shape=[192, 192, 3]),
  tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
  tf.keras.layers.MaxPooling2D(pool_size=2),
  tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu'),
  tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
  tf.keras.layers.MaxPooling2D(pool_size=2),
  tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu'),
  tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
  tf.keras.layers.MaxPooling2D(pool_size=2),
  tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu'),
  tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
  tf.keras.layers.MaxPooling2D(pool_size=2),
  tf.keras.layers.Conv2D(kernel_size=3, filters=16, padding='same', activation='relu'),
  tf.keras.layers.Conv2D(kernel_size=1, filters=8, padding='same', activation='relu'),
  tf.keras.layers.Flatten(),
  # classifying into 5 categories
  tf.keras.layers.Dense(5, activation='softmax')
])

model.compile(
  optimizer='adam',
  loss= 'categorical_crossentropy',
  metrics=['accuracy'])

6. [THÔNG TIN MỚI] Kiến trúc tích chập hiện đại

Tóm tắt

7968830b57b708c0.png.

Hình minh hoạ: một "mô-đun" tích chập. Tại thời điểm này, tính năng nào là tốt nhất? Một lớp hồ bơi tối đa theo sau là một lớp tích chập 1x1 hoặc một sự kết hợp khác của các lớp? Hãy thử tất cả, nối các kết quả và để mạng quyết định. Ở bên phải: cấu trúc tích luỹ " inception" sử dụng các mô-đun như vậy.

Trong Keras, để tạo các mô hình mà luồng dữ liệu có thể phân nhánh vào và ra, bạn phải sử dụng kiểu mô hình "chức năng". Dưới đây là ví dụ:

l = tf.keras.layers # syntax shortcut

y = l.Conv2D(filters=32, kernel_size=3, padding='same',
             activation='relu', input_shape=[192, 192, 3])(x) # x=input image

# module start: branch out
y1 = l.Conv2D(filters=32, kernel_size=1, padding='same', activation='relu')(y)
y3 = l.Conv2D(filters=32, kernel_size=3, padding='same', activation='relu')(y)
y = l.concatenate([y1, y3]) # output now has 64 channels
# module end: concatenation

# many more layers ...

# Create the model by specifying the input and output tensors.
# Keras layers track their connections automatically so that's all that's needed.
z = l.Dense(5, activation='softmax')(y)
model = tf.keras.Model(x, z)

688858c21e3beff2.png

Các mánh khóe rẻ tiền khác

Bộ lọc 3x3 nhỏ

40a7b15fb7dbe75c.png

Trong hình minh hoạ này, bạn thấy kết quả của hai bộ lọc 3x3 liên tiếp. Hãy cố gắng truy ngược lại những điểm dữ liệu nào đã đóng góp vào kết quả: hai bộ lọc 3x3 liên tiếp này tính toán một số kết hợp của vùng 5x5. Đây không phải là sự kết hợp chính xác mà bộ lọc 5x5 sẽ tính toán nhưng đáng để thử vì hai bộ lọc 3x3 liên tiếp rẻ hơn so với một bộ lọc 5x5 duy nhất.

số tích chập 1x1 ?

fd7cac16f8ecb423.png

Về mặt toán học, phép tích chập "1x1" là phép nhân với một hằng số, không phải là một khái niệm hữu ích. Tuy nhiên, trong mạng nơron tích chập, hãy nhớ rằng bộ lọc được áp dụng cho một khối dữ liệu chứ không chỉ hình ảnh 2D. Do đó, bộ lọc "1x1" sẽ tính tổng trọng số của cột dữ liệu 1x1 (xem hình minh hoạ) và khi trượt bộ lọc đó trên dữ liệu, bạn sẽ nhận được tổ hợp tuyến tính của các kênh đầu vào. Thông tin này thực sự hữu ích. Nếu bạn coi các kênh là kết quả của các hoạt động lọc riêng lẻ, ví dụ: bộ lọc cho "tai nhọn", một bộ lọc khác cho "râu" và một bộ lọc thứ ba cho "mắt xẻ" thì lớp tích chập "1x1" sẽ tính toán nhiều tổ hợp tuyến tính có thể có của các tính năng này, có thể hữu ích khi tìm kiếm "mèo". Ngoài ra, lớp 1x1 sử dụng ít trọng số hơn.

7. Squeezenet

Một cách đơn giản để kết hợp các ý tưởng này đã được giới thiệu trong tài liệu "Squeezenet". Các tác giả đề xuất một thiết kế mô-đun tích chập rất đơn giản, chỉ sử dụng các lớp tích chập 1x1 và 3x3.

1730ac375379269b.png

Hình minh hoạ: kiến trúc squeezenet dựa trên "các mô-đun kích hoạt". Các lớp này luân phiên một lớp 1x1 "nén" dữ liệu đến theo chiều dọc, theo sau là hai lớp convolutional 1x1 và 3x3 song song "mở rộng" lại chiều sâu của dữ liệu.

Thực hành

Tiếp tục trong sổ tay trước của bạn và xây dựng một mạng nơron tích chập lấy cảm hứng từ vắt. Bạn sẽ phải thay đổi mã mô hình thành "kiểu chức năng" Keras.

c3df49e90e5a654f.png Keras_Flowers_TPU (playground).ipynb

Thông tin bổ sung

Sẽ rất hữu ích cho bài tập này khi xác định hàm trợ giúp cho mô-đun scramblenet:

def fire(x, squeeze, expand):
  y = l.Conv2D(filters=squeeze, kernel_size=1, padding='same', activation='relu')(x)
  y1 = l.Conv2D(filters=expand//2, kernel_size=1, padding='same', activation='relu')(y)
  y3 = l.Conv2D(filters=expand//2, kernel_size=3, padding='same', activation='relu')(y)
  return tf.keras.layers.concatenate([y1, y3])

# this is to make it behave similarly to other Keras layers
def fire_module(squeeze, expand):
  return lambda x: fire(x, squeeze, expand)

# usage:
x = l.Input(shape=[192, 192, 3])
y = fire_module(squeeze=24, expand=48)(x) # typically, squeeze is less than expand
y = fire_module(squeeze=32, expand=64)(y)
...
model = tf.keras.Model(x, y)

Mục tiêu lần này là đạt độ chính xác 80%.

Những việc nên thử

Bắt đầu với một lớp convolutional, sau đó tiếp tục với "fire_modules", xen kẽ với các lớp MaxPooling2D(pool_size=2). Bạn có thể thử nghiệm với 2 đến 4 lớp gộp tối đa trong mạng và cũng có 1, 2 hoặc 3 mô-đun lửa liên tiếp giữa các lớp gộp tối đa.

Trong các mô-đun phát, thông số "squeeze" (nén) thường phải nhỏ hơn thông số "expand" (mở rộng). Các tham số này thực sự là số lượng bộ lọc. Thông thường, chúng có thể dao động từ 8 đến 196. Bạn có thể thử nghiệm cấu trúc có số lượng bộ lọc tăng dần qua mạng hoặc cấu trúc đơn giản trong đó tất cả các mô-đun báo cháy đều có cùng số bộ lọc.

Dưới đây là ví dụ:

x = tf.keras.layers.Input(shape=[*IMAGE_SIZE, 3]) # input is 192x192 pixels RGB

y = tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu')(x)
y = fire_module(24, 48)(y)
y = tf.keras.layers.MaxPooling2D(pool_size=2)(y)
y = fire_module(24, 48)(y)
y = tf.keras.layers.MaxPooling2D(pool_size=2)(y)
y = fire_module(24, 48)(y)
y = tf.keras.layers.GlobalAveragePooling2D()(y)
y = tf.keras.layers.Dense(5, activation='softmax')(y)

model = tf.keras.Model(x, y)

Tại thời điểm này, bạn có thể nhận thấy rằng các thử nghiệm của mình không diễn ra suôn sẻ cho lắm và mục tiêu độ chính xác 80% có vẻ xa vời. Đã đến lúc thực hiện một vài thủ thuật rẻ hơn nữa.

Chuẩn hoá theo lô

Lô chuẩn sẽ giúp khắc phục vấn đề về việc hội tụ mà bạn đang gặp phải. Chúng tôi sẽ giải thích chi tiết về kỹ thuật này trong hội thảo tiếp theo. Hiện tại, vui lòng sử dụng kỹ thuật này làm trình trợ giúp "ma thuật" hộp đen bằng cách thêm dòng này sau mỗi lớp convolutional trong mạng, bao gồm cả các lớp bên trong hàm fire_module:

y = tf.keras.layers.BatchNormalization(momentum=0.9)(y)
# please adapt the input and output "y"s to whatever is appropriate in your context

Bạn phải giảm tham số động lượng từ giá trị mặc định là 0,99 xuống 0,9 vì tập dữ liệu của chúng ta có kích thước nhỏ. Bây giờ, bạn đừng để ý đến thông tin này.

Mở rộng dữ liệu

Bạn sẽ nhận được thêm một vài điểm phần trăm bằng cách tăng cường dữ liệu bằng các phép biến đổi dễ dàng như lật thay đổi độ bão hoà từ trái sang phải:

4ed2958e09b487ca.png

ad795b70334e0d6b.png

Bạn có thể thực hiện việc này một cách dễ dàng trong Tensorflow bằng API tf.data.Dataset. Xác định hàm biến đổi mới cho dữ liệu:

def data_augment(image, label):
    image = tf.image.random_flip_left_right(image)
    image = tf.image.random_saturation(image, lower=0, upper=2)
    return image, label

Sau đó, sử dụng hàm này trong quá trình biến đổi dữ liệu cuối cùng (ô "training and validation datasets" (dữ liệu tập huấn và dữ liệu xác thực), hàm "get_batched_dataset"):

dataset = dataset.repeat() # existing line
# insert this
if augment_data:
  dataset = dataset.map(data_augment, num_parallel_calls=AUTO)
dataset = dataset.shuffle(2048) # existing line

Đừng quên không bắt buộc phải tăng cường dữ liệu và thêm mã cần thiết để đảm bảo chỉ tập dữ liệu huấn luyện mới được tăng cường. Việc tăng cường tập dữ liệu xác thực là không hợp lý.

Giờ đây, bạn có thể đạt được độ chính xác 80% trong 35 epoch.

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_TPU_squeezenet.ipynb

Nội dung đã đề cập

  • 🤔 Mô hình "kiểu hàm" Keras
  • 🤓 Kiến trúc Squeezenet
  • 🤓 Tăng cường dữ liệu bằng tf.data.datset

Vui lòng dành chút thời gian để xem danh sách kiểm tra này trong đầu bạn.

8. Tinh chỉnh Xception

Tích chập tách biệt

Gần đây, một cách triển khai lớp tích chập khác đã trở nên phổ biến: tích chập có thể tách biệt chiều sâu. Tôi biết, câu chuyện này khá hấp dẫn nhưng lại khá đơn giản. Các lớp này được triển khai trong Tensorflow và Keras dưới dạng tf.keras.layers.SeparableConv2D.

Một phép tích chập có thể tách rời cũng chạy một bộ lọc trên hình ảnh, nhưng sử dụng một tập hợp trọng số riêng biệt cho mỗi kênh của hình ảnh đầu vào. Theo sau là "tích chập 1x1", một chuỗi các sản phẩm chấm tạo ra tổng có trọng số của các kênh được lọc. Với trọng số mới mỗi lần, hệ thống sẽ tính toán nhiều kết hợp trọng số của các kênh nếu cần.

615720b803bf8dda.gif

Hình minh hoạ: phép tích chập có thể tách rời. Giai đoạn 1: tích chập có bộ lọc riêng cho mỗi kênh. Giai đoạn 2: tái kết hợp tuyến tính của các kênh. Lặp lại với một tập hợp trọng số mới cho đến khi đạt được số lượng kênh đầu ra mong muốn. Bạn cũng có thể lặp lại Giai đoạn 1, mỗi lần với trọng số mới, nhưng trong thực tế, điều này hiếm khi xảy ra.

Các phép tích chập có thể tách biệt được sử dụng trong hầu hết các cấu trúc mạng nơron tích chập mới nhất: MobileNetV2, Xception, EfficientNet. Nhân tiện, trước đây MobileNetV2 là công cụ bạn đã dùng để học chuyển giao.

Chúng rẻ hơn so với phép tích chập thông thường và được chứng minh là có hiệu quả tương đương trong thực tế. Dưới đây là số lượng trọng số cho ví dụ minh hoạ ở trên:

Lớp tích chập: 4 x 4 x 3 x 5 = 240

Lớp tích chập có thể tách biệt: 4 x 4 x 3 + 3 x 5 = 48 + 15 = 63

Đây là bài tập cho người đọc để tính toán số phép nhân cần thiết để áp dụng từng kiểu tỷ lệ lớp convolutional theo cách tương tự. Các phép tích chập có thể tách rời nhỏ hơn và hiệu quả tính toán cao hơn nhiều.

Tự thực hành

Khởi động lại từ sổ tay "tự học chuyển đổi", nhưng lần này hãy chọn Xception làm mô hình được huấn luyện trước. Xception chỉ sử dụng các phép tích chập riêng biệt. Để tất cả các trọng số có thể huấn luyện. Chúng ta sẽ tinh chỉnh các trọng số được huấn luyện trước trên dữ liệu của mình thay vì sử dụng các lớp được huấn luyện trước như vậy.

c3df49e90e5a654f.png Keras Flowers transfer learning (playground).ipynb

Mục tiêu: độ chính xác > 95% (Không, thật sự là hoàn toàn có thể!)

Đây là bài tập cuối cùng nên cần nhiều mã và công việc khoa học dữ liệu hơn một chút.

Thông tin bổ sung về cách tinh chỉnh

Xception có trong các mô hình được huấn luyện trước chuẩn trong tf.keras.application.* Lần này, đừng quên để tất cả các mức tạ đều có thể tập luyện.

pretrained_model = tf.keras.applications.Xception(input_shape=[*IMAGE_SIZE, 3],
                                                  include_top=False)
pretrained_model.trainable = True

Để có kết quả tốt khi tinh chỉnh một mô hình, bạn cần chú ý đến tốc độ học và sử dụng lịch biểu tốc độ học có thời gian tăng dần. Chẳng hạn như:

9b1af213b2b36d47.pngS

Việc bắt đầu với tốc độ học tiêu chuẩn sẽ làm gián đoạn các trọng số được huấn luyện trước của mô hình. Việc bắt đầu lưu giữ dần các biến đó cho đến khi mô hình đã chốt dựa trên dữ liệu của bạn có thể sửa đổi chúng theo cách hợp lý. Sau khi hết giai đoạn này, bạn có thể tiếp tục với tốc độ học không đổi hoặc giảm dần theo cấp số nhân.

Trong Keras, tốc độ học được chỉ định thông qua một lệnh gọi lại, trong đó bạn có thể tính toán tốc độ học thích hợp cho mỗi epoch. Keras sẽ truyền tốc độ học chính xác đến trình tối ưu hoá cho mỗi epoch.

def lr_fn(epoch):
  lr = ...
  return lr

lr_callback = tf.keras.callbacks.LearningRateScheduler(lr_fn, verbose=True)

model.fit(..., callbacks=[lr_callback])

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 07_Keras_Flowers_TPU_xception_fine_tuned_best.ipynb

Nội dung đã đề cập

  • 🤔 Biến đổi tích chập có thể phân tách chiều sâu
  • 🤓 Lịch biểu tốc độ học
  • 😈 Tinh chỉnh một mô hình đã được huấn luyện trước.

Vui lòng dành chút thời gian để xem lại danh sách kiểm tra này.

9. Xin chúc mừng!

Bạn đã xây dựng mạng nơron tích chập hiện đại đầu tiên và huấn luyện mạng đó đạt độ chính xác trên 90%, lặp lại quá trình huấn luyện liên tiếp chỉ trong vài phút nhờ TPU. Đây là nội dung khép lại 4 "lớp học lập trình về TPU":

TPU trong thực tế

TPU và GPU có trên Nền tảng AI trên đám mây:

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ể gửi ý kiến phản hồi thông qua các vấn đề trên GitHub [ đường liên kết phản hồi].

HR.png

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

logo tensorflow.jpg
www.tensorflow.org