Hướng dẫn trực quan về Mạng Neural Hợp pháp

Trong bài viết này, chúng ta sẽ khám phá Mạng thần kinh chuyển đổi (CNN) và ở cấp độ cao, chúng ta sẽ tìm hiểu cách chúng được truyền cảm hứng từ cấu trúc của não bộ. Nếu bạn muốn đọc thêm về bộ não cụ thể, có nhiều nguồn hơn ở cuối bài viết để giúp bạn thêm.

Não

Chúng tôi không ngừng phân tích thế giới xung quanh. Không cần nỗ lực có ý thức, chúng ta đưa ra dự đoán về mọi thứ chúng ta thấy và hành động theo chúng. Khi chúng ta nhìn thấy một thứ gì đó, chúng ta dán nhãn cho mọi đối tượng dựa trên những gì chúng ta đã học trong quá khứ. Để minh họa điều này, hãy nhìn vào bức ảnh này một chút.

Bạn có thể nghĩ một điều gì đó như "đó là một cậu bé hạnh phúc khi đứng trên ghế". Hoặc có thể bạn nghĩ rằng anh ấy trông giống như đang hét lên, sắp tấn công chiếc bánh trước mặt này.

Đây là những gì chúng ta thường làm cả ngày. Chúng tôi xem, gắn nhãn, đưa ra dự đoán và nhận dạng các mẫu. Nhưng chúng ta làm như thế nào? Làm thế nào để chúng ta có thể giải thích mọi thứ chúng ta thấy?

Tự nhiên đã mất hơn 500 triệu năm để tạo ra một hệ thống để làm điều này. Sự hợp tác giữa mắt và não, được gọi là con đường thị giác chính, là lý do chúng ta có thể hiểu được thế giới xung quanh.

Trong khi tầm nhìn bắt đầu từ đôi mắt, việc giải thích thực tế những gì chúng ta nhìn thấy sẽ xảy ra trong não, trong vỏ não thị giác chính .

Khi bạn nhìn thấy một vật thể, các cơ quan thụ cảm ánh sáng trong mắt bạn sẽ gửi tín hiệu qua dây thần kinh thị giác đến vỏ não thị giác chính, nơi đầu vào đang được xử lý. Vỏ não thị giác chính có ý nghĩa về những gì mắt nhìn thấy.

Tất cả những điều này dường như rất tự nhiên đối với chúng tôi. Chúng ta hầu như không nghĩ đến việc chúng ta có thể nhận ra tất cả các đồ vật và những người chúng ta nhìn thấy trong cuộc sống của mình đặc biệt đến mức nào. Các cấu trúc phân cấp sâu sắc phức tạp của tế bào thần kinh và các kết nối trong não đóng một vai trò quan trọng trong quá trình này ghi nhớ và ghi nhãn đối tượng.

Hãy nghĩ về cách chúng ta đã học được ví dụ, một chiếc ô là gì. Hoặc một con vịt, đèn, nến, hoặc sách. Ban đầu, cha mẹ hoặc gia đình của chúng tôi cho chúng tôi biết tên của các đối tượng trong môi trường trực tiếp của chúng tôi. Chúng tôi đã học được bằng những ví dụ đã được đưa ra cho chúng tôi. Chậm rãi nhưng chắc chắn, chúng tôi bắt đầu nhận ra một số thứ thường xuyên hơn trong môi trường của chúng tôi. Chúng trở nên phổ biến đến nỗi lần sau khi nhìn thấy chúng, chúng ta sẽ biết ngay tên của vật thể này là gì. Họ đã trở thành một phần của mô hình của chúng tôi trên thế giới.

Mạng thần kinh chuyển đổi

Tương tự như cách một đứa trẻ học cách nhận biết đồ vật, chúng ta cần đưa ra một thuật toán hàng triệu bức ảnh trước khi nó có thể tổng quát hóa đầu vào và đưa ra dự đoán cho những hình ảnh mà nó chưa từng thấy trước đây.

Máy tính 'nhìn' theo một cách khác với chúng ta. Thế giới của họ chỉ bao gồm những con số. Mọi hình ảnh có thể được biểu diễn dưới dạng mảng số 2 chiều, được gọi là pixel.

Nhưng thực tế là chúng cảm nhận hình ảnh theo một cách khác, không có nghĩa là chúng ta không thể huấn luyện chúng nhận ra các mẫu giống như chúng ta. Chúng ta chỉ cần nghĩ về hình ảnh theo một cách khác.

