Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Mạng nơ-ron đơn giản với một nơ-ron trong Python

Mạng nơ-ron là lõi cốt lõi của học sâu (deep learning) và có nhiều ứng dụng thực tế trong các lĩnh vực như phân loại hình ảnh, nhận diện giọng nói, phát hiện đối tượng, v.v.

Hãy tìm hiểu mạng nơ-ron là gì và cách nó hoạt động.

Một mạng nơ-ron bao gồm các thành phần chính sau:

  • Lớp đầu vào (input layer), ký hiệu là x
  • Số lượng tùy ý các lớp ẩn (hidden layers)
  • Lớp đầu ra (output layer), ký hiệu là ŷ
  • Tập trọng số (weights) và độ chệch (biases) giữa các lớp, ký hiệu là W và b
  • Hàm kích hoạt (activation function) cho mỗi lớp ẩn, ký hiệu là σ

Trong sơ đồ dưới đây minh họa một Mạng nơ-ron 2 lớp (lớp đầu vào thường không được tính khi đếm số lớp):

Mạng nơ-ron đơn giản với một nơ-ron trong Python

Trong biểu đồ, các hình tròn đại diện cho nơ-ron và các đường nối đại diện cho synapse. Các synapse được dùng để nhân đầu vào với trọng số. Chúng ta có thể coi trọng số là "độ mạnh" của kết nối giữa các nơ-ron. Trọng số quyết định đầu ra của mạng nơ-ron.

Dưới đây là tổng quan ngắn gọn về cách hoạt động của một mạng nơ-ron feed-forward đơn giản:

  1. Nhận đầu vào dưới dạng ma trận (mảng 2D số)
  2. Nhân đầu vào với tập trọng số
  3. Áp dụng hàm kích hoạt
  4. Trả về đầu ra
  5. Tính sai số (error) – chênh lệch giữa đầu ra mong muốn và đầu ra dự đoán
  6. Điều chỉnh trọng số một chút dựa trên sai số
  7. Để huấn luyện, lặp lại quy trình này 1.000+ lần; càng nhiều dữ liệu huấn luyện thì đầu ra càng chính xác

GIỜ HỌC, GIỜ NGỦ (ĐẦU VÀO) — ĐIỂM KIỂM TRA (ĐẦU RA)

2, 9 → 92
1, 5 → 86
3, 6 → 89
4, 8 → ?

Mã ví dụ

from numpy import exp, array, random, dot, tanh

class my_network():
    def __init__(self):
        random.seed(1)
        # Ma trận trọng số 3x1
        self.weight_matrix = 2 * random.random((3, 1)) - 1

    def my_tanh(self, x):
        return tanh(x)

    def my_tanh_derivative(self, x):
        return 1.0 - tanh(x) ** 2

    # Lan truyền xuôi (forward propagation)
    def my_forward_propagation(self, inputs):
        return self.my_tanh(dot(inputs, self.weight_matrix))

    # Huấn luyện mạng nơ-ron
    def train(self, train_inputs, train_outputs, num_train_iterations):
        for iteration in range(num_train_iterations):
            output = self.my_forward_propagation(train_inputs)
            # Tính sai số đầu ra
            error = train_outputs - output
            adjustment = dot(train_inputs.T, error * self.my_tanh_derivative(output))
            # Cập nhật ma trận trọng số
            self.weight_matrix += adjustment

# Chương trình chính
if __name__ == "__main__":
    my_neural = my_network()
    print('Trọng số ngẫu nhiên khi bắt đầu huấn luyện')
    print(my_neural.weight_matrix)

    train_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
    train_outputs = array([[0, 1, 1, 0]]).T

    my_neural.train(train_inputs, train_outputs, 10000)

    print('Trọng số mới sau khi huấn luyện')
    print(my_neural.weight_matrix)

    # Kiểm tra mạng với tình huống mới
    print("Kiểm tra mạng trên ví dụ mới ->")
    print(my_neural.my_forward_propagation(array([1, 0, 0])))

Kết quả

Trọng số ngẫu nhiên khi bắt đầu huấn luyện
[[-0.16595599]
 [ 0.44064899]
 [-0.99977125]]
Trọng số mới sau khi huấn luyện
[[5.39428067]
 [0.19482422]
 [0.34317086]]
Kiểm tra mạng trên ví dụ mới ->
[0.99995873]