Phần 24: Deep Learning – Lập trình AI bằng Python

- Mạng thần kinh nhân tạo (ANN) nó là 1 hệ thống tính toán hiệu quả, có chủ đề trung tâm được mượn từ sự giống nhau của mạng thần kinh sinh học. Mạng nơ-ron là 1 loại mô hình đối với việc học máy. Vào giữa những năm 1980 và đầu những năm 1990, nhiều tiến bộ quan trọng về kiến trúc đã được bắt đầu trong mạng nơ-ron. Trong chương này, bạn sẽ xem thêm về Học sâu, 1 cách tiếp cận của AI.
Học sâu xuất hiện từ sự phát triển bùng nổ về tính toán của 1 thập kỷ bằng tư cách là 1 đối thủ nặng ký trong lĩnh vực này. Do đó, học sâu là 1 loại học máy chi tiết có các thuật toán được lấy cảm hứng từ cấu trúc và tính năng của não người.
Table of Contents
1. Machine Learning v/s Deep Learning :
Học sâu là kỹ thuật học máy mạnh mẽ nhất hiện tại. Nó rất mạnh mẽ bởi họ học được cách hiệu quả nhất để trình bày vấn đề trong khi học cách giải quyết được vấn đề. Dưới đây chính là bảng so sánh giữa Học sâu và Học máy
a. Data Dependency
Điểm khác biệt đầu tiên là dựa vào hiệu suất của DL và ML khi quy mô dữ liệu tăng lên. Khi dữ liệu lớn, các thuật toán học sâu hoạt động rất tốt.
b. Machine Dependency
Các thuật toán học sâu cần những cỗ máy cao cấp để hoạt động hoàn hảo. Bên cạnh đó, các thuật toán học máy cũng sẽ có thể hoạt động ở trên các máy cấp thấp.
c. Feature Extraction
Các thuật toán học sâu có thể trích xuất các tính năng cấp cao và nỗ lực học hỏi từ những tính năng giống nhau. Bên cạnh đó, cần phải có 1 chuyên gia để xác định phần lớn các tính năng được trích xuất bằng máy học.
d. Time of Execution
Thời gian thực thi dựa vào nhiều tham số được dùng trong 1 thuật toán. Học sâu có nhiều tham số hơn các thuật toán học máy. Do đó, thời gian thực thi của các thuật toán DL, nhất là thời gian đào tạo, nhiều hơn các thuật toán ML. Nhưng thời gian thử nghiệm của thuật toán DL ít hơn thuật toán ML.
e. Phương pháp tiếp cận để giải quyết được vấn đề
Học sâu giải quyết được vấn đề từ ban đầu tới cuối trong khi học máy sử dụng cách truyền thống để giải quyết được vấn đề, tức là phân nhỏ nó thành nhiều phần.
2. Convolutional Neural Network (CNN)
Mạng nơ-ron chuyển đổi cũng giống mạng nơ-ron bình thường vì chúng cũng đã được tạo nên từ những nơ-ron có trọng số và độ lệch có thể học được. Mạng nơ-ron bình thường bỏ qua cấu trúc của dữ liệu đầu vào và toàn bộ dữ liệu được chuyển đổi thành mảng 1-D trước khi đưa nó vào mạng. Quá trình này phù hợp đối với dữ liệu bình thường, tuy vậy nếu như dữ liệu rằng có chứa ảnh, quá trình này có thể phức tạp.
CNN giải quyết được vấn đề này 1 cách dễ dàng. Khi xử lý chúng phải tính tới cấu trúc 2D của hình ảnh, điều đó cho phép chúng trích xuất các thuộc tính chi tiết cho hình ảnh. Theo cách này, mục tiêu chính của CNN là đi từ dữ liệu hình ảnh thô trong lớp đầu vào tới lớp chính xác trong lớp đầu ra. Điểm khác biệt duy nhất giữa NN bình thường và CNN là ở cách xử lý dữ liệu đầu vào và kiểu lớp.
a. Tổng quát về kiến trúc của CNN :
Về kiến trúc, các mạng nơ-ron bình thường nhận đầu vào và biến đổi nó qua 1 loạt các lớp ẩn. Mỗi lớp được kết nối với lớp kia với sự giúp đỡ của các nơ-ron. Nhược điểm chính của mạng nơ-ron bình thường là chúng không chia tỷ lệ tốt với hình ảnh đầy đủ.
Kiến trúc của CNNs có các nơron được sắp xếp theo 3 chiều gọi là chiều rộng, chiều cao và chiều sâu. Mỗi nơ-ron trong lớp hiện giờ được kết nối với 1 bản vá nhỏ của đầu ra từ lớp trước. Nó giống nhau như phủ 1 bộ lọc 𝑵 × 𝑵 lên hình ảnh đầu vào. Nó sử dụng M bộ lọc để chắc chắn về việc lấy toàn bộ các chi tiết. Những bộ lọc M này là những công cụ trích xuất tính năng trích xuất các tính năng như cạnh, góc, v.v.
b. Các lớp được dùng để tạo CNN
Các lớp sau được dùng để xây dựng CNN:
- Input Layer − Nó lấy dữ liệu hình ảnh thô như nó vốn có.
- Convolutional Layer − Lớp này là khối xây dựng cốt lõi của CNN thực hiện phần lớn những tính toán. Lớp này tính toán sự phức tạp giữa các nơ-ron và những bản vá lỗi khác nhau trong đầu vào.
- Rectified Linear Unit Layer − Nó áp dụng 1 tính năng kích hoạt cho đầu ra của lớp trước đây. Nó thêm tính không tuyến tính vào mạng để nó có thể tổng quát hóa tốt cho bất kỳ loại tính năng nào.
- Pooling Layer −Việc gộp chung giúp ta chỉ giữ lại các phần quan trọng khi ta tiến triển trong mạng. Lớp gộp hoạt động độc lập trên mọi lát sâu của đầu vào và thay đổi kích thước của nó theo không gian. Nó sử dụng hàm MAX.
- Fully Connected layer/Output layer − Lớp này tính toán điểm số đầu ra trong lớp cuối cùng. Kết quả đầu ra có kích thước 𝟏 × 𝟏 × 𝑳, trong đó L là các lớp tập dữ liệu huấn luyện số.
3. Cài đặt keras:
Bạn sẽ có thể sử dụng Keras, là 1 API mạng thần kinh cấp cao, được viết bằng Python và có thể hoạt động trên TensorFlow, CNTK hay Theno
pip set up keras
hay
conda set up –c conda-forge keras
4. Xây dựng Hồi quy tuyến tính sử dụng ANN
Trong phần này, bạn sẽ học cách xây dựng 1 bộ hồi quy tuyến tính bằng cách sử dụng mạng nơron nhân tạo. Bạn sẽ có thể sử dụng KerasRegressor nhằm đạt được điều đó. Trong ví dụ này, mình đang dùng tập dữ liệu giá nhà ở Boston với số 13 cho các bất động sản ở Boston
import numpy
import pandas
from keras.fashions import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
Load dữ liệu trong link native như dưới đây :
dataframe = pandas.read_csv("/Usrrs/admin/information.csv", delim_whitespace = True, header = None)
dataset = dataframe.values
chia dữ liệu thành các biến đầu vào và đầu ra, tức là X và Y –
X = dataset[:,0:13]
Y = dataset[:,13]
Định nghĩa mannequin :
def baseline_model():
Tạo mannequin như dưới đây :
model_regressor = Sequential()
model_regressor.add(Dense(13, input_dim = 13, kernel_initializer = 'regular',
activation = 'relu'))
model_regressor.add(Dense(1, kernel_initializer = 'regular'))
Tiếp theo biên dịch mannequin :
model_regressor.compile(loss='mean_squared_error', optimizer='adam')
return model_regressor
chỉnh sửa random seed để có thể tái lập
seed = 7
numpy.random.seed(seed)
Đối tượng trình bao bọc Keras để sử dụng trong scikit-studying như 1 công cụ ước lượng hồi quy được gọi là KerasRegressor. Trong phần này, chúng tôi sẽ đánh giá mô hình này với bộ dữ liệu chuẩn hóa.
estimator = KerasRegressor(build_fn = baseline_model, nb_epoch = 100, batch_size = 5, verbose = 0)
kfold = KFold(n_splits = 10, random_state = seed)
baseline_result = cross_val_score(estimator, X, Y, cv = kfold)
print("Baseline: %.2f (%.2f) MSE" % (Baseline_result.imply(),Baseline_result.std()))
Đầu ra của mã hiển thị bên trên sẽ là ước lượng hiệu suất của mô hình đối với sự cố đối với dữ liệu không nhìn thấy. Nó sẽ là sai số bình phương trung bình, gồm trung bình và độ lệch chuẩn trên toàn bộ 10 lần đánh giá xác nhận chéo.
4. Image Classifier: ứng dụng của deep studying
Convolutional Neural Networks (CNNs) giải quyết 1 vấn đề phân loại hình ảnh, tức là hình ảnh đầu vào thuộc về lớp nào. Bạn sẽ có thể sử dụng thư viện học sâu Keras. Chú ý rằng chúng tôi đang dùng tập dữ liệu đào tạo và thử nghiệm hình ảnh của chó và mèo từ liên kết sau https://www.kaggle.com/c/dogs-vs-cats/data.
from keras.fashions import Sequential
Package sau được gọi là Conv2D được dùng để thực hiện phép toán tích chập, bước trước tiên của CNN.
from keras.layers import Conv2D
Package sau có tên MaxPoling2D được dùng để thực hiện thao tác gộp, bước thứ 2 của CNN.
from keras.layers import MaxPooling2D
Package sau được gọi là Flatten là quá trình chuyển đổi toàn bộ các mảng 2D kết quả thành 1 vectơ tuyến tính dài liên tiếp.
from keras.layers import Flatten
Package sau có tên là Dense được dùng để thực hiện kết nối đầy đủ của mạng nơ-ron, bước thứ tư của CNN.
from keras.layers import Dense
Hiện tại, hãy tạo 1 đối tượng của lớp tuần tự.
S_classifier = Sequential()
bước kế tiếp là codephần tích chập.
S_classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
Tại đây relu có tính năng chỉnh lưu.
Hiện tại, bước kế tiếp của CNN là thao tác gộp trên những bản đồ đối tượng kết quả sau phần tích chập.
S-classifier.add(MaxPooling2D(pool_size = (2, 2)))
Chuyển đổi toàn bộ những hình ảnh gộp thành 1 vector liên tiếp bằng cách sử dụng tính năng tâng bốc
S_classifier.add(Flatten())
Tạo 1 lớp kết nối đầy đủ.
S_classifier.add(Dense(models = 128, activation = 'relu'))
Tại đây, 128 là số đơn vị ẩn. 1 thực tế thông dụng là xác định số đơn vị ẩn là lũy thừa của 2.
khởi tạo lớp đầu ra như dưới đây
S_classifier.add(Dense(models = 1, activation = 'sigmoid'))
Biên dịch CNN, ta xây dựng như dưới đây :
S_classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
Tại đây tham số trình tối ưu là chọn thuật toán giảm độ dốc ngẫu nhiên, tham số tổn hao là chọn hàm tổn thất và tham số metrics là chọn chỉ số hiệu suất.
Hiện tại, hãy thực hiện tăng cường hình ảnh và rồi lắp hình ảnh vào mạng nơ-ron
train_datagen = ImageDataGenerator(rescale = 1./255,shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
training_set =
train_datagen.flow_from_directory(”/Users/admin/training_set”,target_size =
(64, 64),batch_size = 32,class_mode = 'binary')
test_set =
test_datagen.flow_from_directory('test_set',target_size =
(64, 64),batch_size = 32,class_mode = 'binary')
Điều chỉnh dữ liệu với mô hình mà ta đã tạo
classifier.fit_generator(training_set,steps_per_epoch = 8000,epochs =
25,validation_data = test_set,validation_steps = 2000)
Tại đây step_per_epoch có số lượng hình ảnh đào tạo.
Hiện tại khi mô hình được đào tạo, chúng ta sẽ có thể dùng nó để dự đoán như dưới đây:
from keras.preprocessing import picture
test_image = picture.load_img('dataset/single_prediction/cat_or_dog_1.jpg',
target_size = (64, 64))
test_image = picture.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis = 0)
end result = classifier.predict(test_image)
training_set.class_indices
if end result[0][0] == 1:
prediction = 'canine'
else:
prediction = 'cat'