Để dạy một thuật toán cách nhận dạng các đối tượng trong hình ảnh, chúng tôi sử dụng một loại Mạng thần kinh nhân tạo cụ thể: Mạng thần kinh kết hợp (CNN). Tên của chúng bắt nguồn từ một trong những phép toán quan trọng nhất trong mạng: tích chập.

Mạng thần kinh chuyển đổi được lấy cảm hứng từ não bộ. Nghiên cứu trong những năm 1950 và 1960 của DH Hubel và TN Wiesel về não của động vật có vú đã gợi ý một mô hình mới về cách động vật có vú nhận thức thế giới một cách trực quan. Họ chỉ ra rằng vỏ não thị giác của mèo và khỉ bao gồm các tế bào thần kinh phản ứng độc quyền với các tế bào thần kinh trong môi trường trực tiếp của chúng.

Trong bài báo của mình, họ mô tả hai loại tế bào thần kinh thị giác cơ bản trong não mà mỗi loại hoạt động theo một cách khác nhau: tế bào đơn giản ( tế bào S ) và tế bào phức tạp ( tế bào C ).

Ví dụ: các ô đơn giản kích hoạt khi chúng xác định các hình dạng cơ bản dưới dạng đường thẳng trong một khu vực cố định và một góc cụ thể. Các ô phức tạp có trường tiếp nhận lớn hơn và đầu ra của chúng không nhạy cảm với vị trí cụ thể trong trường.

Các tế bào phức tạp tiếp tục phản ứng với một kích thích nhất định, mặc dù vị trí tuyệt đối của nó trên võng mạc thay đổi. Phức tạp đề cập đến linh hoạt hơn, trong trường hợp này.

Trong thị giác, trường tiếp nhận của một tế bào thần kinh cảm giác đơn lẻ là vùng cụ thể của võng mạc trong đó một thứ gì đó sẽ ảnh hưởng đến việc kích hoạt tế bào thần kinh đó (nghĩa là sẽ kích hoạt tế bào thần kinh). Mọi tế bào nơ-ron cảm giác đều có các trường tiếp nhận giống nhau và các trường của chúng nằm bên trên.

Hơn nữa, khái niệm về thứ bậc đóng một vai trò quan trọng trong não bộ. Thông tin được lưu trữ theo chuỗi các mẫu, theo thứ tự tuần tự. Các tân vỏ não , đó là lớp ngoài cùng của não bộ, lưu trữ thông tin phân cấp. Nó được lưu trữ trong các cột vỏ não, hoặc các nhóm tế bào thần kinh được tổ chức thống nhất trong tân vỏ não.

Năm 1980, một nhà nghiên cứu tên là Fukushima đã đề xuất một mô hình mạng nơron phân cấp. Ông gọi nó là neocognitron . Mô hình này được lấy cảm hứng từ các khái niệm về các ô Đơn giản và Phức tạp. Neocognitron có thể nhận ra các mẫu bằng cách tìm hiểu về hình dạng của các vật thể.

Sau đó, vào năm 1998, Mạng thần kinh chuyển đổi được giới thiệu trong một bài báo của Bengio, Le Cun, Bottou và Haffner. Mạng nơ-ron hợp pháp đầu tiên của họ được gọi là LeNet-5 và có thể phân loại các chữ số từ các số viết tay.

Để biết toàn bộ lịch sử về Nets Neural Convolutional, bạn có thể vào đây.

Ngành kiến ​​trúc

Trong phần còn lại của bài viết này, tôi sẽ giới thiệu cho bạn về kiến ​​trúc của CNN và chỉ cho bạn cách triển khai Python.

Mạng Nơ-ron hợp pháp có kiến ​​trúc khác với Mạng Nơ-ron thông thường. Mạng thần kinh thông thường biến đổi đầu vào bằng cách đưa nó qua một loạt các lớp ẩn. Mọi lớp đều được tạo thành từ một tập hợp các tế bào thần kinh , nơi mỗi lớp được kết nối đầy đủ với tất cả các tế bào thần kinh trong lớp trước đó. Cuối cùng, có một lớp được kết nối đầy đủ cuối cùng - lớp đầu ra - đại diện cho các dự đoán.

