+ Được bổ sung thêm chất chống lão hóa nên chịu được tác động tiêu cực từ tia UV, tia cực tím, nước mưa chứa axit. + Có màu sắc đa dạng, rất thời trang. Ngoài các thông tin kể trên, quý khách có nhu cầu tìm hiểu thêm về bạt che hãy liên hệ với chúng tôi để được phục vụ. Show
Bạt dứa kẻ đen xanh Công ty Minh Sơn chuyên sản xuất và cung cấp bạt công trình - Minh Sơn hân hạnh được phục vụ quý khách. Chúng tôi tự hào là một trong những công ty cung cấp vật liệu hàng đầu trên thị trường với các sản phẩm Bạt công trình, màng PE, cuộn xốp nổ, băng dính các loại. Trong thị trường biến động hiện nay, chúng tôi luôn học hỏi, trau dồi bản thân để nâng cao chất lượng sản phẩm đến tay người tiêu dùng. Công nghệ hóa, hiện đại hóa quy trình sản xuất tối ưu nhất. Nhân công được đào tạo, trau dồi, tích lũy kinh nghiệm mỗi ngày. Các loại bạt đều được chúng tôi đan dệt cẩn thận. Khâu viền bạt chắc chắn, đều đặn từng đường kim mũi chỉ. Khuy dập cứng cáp, khó bị bung bật trong quá trình sử dụng. Nếu bạn muốn biết thêm thông tin, xin vui lòng liên hệ với chúng tôi. Chúng tôi rất mong được hợp tác với các bạn với chất lượng cao của chúng tôi với giá cả hợp lý. Trong quá trình xây dựng mô hình chắc hẳn bạn đã gặp tình huống mô hình của bạn dự báo không chuẩn xác. Mặc dù đã áp dụng những kiến trúc phức tạp và được coi là state-of-art. Bạn nghi ngờ vấn đề nằm ở dữ liệu gán nhãn sai nhưng kiểm tra cho thấy vấn đề không nằm ở gán nhãn. Bạn loay hoay với câu hỏi tại sao mô hình không chuẩn xác? Quá trình huấn luyện một mô hình AI trên bộ dữ liệu của bạn ngay từ đầu đôi khi dẫn tới kết quả không thực sự tốt và lãng phí tài nguyên tính toán. Trong bài viết này mình sẽ giải thích những nguyên nhân chính dẫn tới việc huấn luyện mô hình không hiệu quả. Đồng thời giới thiệu một phương pháp được áp dụng phổ biến giúp cải thiện độ chính xác và tiết kiệm chi phí thời gian huấn luyện. Phương pháp được xây dựng dựa trên ý tưởng chuyển giao tri thức đã được học từ những mô hình tốt trước đó. Đó chính là transfer learning, các bạn cùng tìm hiểu qua bài viết này nhé. 1.1. Nguyên nhân mô hình dự báo kémGiả sử rằng chúng ta bỏ qua những vấn đề liên quan đến sự cố dữ liệu như gán nhãn sai, ảnh mập mờ, bị che khuất, vân vân,…. Thông thường mô hình dự báo kém là do:
1 2 4 chúng ta có thể thiết lập schedule learning thông qua CheckPoint như sau: 1 2 3 4 5 6 7 8 9 10 11 import tensorflow as tf def scheduler(epoch): if epoch < 10: else: callback = tf.keras.callbacks.LearningRateScheduler(scheduler)
your_model.fit(data, labels, epochs=100, callbacks=[callback],
1.2. Vai trò của transfer learning1.2.1. Chuyển giao tri thứcTrong quá trình bùng nổ của deep learning, các tài nguyên về AI ngày càng dồi dào. Song song với quá trình phát triển đó,ngày càng có nhiều các pretrained-model có chất lượng tốt và độ chính xác cao. Hầu như mọi domain đều có thể tìm kiếm được các pretrained-model. Lý thuyết về transfer learning được Lorien Pratt thực nghiệm lần đầu năm 1993 và sau đó viết lại nó dưới dạng một lý thuyết toán học vào năm 1998 đã hiện thực hóa ý tưởng về chuyển giao tri thức giữa các mô hình như giữa con người với nhau. Một mô hình đã có khả năng tận dụng lại các tri thức đã huấn luyện trước đó và cải thiện lại trên tác vụ phân loại của nó. 1.2.2. Cải thiện accuracy và tiết kiệm chi phí huấn luyệnVí dụ trong bài toán phân loại chó và mèo. Nếu huấn luyện từ đầu, bạn sẽ tốn nhiều epochs huấn luyện hơn để đạt được độ chính xác cao. Tuy nhiên nếu bạn biết tận dụng lại các pretrained-model thì sẽ cần ít epochs huấn luyện hơn để đạt được một độ chính xác mong đợi. Thậm chí độ chính xác có thể lớn hơn so với khi không áp dụng transfer learning. Hình 1: Sơ đồ so sánh hiệu suất mô hình trước và sau khi áp dụng transfer learning. (Nguồn: Handbook Of Research On Machine Learning Applications and Trends: Algorithms, Methods and Techniques). Từ đồ thị ta có thể thấy sử dụng transfer learning sẽ mang lại 3 lợi thế chính:
1.2.3. Hiệu quả với dữ liệu nhỏTrong trường hợp bộ dữ liệu có kích thước quá nhỏ và khó có thể tìm kiếm và mở rộng thêm thì các mô hình được huấn luyện từ chúng sẽ khó có thể dự báo tốt. Tận dụng lại tri thức từ các pretrained-model với cùng tác vụ phân loại sẽ giúp các mô hình được huấn luyện dự báo tốt hơn với dữ liệu mới vì mô hình được học trên cả 2 nguồn tri thức đó là dữ liệu huấn luyện và dữ liệu mà nó đã được học trước đó. 2. Transfer Learning2.1. Ví dụ về transfer learningQuá trình áp dụng tri thức đã được học từ một mô hình trước sang bài toán hiện tại được gọi là transfer learning. Để hiểu rõ hơn, mình lấy ví dụ: Trong bài toán dự báo dog and cat. Chúng ta có 2 nhãn cần phân loại là dog, cat và cả 2 nhãn này đều xuất hiện trong một bộ dữ liệu imagenet. Như vậy chúng ta kì vọng rằng có thể tận dụng lại các weights từ pretrained-model trên bộ dữ liệu imagenet để huấn luyện lại bài toán nhanh hơn, chuẩn xác hơn. 2.2. Kiến trúc mô hình sử dụng transfer learningNhư chúng ta đã biết các layers CNN về bản chất là một feature extractor mà mỗi một layer CNN sẽ có tác dụng trích lọc đặc trưng theo những level khác nhau. Hình 2: Các đặc trưng học được từ mạng CNN. Ở những Convolutional Layers đầu tiên, các bộ lọc phát hiện được các chi tiết chung dưới dạng các nét ngang, dọc và các cạnh của ảnh. Đây là những đặc trưng bậc thấp (low level feature) và khá chung chung. Chúng ta chưa thể nhận biết được vật thể dựa trên những đường nét này. Ở những Convolutional Layers cuối cùng là những đặc trưng bậc cao (high level feature) được tổng hợp từ đặc trưng bậc thấp. Đây là những đặc trưng tốt và có sức mạnh phân loại các classes. Quá trình transfer learning sẽ tận dụng lại các đặc trưng được học từ những pretrained-model. Để hiểu hơn về cách thức chuyển giao, chúng ta cùng tìm hiểu về kiến trúc của mô hình sử dụng transfer learning:
Hình 3: Kiến trúc của mạng VGG16 được sử dụng làm base network trong transfer learning.
Hình 4: Kiến trúc base network kết hợp với fully connected layers. Quá trình khởi tạo mô hình chúng ta sẽ tận dụng lại các weight của 1 2 5. Dữ liệu ảnh sau khi đi qua 1 2 5 sẽ tạo ra những đặc trưng tốt, những đặc trưng này chính là đầu vào input $\mathbf{X}$ cho mạng MLP để dự báo $\hat{\mathbf{y}}$. Hệ số $\mathbf{W}$ và $\mathbf{b}$ được khởi tạo ngẫu nhiên. Các hệ số của base network được load lại từ pretrain model. Để dễ hình dung các bước và đồng thời kiểm nghiệm hiệu quả của transfer learning, chúng ta cùng thực hành trên bộ dữ liệu dog and cat. 3. Thực hành3.1. DatasetDữ liệu được sử dụng để minh họa cho phương pháp transfer learning là bộ dữ liệu Sub Dog and Cat với khoảng 1400 ảnh. Bạn đọc có thể bắt đầu thực hành tại Transfer Learning. 1 2 3 4 5 6 7 from google.colab import drive import os drive.mount("/content/gdrive") path = 'gdrive/My Drive/Colab Notebooks/TransferLearning' os.chdir(path) os.listdir() Chạy lệnh bên dưới để download dữ liệu và cd vào thư mục gốc 1 2 !git clone https://github.com/ardamavi/Dog-Cat-Classifier.git %cd Dog-Cat-Classifier Nhớ thực hiện khảo sát dữ liệu trước khi huấn luyện model. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import pandas as pd import glob2 import matplotlib.pyplot as plt dogs = glob2.glob('Data/Train_Data/dog/.jpg') dog_labels = ['dog']*len(dogs) cats = glob2.glob('Data/Train_Data/cat/.jpg') cat_labels = ['cat']*len(cats) labels = dog_labels + cat_labels image_links = dogs + cats data = pd.DataFrame({'labels': labels, 'image_links':image_links}) data.groupby(labels).image_links.count().plot.bar() plt.title('Number of images in each class') plt.show() Ta thấy dữ liệu giữa 2 classes là cân bằng với mỗi loại khoảng 700 ảnh. Như vậy chúng ta không xảy ra hiện tượng mất cân bằng dữ liệu. Trong trường hợp xảy ra mất cân bằng dữ liệu sẽ cần đến một số kĩ thuật xử lý đã được tổng hợp tại Bài 24 - Mất cân bằng dữ liệu (imbalanced dataset). 3.1.1. Phân chia tập train/validationMột thủ tục không thể thiếu của quá trình huấn luyện model đó là phân chia tập train/validation. Dữ liệu sẽ được huấn luyện trên tập dữ liệu train và kiểm định trên tập validation. Một số qui trình phát triển model ngặt hơn còn phân chia thêm tập dev để fine tuning tham số giữa các mô hình và tập test để kiểm định mô hình trên tập dữ liệu thực tế mà người dùng sinh ra. Tuy nhiên để đơn giản hóa mình sẽ chỉ sử dụng tập train/validation. Sau đó chúng ta phân chia tập train/validation theo tỷ lệ 80/20. Để tỷ lệ class cân bằng giữa bộ dữ liệu train và test ta nên sử dụng hàm train_test_split của sklearn với 1 2 1 2 3 4 5 from sklearn.model_selection import train_test_split images_train, images_val, y_label_train, y_label_val = train_test_split(image_links, labels, stratify = labels) print('images_train len: {}, image_test shape: {}'.format(len(images_train), len(images_val))) import tensorflow as tf def scheduler(epoch): if epoch < 10: else: callback = tf.keras.callbacks.LearningRateScheduler(scheduler)
your_model.fit(data, labels, epochs=100, callbacks=[callback],
0import tensorflow as tf def scheduler(epoch): if epoch < 10: else: callback = tf.keras.callbacks.LearningRateScheduler(scheduler)
your_model.fit(data, labels, epochs=100, callbacks=[callback],
13.1.2. Data AugumentationĐộ chính xác của một mô hình được cải thiện hay không phần lớn dựa trên 2 yếu tố chính đó là: Kiến trúc model mà bạn áp dụng và kĩ thuật data augumentation. Đặc biệt là với các bài toán có ít dữ liệu thì áp dụng data augumentation sẽ giúp gia tăng số lượng mẫu huấn luyện và cải thiện chất lượng của model. Để thực hiện data augumentation trên tensorflow, chúng ta có thể config ngay trên ImageDataGenerator. Nếu bạn đọc vẫn chưa quen với khái niệm ImageDataGenerator là gì, vui lòng xem lại Bài 32 - Kĩ thuật tensorflow Dataset. Đây là kiến thức cơ bản mà bất kì một modeler nào cũng đều cần nắm vững và thực hiện khi huấn luyện mô hình. import tensorflow as tf def scheduler(epoch): if epoch < 10: else: callback = tf.keras.callbacks.LearningRateScheduler(scheduler)
your_model.fit(data, labels, epochs=100, callbacks=[callback],
2import tensorflow as tf def scheduler(epoch): if epoch < 10: else: callback = tf.keras.callbacks.LearningRateScheduler(scheduler)
your_model.fit(data, labels, epochs=100, callbacks=[callback],
3Ở đây mình đã tự coding lại các phép biến đổi ảnh sử dụng numpy và opencv. Các bạn cũng nên tự thực hành các biết đổi này, chắc chắn kĩ năng coding và tư duy xử lý dữ liệu của các bạn sẽ cải thiện đáng kể. Tùy vào mục đích biến đổi mà bạn đọc có thể thêm hoặc bớt các bước xử lý ảnh. Mình sẽ lý giải các bước xử lý chính:
Lưu ý: Khi khởi tạo Data Generator với các mô hình sử dụng pretrained model thì chúng ta sẽ phải thực hiện các bước biến đổi dữ liệu trong data pipeline đồng nhất với pipeline được áp dụng trên pretrained model. Khi đó các đặc trưng được tạo thành từ base network mới có tác dụng phân loại tốt. Các phép biến đổi trên tập train và validation mình đã tham chiếu với biến đổi mà tác giả sử dụng khi thực hiện model pretrain với bộ dữ liệu imagenet từ trước. 3.1.3. Kiểm tra dữ liệu AugumentationChúng ta không nên tin hoàn toàn vào Augumentation mà cần khảo sát lại xem những step biến đổi trên pipeline đã thay đổi dữ liệu như thế nào? Những biến đổi đó có tạo ra các mẫu phù hợp với thực tế không? Đây là một qui trình cần thiết khi huấn luyện mô hình. Để kiểm tra pipeline của ImageGenerator chúng ta có thể khởi tạo vòng lặp loop qua Generator: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import tensorflow as tf def scheduler(epoch): if epoch < 10: else: callback = tf.keras.callbacks.LearningRateScheduler(scheduler)
your_model.fit(data, labels, epochs=100, callbacks=[callback],
5 Lấy ra một batch với kích thước là 20. import tensorflow as tf def scheduler(epoch): if epoch < 10: else: callback = tf.keras.callbacks.LearningRateScheduler(scheduler)
your_model.fit(data, labels, epochs=100, callbacks=[callback],
6import tensorflow as tf def scheduler(epoch): if epoch < 10: else: callback = tf.keras.callbacks.LearningRateScheduler(scheduler)
your_model.fit(data, labels, epochs=100, callbacks=[callback],
71 2 import tensorflow as tf def scheduler(epoch): if epoch < 10: else: callback = tf.keras.callbacks.LearningRateScheduler(scheduler)
your_model.fit(data, labels, epochs=100, callbacks=[callback],
9 Tiếp theo ta sẽ visualize các ảnh sau augumentation 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 1 Ta có thể thấy với cùng một bức ảnh nhưng đã sinh ra khá nhiều biến thể. Các thay đổi tập trung chủ yếu ở 3 khía cạnh:
4. Huấn luyện model4.1. Khởi tạo model huấn luyệnTiếp theo chúng ta sẽ huấn luyện mô hình. Việc đầu tiên cần thực hiện là khởi tạo base network cho mô hình. Trên keras đã có hầu hết các model pretrain phổ biến trên bộ dữ liệu imagenet. Lý do tác giả lựa chọn bộ dữ liệu này để huấn luyện các pretrained-model là vì có tới 1000 classes khác nhau. Do đó hầu như mọi bài toán classification đều có nhãn xuất hiện trong imagenet và có thể tái sử dụng pretrained-model. Ta khởi tạo model như sau: 1 2 3 4 5 6 7 2 1 2 3 4 5 6 7 3 1 2 3 4 5 6 7 4 1 2 3 4 5 6 7 5 Để ý kĩ bạn sẽ thấy 1 2 8 là một pretrain model 1 2 9 đã được truncate top layer thông qua tham số !git clone https://github.com/ardamavi/Dog-Cat-Classifier.git %cd Dog-Cat-Classifier 0. Bài toán của chúng ta có số lượng nhãn khác với imagenet nên sẽ ta gán vào base network một mạng MLP gồm các Layers Fully Connected sao cho layer cuối có số units = số lượng output classes. Tiếp theo ta sẽ thực hiện quá trình warm up để huấn luyện mô hình nhanh hơn. 4.2. Warm up!git clone https://github.com/ardamavi/Dog-Cat-Classifier.git %cd Dog-Cat-Classifier 1 là quá trình cần thiết để mô hình hội tụ nhanh hơn. Warm up sẽ đóng băng lại các layers CNN để cho hệ số của chúng không đổi và chỉ train lại trên các Fully Conntected Layers ở cuối cùng. Mục đích của warm up là giữ nguyên được các đặc trưng bậc cao (high-level) đã được học từ pretrained-model mà những đặc trưng này là tốt vì được huấn luyện trên bộ dữ liệu có kích thước lớn hơn và có độ chính xác cao hơn sao với khởi tạo hệ số ngẫu nhiên. Như vậy Phrase 2 (xem hình 2) của mô hình sẽ không thay đổi input $\mathbf{X}$ và coi như chúng ta huấn luyện lại mạng MLP. 1 2 3 4 5 6 7 6 1 2 3 4 5 6 7 7 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 9 Huấn luyện lại model trên 1 epoch 1 2 3 4 5 6 7 from google.colab import drive import os drive.mount("/content/gdrive") path = 'gdrive/My Drive/Colab Notebooks/TransferLearning' os.chdir(path) os.listdir() 1 import tensorflow as tf def scheduler(epoch): if epoch < 10: else: callback = tf.keras.callbacks.LearningRateScheduler(scheduler)
your_model.fit(data, labels, epochs=100, callbacks=[callback],
0from google.colab import drive import os drive.mount("/content/gdrive") path = 'gdrive/My Drive/Colab Notebooks/TransferLearning' os.chdir(path) os.listdir() 3 Bạn sẽ thấy accuracy sẽ được cải thiện rất nhanh chỉ sau epoch đầu tiên. Tuy nhiên bài toán có hiện tượng overfitting khi !git clone https://github.com/ardamavi/Dog-Cat-Classifier.git %cd Dog-Cat-Classifier 2 thấp hơn nhiều so với !git clone https://github.com/ardamavi/Dog-Cat-Classifier.git %cd Dog-Cat-Classifier 3. Để giảm thiểu overfitting chúng ta sẽ thực hiện một số hiệu chỉnh đối với mô hình như:
\[\mathcal{L}_{reg}(\mathbf{W};\mathbf{X}) = \mathcal{L}(\mathbf{W}; \mathbf{X}) + \lambda ||\mathbf{W}||_{F}^{2}\] Trên tensorflow chúng ta có thể thêm thành phần hiệu chuẩn bằng cách khai báo trực tiếp vào tham số !git clone https://github.com/ardamavi/Dog-Cat-Classifier.git %cd Dog-Cat-Classifier 4 của keras layers: import tensorflow as tf def scheduler(epoch): if epoch < 10: else: callback = tf.keras.callbacks.LearningRateScheduler(scheduler)
your_model.fit(data, labels, epochs=100, callbacks=[callback],
6from google.colab import drive import os drive.mount("/content/gdrive") path = 'gdrive/My Drive/Colab Notebooks/TransferLearning' os.chdir(path) os.listdir() 5
5. Fine tuning modelMục đích chính của việc warm up model là để mô hình hội tụ nhanh hơn tới global optimal value. Sau khi mô hình đạt ngưỡng tối ưu trên các Fully Connected Layers, sẽ rất khó để chúng ta tăng được thêm độ chính xác hơn nữa. Lúc này chúng ta sẽ cần phá băng (unfrozen) các layers của base network và huấn luyện mô hình trên toàn bộ các layers từ pretrained- model. Quá trình này được gọi là fine tuning. 1 2 3 4 5 from google.colab import drive import os drive.mount("/content/gdrive") path = 'gdrive/My Drive/Colab Notebooks/TransferLearning' os.chdir(path) os.listdir() 7 1 2 3 4 5 6 7 8 from google.colab import drive import os drive.mount("/content/gdrive") path = 'gdrive/My Drive/Colab Notebooks/TransferLearning' os.chdir(path) os.listdir() 9 import tensorflow as tf def scheduler(epoch): if epoch < 10: else: callback = tf.keras.callbacks.LearningRateScheduler(scheduler)
your_model.fit(data, labels, epochs=100, callbacks=[callback],
61 2 1 1 2 1 2 3 Chúng ta có thể nhận thấy rằng sau khi thực hiện fine tunning thì đồng thời accuracy trên tập train và tập validation đều tăng và đạt tới ngưỡng >= 80%. Như vậy fine tunning đã giải quyết được đồng thời 2 vấn đề overfitting và cải thiện accuracy của mô hình. Đưa thêm hình về accuracy giữa transfer learning và mô hình gốc. 6. Kinh nghiệm transfer learning6.1. Transfer learning theo kích thước dữ liệuCác đặc trưng học được trên ít dữ liệu sẽ có tác dụng phân loại kém hơn so với các đặc trưng được trên bộ dữ liệu kích thước lớn. Do đó: Hình 5: Chiến lược áp dụng transfer learning.
6.2. Khi nào thực hiện transfer learningCó một số trường hợp bạn áp dụng transfer learning nhưng không thấy thực sự hiệu quả. Lý do là bởi transfer learning chỉ phù hợp với một số tình huống cụ thể như sau:
7. Tổng kếtTransfer learning là một trong những phương pháp hiệu quả trong trường hợp dữ liệu có kích thước nhỏ. Ứng dụng transfer learning có thể giúp cải thiện độ chính xác của mô hình và đồng thời giảm thiểu thời gian huấn luyện. Để có thể áp dụng được transfer learning hiệu quả đòi hỏi chúng ta phải có kinh nghiệm. Qua bài viết này mình đã hướng dẫn tới các bạn các tiêu chuẩn lựa chọn mô hình transfer learning. Hi vọng rằng các bạn sẽ áp dụng hiệu quả vào quá trình xây dựng và huấn luyện mô hình của mình. |