AI với Python - Học sâu

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 vượt bậc về tính toán của một thập kỷ như 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ể mà 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.

Học máy v / s Học sâu

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à một so sánh giữa Học sâu và Học máy:

Sự phụ thuộc dữ liệu

Đ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.

Phụ thuộc máy móc

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.

Khai thác tính năng

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.

Thời gian thực hiện

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.

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à bằng cách chia nhỏ nó thành các phần.

Mạng thần kinh hợp hiến (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. 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. Cần tính đến cấu trúc 2D của hình ảnh khi xử lý chúng, điều này cho phép chúng trích xuất các thuộc tính cụ thể của 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.

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×lọc trên hình ảnh đầu vào. Nó sử dụngMbộ lọc để chắc chắn về việc nhận được tất cả các chi tiết. NhữngM bộ lọc là trình 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.

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 CNNs thực hiện hầu hết các phép tính. 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 phi 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 tôi chỉ giữ lại những phần quan trọng khi chúng tôi phát 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ố.

Cài đặt các gói Python hữu ích

Bạn có thể 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. Nó tương thích với Python 2.7-3.6. Bạn có thể tìm hiểu thêm về nó từhttps://keras.io/.

Sử dụng các lệnh sau để cài đặt keras:

pip install keras

Trên conda môi trường, bạn có thể sử dụng lệnh sau:

conda install –c conda-forge keras

Xây dựng bộ điều chỉnh tuyến tính bằ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ể dùngKerasRegressorđể đạt được điều này. Trong ví dụ này, chúng tôi đ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. Mã Python cho điều tương tự được hiển thị ở đây -

Nhập tất cả các gói được yêu cầu như được hiển thị -

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

Bây giờ, tải tập dữ liệu của chúng tôi được lưu trong thư mục cục bộ.

dataframe = pandas.read_csv("/Usrrs/admin/data.csv", delim_whitespace = True, header = None)
dataset = dataframe.values

Bây giờ, 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]

Vì chúng tôi sử dụng mạng nơ ron cơ sở, hãy xác định mô hình -

def baseline_model():

Bây giờ, tạo mô hình 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 mô hình -

model_regressor.compile(loss='mean_squared_error', optimizer='adam')
return model_regressor

Bây giờ, hãy sửa hạt ngẫu nhiên để có khả năng tái tạo như sau:

seed = 7
numpy.random.seed(seed)

Đối tượng trình bao bọc Keras để sử dụng trong scikit-learn như một công cụ ước tính 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 đoạn mã được hiển thị ở trên sẽ là ước tính về hiệu suất của mô hình đối với vấn đề đố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.

Bộ phân loại hình ảnh: Ứng dụng của Học sâu

Mạng Nơ-ron Hợp pháp (CNN) giải quyết một vấn đề phân loại hình ảnh, đó 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 về hình ảnh của mèo và chó từ liên kết sauhttps://www.kaggle.com/c/dogs-vs-cats/data.

Nhập các thư viện và gói keras quan trọng như được hiển thị -

Gói sau được gọi là tuần tự sẽ khởi tạo mạng nơ-ron dưới dạng mạng tuần tự.

from keras.models import Sequential

Gói 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

Gói sau được gọi là 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

Gói 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

Gói sau được gọi 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ây giờ, bước tiếp theo là mã hóa phần tích chập.

S_classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))

Đây relu là 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)))

Bây giờ, hãy 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())

Tiếp theo, tạo một lớp được 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.

Bây giờ, khởi tạo lớp đầu ra như sau:

S_classifier.add(Dense(units = 1, activation = 'sigmoid'))

Bây giờ, biên dịch CNN, chúng tôi đã xây dựng -

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 thất 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 đó điều chỉnh hình ảnh với 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')

Bây giờ, điều chỉnh dữ liệu với mô hình mà chúng tôi đã 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'