Mạng Nơ-ron hợp pháp hơi khác một chút. Trước hết, các lớp được tổ chức theo 3 chiều : chiều rộng, chiều cao và chiều sâu. Hơn nữa, các tế bào thần kinh trong một lớp không kết nối với tất cả các tế bào thần kinh ở lớp tiếp theo mà chỉ với một vùng nhỏ của nó. Cuối cùng, kết quả cuối cùng sẽ được giảm xuống thành một vectơ duy nhất của điểm xác suất, được tổ chức dọc theo chiều sâu.

CNN có hai thành phần:

  • Các lớp ẩn / Phần trích xuất tính năng

Trong phần này, mạng sẽ thực hiện một loạt các hoạt động tích hợpgộp trong đó các tính năng được phát hiện . Nếu bạn có một bức ảnh về một con ngựa vằn, đây là phần mà mạng sẽ nhận ra các sọc, hai tai và bốn chân của nó.

  • Phần phân loại

Tại đây, các lớp được kết nối đầy đủ sẽ đóng vai trò như một bộ phân loại trên đầu các tính năng được trích xuất này. Họ sẽ chỉ định một xác suất cho đối tượng trên ảnh là những gì mà thuật toán dự đoán.

# before we start building we import the libraries
import numpy as np
from keras.layers import Conv2D, Activation, MaxPool2D, Flatten, Densefrom keras.models import Sequential

Khai thác tính năng

Convolution là một trong những nền tảng chính của CNN. Thuật ngữ tích chập đề cập đến sự kết hợp toán học của hai hàm để tạo ra một hàm thứ ba. Nó kết hợp hai bộ thông tin.

In the case of a CNN, the convolution is performed on the input data with the use of a filter or kernel (these terms are used interchangeably)to then produce a feature map.

We execute a convolution by sliding the filter over the input. At every location, a matrix multiplication is performed and sums the result onto the feature map.

In the animation below, you can see the convolution operation. You can see the filter (the green square) is sliding over our input (the blue square) and the sum of the convolution goes into the feature map (the red square).

The area of our filter is also called the receptive field, named after the neuron cells! The size of this filter is 3x3.

For the sake of explaining, I have shown you the operation in 2D, but in reality convolutions are performed in 3D. Each image is namely represented as a 3D matrix with a dimension for width, height, and depth. Depth is a dimension because of the colours channels used in an image (RGB).

We perfom numerous convolutions on our input, where each operation uses a different filter. This results in different feature maps. In the end, we take all of these feature maps and put them together as the final output of the convolution layer.

Just like any other Neural Network, we use an activation function to make our output non-linear. In the case of a Convolutional Neural Network, the output of the convolution will be passed through the activation function. This could be the ReLU activation function.

Stride is the size of the step the convolution filter moves each time. A stride size is usually 1, meaning the filter slides pixel by pixel. By increasing the stride size, your filter is sliding over the input with a larger interval and thus has less overlap between the cells.

The animation below shows stride size 1 in action.

Because the size of the feature map is always smaller than the input, we have to do something to prevent our feature map from shrinking. This is where we use padding.

A layer of zero-value pixels is added to surround the input with zeros, so that our feature map will not shrink. In addition to keeping the spatial size constant after performing convolution, padding also improves performance and makes sure the kernel and stride size will fit in the input.

After a convolution layer, it is common to add a pooling layer in between CNN layers. The function of pooling is to continuously reduce the dimensionality to reduce the number of parameters and computation in the network. This shortens the training time and controls overfitting.

The most frequent type of pooling is max pooling,which takes the maximum value in each window. These window sizes need to be specified beforehand. This decreases the feature map size while at the same time keeping the significant information.

Thus when using a CNN, the four important hyperparameters we have to decide on are:

  • the kernel size
  • the filter count (that is, how many filters do we want to use)
  • stride (how big are the steps of the filter)
  • padding
# Images fed into this model are 512 x 512 pixels with 3 channels
img_shape = (28,28,1)
# Set up the model
model = Sequential()
# Add convolutional layer with 3, 3 by 3 filters and a stride size of 1# Set padding so that input size equals output size
model.add(Conv2D(6,2,input_shape=img_shape))
# Add relu activation to the layer 
model.add(Activation('relu'))
#Pooling
model.add(MaxPool2D(2))

A nice way of visualizing a convolution layer is shown below. Try to look at it for a bit and really understand what is happening.

Classification

After the convolution and pooling layers, our classification part consists of a few fully connected layers. However, these fully connected layers can only accept 1 Dimensional data. To convert our 3D data to 1D, we use the function flatten in Python. This essentially arranges our 3D volume into a 1D vector.

