Bài 24: Deep Learning - Lập trình AI bằng Python

Đăng bởi: Admin | Lượt xem: 5878 | Chuyên mục: AI


Mạng thần kinh nhân tạo (ANN) nó là một hệ thống tính toán hiệu quả, có chủ đề trung tâm được mượn từ sự tương tự của mạng thần kinh sinh học. Mạng nơ-ron là một loại mô hình cho 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 thực hiện trong mạng nơ-ron. Trong chương này, bạn sẽ tìm hiểu thêm về Học sâu, một 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 một thập kỷ với tư cách là một đối thủ nặng ký trong lĩnh vực này. Do đó, học sâu là một loại học máy cụ thể có các thuật toán được lấy cảm hứng từ cấu trúc và chức năng của não người.

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 nay. Nó rất mạnh mẽ bởi vì họ học được cách tốt nhất để trình bày vấn đề trong khi học cách giải quyết vấn đề. Dưới đây 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 trên 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. Mặt khác, các thuật toán học máy cũng 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à cố gắng học hỏi từ các tính năng tương tự. Mặt khác, cần có một chuyên gia để xác định hầu hết 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 phụ thuộc vào nhiều tham số được sử dụng trong một 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, đặc biệ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 vấn đề
Học sâu giải quyết vấn đề từ đầu đến cuối trong khi học máy sử dụng cách truyền thống để giải quyết vấn đề, tức là chia nhỏ nó thành nhiều phần.

2. Convolutional Neural Network (CNN)

Mạng nơ-ron chuyển đổi cũng giống như mạng nơ-ron thông thường vì chúng cũng được tạo thành từ các nơ-ron có trọng số và độ lệch có thể học được. Mạng nơ-ron thông thường bỏ qua cấu trúc của dữ liệu đầu vào và tất cả 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 với dữ liệu thông thường, tuy nhiên nếu dữ liệu có chứa hình ảnh, quá trình này có thể phức tạp.
CNN giải quyết vấn đề này một cách dễ dàng. Khi xử lý chúng phải tính đến cấu trúc 2D của hình ảnh, điều này cho phép chúng trích xuất các thuộc tính cụ thể 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 đến lớp chính xác trong lớp đầu ra. Sự khác biệt duy nhất giữa NN thông thường và CNN là ở cách xử lý dữ liệu đầu vào và kiểu lớp.
a. Tổng quan về kiến trúc của CNN :
Về mặt kiến trúc, các mạng nơ-ron thông thường nhận đầu vào và biến đổi nó thông qua một loạt các lớp ẩn. Mỗi lớp được kết nối với lớp kia với sự trợ giúp của các nơ-ron. Nhược điểm chính của mạng nơ-ron thông 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 tại được kết nối với một bản vá nhỏ của đầu ra từ lớp trước. Nó tương tự như phủ một 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 tất cả các chi tiết. Các bộ lọc M này là các 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 sử dụng để tạo CNN
Các lớp sau được sử 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 hầu hết các tính toán. Lớp này tính toán sự phức tạp giữa các nơ-ron và các bản vá lỗi khác nhau trong đầu vào.
  • Rectified Linear Unit Layer − Nó áp dụng một chức năng kích hoạt cho đầu ra của lớp trước đó. 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 chức năng nào.
  • Pooling Layer −Việc gộp chung giúp chúng ta chỉ giữ lại những phần quan trọng khi chúng 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 có thể sử dụng Keras, là một API mạng thần kinh cấp cao, được viết bằng Python và có khả năng chạy trên TensorFlow, CNTK hoặc Theno
pip install keras
hoặc
conda install –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 một 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 có thể sử dụng KerasRegressor để đạt được điều này. Trong ví dụ này, mình đang sử 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.models 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 đường dẫn local như sau :
dataframe = pandas.read_csv("/Usrrs/admin/data.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 model :
def baseline_model():
Tạo model như sau :
model_regressor = Sequential()
model_regressor.add(Dense(13, input_dim = 13, kernel_initializer = 'normal', 
   activation = 'relu'))
model_regressor.add(Dense(1, kernel_initializer = 'normal'))
Tiếp theo biên dịch model :
model_regressor.compile(loss='mean_squared_error', optimizer='adam')
return model_regressor
chỉnh sửa random seed để có khả năng tái lập
seed = 7
numpy.random.seed(seed)
Đối tượng trình bao bọc Keras để sử dụng trong scikit-learning như một 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.mean(),Baseline_result.std()))
Đầu ra của mã hiển thị ở trên sẽ là ước tính 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, bao gồm trung bình và độ lệch chuẩn trên tất cả 10 lần đánh giá xác nhận chéo.

4. Image Classifier: ứng dụng của deep learning

Convolutional Neural Networks (CNNs) giải quyết một 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 có thể sử dụng thư viện học sâu Keras. Lưu ý rằng chúng tôi đang sử 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.models import Sequential
Package sau được gọi là Conv2D được sử dụng để thực hiện phép toán tích chập, bước đầu tiên của CNN.
from keras.layers import Conv2D
Package sau có tên MaxPoling2D được sử dụng để thực hiện thao tác gộp, bước thứ hai của CNN.
from keras.layers import MaxPooling2D
Package sau được gọi là Flatten là quá trình chuyển đổi tất cả các mảng 2D kết quả thành một vectơ tuyến tính dài liên tục.
from keras.layers import Flatten
Package sau có tên là Dense được sử 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
Bây giờ, hãy tạo một đối tượng của lớp tuần tự.
S_classifier = Sequential()
bước tiếp theo là codephần tích chập.
S_classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
Ở đây relu có chức năng chỉnh lưu.
Bây giờ, bước tiếp theo của CNN là thao tác gộp trên các 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 tất cả các hình ảnh gộp thành một vector liên tục bằng cách sử dụng tính năng tâng bốc
S_classifier.add(Flatten())
Tạo một lớp kết nối đầy đủ.
S_classifier.add(Dense(units = 128, activation = 'relu'))
Ở đây, 128 là số đơn vị ẩn. Một thực tế phổ biến 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ư sau
S_classifier.add(Dense(units = 1, activation = 'sigmoid'))
Biên dịch CNN, ta xây dựng như sau :
S_classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
Ở đây tham số trình tối ưu hóa 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.
Bây giờ, hãy thực hiện tăng cường hình ảnh và sau đó 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)
Ở đây step_per_epoch có số lượng hình ảnh đào tạo.
Bây giờ khi mô hình đã được đào tạo, chúng ta có thể sử dụng nó để dự đoán như sau:
from keras.preprocessing import image

test_image = image.load_img('dataset/single_prediction/cat_or_dog_1.jpg', 
target_size = (64, 64))

test_image = image.img_to_array(test_image)

test_image = np.expand_dims(test_image, axis = 0)

result = classifier.predict(test_image)

training_set.class_indices

if result[0][0] == 1:
prediction = 'dog'

else:
   prediction = 'cat'
vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!