Tăng cường dữ liệu là quá trình áp dụng các phép biến đổi khác nhau cho dữ liệu huấn luyện. Nó giúp tăng tính đa dạng của tập dữ liệu và ngăn chặn quá mức. Việc trang bị quá mức chủ yếu xảy ra khi bạn có dữ liệu hạn chế để huấn luyện mô hình của mình.
Tại đây, bạn sẽ tìm hiểu cách sử dụng mô-đun tăng cường dữ liệu của TensorFlow để đa dạng hóa tập dữ liệu của mình. Điều này sẽ ngăn việc khớp quá mức bằng cách tạo ra các điểm dữ liệu mới hơi khác so với dữ liệu gốc.
Bộ dữ liệu mẫu bạn sẽ sử dụng
Bạn sẽ sử dụng tập dữ liệu về chó và mèo từ Kaggle. Bộ dữ liệu này chứa khoảng 3.000 hình ảnh về chó và mèo. Những hình ảnh này được chia thành các bộ đào tạo, thử nghiệm và xác thực.
Nhãn 1.0 đại diện cho một con chó trong khi nhãn 0.0 đại diện cho một con mèo.
Mã nguồn đầy đủ triển khai các kỹ thuật tăng cường dữ liệu và mã nguồn không có sẵn trong kho lưu trữ GitHub.
Cài đặt và nhập TensorFlow
Để làm theo, bạn nên có hiểu biết cơ bản về Python. Bạn cũng nên có kiến thức cơ bản về học máy. Nếu cần ôn lại, bạn có thể cân nhắc làm theo một số hướng dẫn về máy học.
Mở Google Colab. Thay đổi loại thời gian chạy thành GPU. Sau đó, thực hiện lệnh ma thuật sau trên ô mã đầu tiên để cài đặt TensorFlow vào môi trường của bạn.
!pip install tensorflow
Nhập TensorFlow và các mô-đun và lớp có liên quan của nó.
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
Các tenorflow.keras.preprocessing.image sẽ cho phép bạn thực hiện tăng cường dữ liệu trên tập dữ liệu của mình.
Tạo các thể hiện của lớp ImageDataGenerator
Tạo một thể hiện của ImageDataGenerator lớp cho dữ liệu tàu. Bạn sẽ sử dụng đối tượng này để tiền xử lý dữ liệu huấn luyện. Nó sẽ tạo ra các lô dữ liệu hình ảnh tăng cường trong thời gian thực trong quá trình đào tạo mô hình.
Trong nhiệm vụ phân loại một hình ảnh là mèo hay chó, bạn có thể sử dụng các kỹ thuật tăng cường dữ liệu lật, chiều rộng ngẫu nhiên, chiều cao ngẫu nhiên, độ sáng ngẫu nhiên và thu phóng. Những kỹ thuật này sẽ tạo ra dữ liệu mới chứa các biến thể của dữ liệu gốc đại diện cho các tình huống trong thế giới thực.
train_datagen = ImageDataGenerator(rescale=1./255,
horizontal_flip=True,
width_shift_range=0.2,
height_shift_range=0.2,
brightness_range=[0.2,1.0],
zoom_range=0.2)
Tạo một phiên bản khác của ImageDataGenerator lớp cho dữ liệu thử nghiệm. Bạn sẽ cần chỉnh lại tham số. Nó sẽ chuẩn hóa các giá trị pixel của hình ảnh thử nghiệm để phù hợp với định dạng được sử dụng trong quá trình đào tạo.
test_datagen = ImageDataGenerator(rescale=1./255)
Tạo một phiên bản cuối cùng của ImageDataGenerator class cho dữ liệu xác thực. Thay đổi tỷ lệ dữ liệu xác thực giống như dữ liệu thử nghiệm.
validation_datagen = ImageDataGenerator(rescale=1./255)
Bạn không cần áp dụng các kỹ thuật tăng cường khác cho dữ liệu thử nghiệm và xác thực. Điều này là do mô hình chỉ sử dụng dữ liệu thử nghiệm và xác thực cho mục đích đánh giá. Họ nên phản ánh phân phối dữ liệu ban đầu.
Đang tải dữ liệu của bạn
Tạo một Thư mụcIterator đối tượng từ thư mục đào tạo. Nó sẽ tạo ra hàng loạt hình ảnh tăng cường. Sau đó chỉ định thư mục lưu trữ dữ liệu đào tạo. Thay đổi kích thước hình ảnh thành kích thước cố định 64×64 điểm ảnh. Chỉ định số lượng hình ảnh mà mỗi lô sẽ sử dụng. Cuối cùng, chỉ định loại nhãn được nhị phân (tức là con mèo hoặc con chó).
train_data = train_datagen.flow_from_directory(directory=r'/content/drive/MyDrive/cats_and_dogs_filtered/train',
target_size=(64, 64),
batch_size=32,
class_mode='binary')
Tạo ra một cái khác Thư mụcIterator đối tượng từ thư mục thử nghiệm. Đặt các tham số thành các giá trị giống như giá trị của dữ liệu huấn luyện.
test_data = test_datagen.flow_from_directory(directory='/content/drive/MyDrive/cats_and_dogs_filtered/test',
target_size=(64, 64),
batch_size=32,
class_mode='binary')
Tạo một trận chung kết Thư mụcIterator đối tượng từ thư mục xác thực. Các tham số vẫn giống như các tham số của dữ liệu huấn luyện và thử nghiệm.
validation_data = validation_datagen.flow_from_directory(directory='/content/drive/MyDrive/cats_and_dogs_filtered/validation',
target_size=(64, 64),
batch_size=32,
class_mode='binary')
Các trình vòng lặp thư mục không làm tăng bộ dữ liệu kiểm tra và xác thực.
Xác định mô hình của bạn
Xác định kiến trúc của mạng lưới thần kinh của bạn. Sử dụng Mạng thần kinh chuyển đổi (CNN). CNN được thiết kế để nhận dạng các mẫu và đặc điểm trong hình ảnh.
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
Biên dịch mô hình bằng cách sử dụng nhị phân entropy chéo mất chức năng. Các vấn đề phân loại nhị phân thường sử dụng It. Đối với trình tối ưu hóa, hãy sử dụng Trình tối ưu hóa Adam. Nó là một thuật toán tối ưu hóa tốc độ học tập thích ứng. Cuối cùng, đánh giá mô hình về độ chính xác.
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
In bản tóm tắt kiến trúc của mô hình ra bàn điều khiển.
model.summary()
Ảnh chụp màn hình sau đây cho thấy hình ảnh của kiến trúc mô hình.
Điều này cung cấp cho bạn một cái nhìn tổng quan về thiết kế mô hình của bạn trông như thế nào.
Đào tạo người mẫu của bạn
Huấn luyện mô hình bằng cách sử dụng phù hợp() phương pháp. Đặt số bước trên mỗi kỷ nguyên là số lượng mẫu đào tạo chia cho batch_size. Ngoài ra, hãy đặt dữ liệu xác thực và số bước xác thực.
history = model.fit(train_data,
steps_per_epoch=train_data.n // train_data.batch_size,
epochs=50,
validation_data=validation_data,
validation_steps=validation_data.n // validation_data.batch_size)
Các ImageDataGenerator lớp áp dụng tăng cường dữ liệu cho dữ liệu đào tạo trong thời gian thực. Điều này làm cho quá trình đào tạo của mô hình chậm hơn.
Đánh giá mô hình của bạn
Đánh giá hiệu suất của mô hình của bạn trên dữ liệu thử nghiệm bằng cách sử dụng đánh giá() phương pháp. Ngoài ra, in tổn thất và độ chính xác của bài kiểm tra ra bàn điều khiển.
test_loss, test_acc = model.evaluate(test_data,
steps=test_data.n // test_data.batch_size)
print(f'Test loss: {test_loss}')
print(f'Test accuracy: {test_acc}')
Ảnh chụp màn hình sau đây cho thấy hiệu suất của mô hình.
Mô hình hoạt động khá tốt trên dữ liệu chưa từng thấy.
Khi bạn chạy mã không triển khai các kỹ thuật tăng dữ liệu, độ chính xác đào tạo mô hình là 1. Điều đó có nghĩa là nó quá khớp. Nó cũng hoạt động kém trên dữ liệu mà nó chưa từng thấy trước đây. Điều này là do nó học các đặc thù của tập dữ liệu.
Khi nào tăng cường dữ liệu không hữu ích?
- Khi tập dữ liệu đã đa dạng và lớn: Tăng cường dữ liệu làm tăng kích thước và tính đa dạng của tập dữ liệu. Nếu tập dữ liệu đã lớn và đa dạng, thì việc tăng cường dữ liệu sẽ không hữu ích.
- Khi tập dữ liệu quá nhỏ: Tăng cường dữ liệu không thể tạo các tính năng mới không có trong tập dữ liệu gốc. Do đó, nó không thể bù đắp cho một tập dữ liệu nhỏ thiếu hầu hết các tính năng mà mô hình yêu cầu để tìm hiểu.
- Khi loại tăng dữ liệu không phù hợp: Ví dụ: xoay hình ảnh có thể không hữu ích khi hướng của các đối tượng là quan trọng.
TensorFlow có khả năng gì
TensorFlow là một thư viện đa dạng và mạnh mẽ. Nó có khả năng đào tạo các mô hình học sâu phức tạp và có thể chạy trên nhiều loại thiết bị từ điện thoại thông minh đến cụm máy chủ. Nó đã giúp tăng sức mạnh cho các thiết bị điện toán tiên tiến sử dụng máy học.