The last layers of a Convolutional NN are fully connected layers. Neurons in a fully connected layer have full connections to all the activations in the previous layer. This part is in principle the same as a regular Neural Network.

#Fully connected layers
# Use Flatten to convert 3D data to 1Dmodel.add(Flatten())
# Add dense layer with 10 neuronsmodel.add(Dense(10))
# we use the softmax activation function for our last layermodel.add(Activation('softmax'))
# give an overview of our model
model.summary
_________________________________________________________________Layer (type) Output Shape Param # =================================================================conv2d_1 (Conv2D) (None, 27, 27, 6) 30 _________________________________________________________________activation_1 (Activation) (None, 27, 27, 6) 0 _________________________________________________________________max_pooling2d_1 (MaxPooling2 (None, 13, 13, 6) 0 _________________________________________________________________flatten_1 (Flatten) (None, 1014) 0 _________________________________________________________________dense_1 (Dense) (None, 10) 10150 _________________________________________________________________activation_2 (Activation) (None, 10) 0 =================================================================Total params: 10,180Trainable params: 10,180Non-trainable params: 0__________________________________________________________________

Training

Training a CNN works in the same way as a regular neural network, using backpropagration or gradient descent. However, here this is a bit more mathematically complex because of the convolution operations.

If you would like to read more about how regular neural nets work, you can read my previous article.

"""Before the training process, we have to put together a learning process in a particular form. It consists of 3 elements: an optimiser, a loss function and a metric."""
model.compile(loss='sparse_categorical_crossentropy', optimizer = 'adam', metrics=['acc'])
# dataset with handwritten digits to train the model onfrom keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = np.expand_dims(x_train,-1)
x_test = np.expand_dims(x_test,-1)
# Train the model, iterating on the data in batches of 32 samples# for 10 epochs
model.fit(x_train, y_train, batch_size=32, epochs=10, validation_data=(x_test,y_test)
# Training...
Train on 60000 samples, validate on 10000 samplesEpoch 1/1060000/60000 [==============================] - 10s 175us/step - loss: 4.0330 - acc: 0.7424 - val_loss: 3.5352 - val_acc: 0.7746Epoch 2/1060000/60000 [==============================] - 10s 169us/step - loss: 3.5208 - acc: 0.7746 - val_loss: 3.4403 - val_acc: 0.7794Epoch 3/1060000/60000 [==============================] - 11s 176us/step - loss: 2.4443 - acc: 0.8372 - val_loss: 1.9846 - val_acc: 0.8645Epoch 4/1060000/60000 [==============================] - 10s 173us/step - loss: 1.8943 - acc: 0.8691 - val_loss: 1.8478 - val_acc: 0.8713Epoch 5/1060000/60000 [==============================] - 10s 174us/step - loss: 1.7726 - acc: 0.8735 - val_loss: 1.7595 - val_acc: 0.8718Epoch 6/1060000/60000 [==============================] - 10s 174us/step - loss: 1.6943 - acc: 0.8765 - val_loss: 1.7150 - val_acc: 0.8745Epoch 7/1060000/60000 [==============================] - 10s 173us/step - loss: 1.6765 - acc: 0.8777 - val_loss: 1.7268 - val_acc: 0.8688Epoch 8/1060000/60000 [==============================] - 10s 173us/step - loss: 1.6676 - acc: 0.8799 - val_loss: 1.7110 - val_acc: 0.8749Epoch 9/1060000/60000 [==============================] - 10s 172us/step - loss: 1.4759 - acc: 0.8888 - val_loss: 0.1346 - val_acc: 0.9597Epoch 10/1060000/60000 [==============================] - 11s 177us/step - loss: 0.1026 - acc: 0.9681 - val_loss: 0.1144 - val_acc: 0.9693

Summary

In summary, CNNs are especially useful for image classification and recognition. They have two main parts: a feature extraction part and a classification part.

The main special technique in CNNs is convolution, where a filter slides over the input and merges the input value + the filter value on the feature map. In the end, our goal is to feed new images to our CNN so it can give a probability for the object it thinks it sees or describe an image with text.

You can find the entire code here.

Nhiều khuyến nghị liên quan đến não ?

  • Đọc bài báo thực sự thú vị này về não và hơn thế nữa.
  • Tôi cũng giới thiệu cuốn sách này về trí thông minh và não bộ.
  • “Làm thế nào để tạo ra một tâm trí” của Ray Kurzweil.