MẠNG LSTM (Mạng Long Short Term Memory)

Một phần của tài liệu chú thích ảnh tự động dựa trên cnn, rnn và lstm (Trang 35)

1.4.1 Giới thiệu về LSTM

Điểm thuận lợi của mạng nơ-ron hồi quy (RNN) là khả năng sử dụng thông tin ngữ cảnh khi ánh xạ giữa chuỗi đầu vào và chuỗi đầu ra. Tuy nhiên, với kiến trúc RNN tiêu chuẩn phạm vi của ngữ cảnh có thể được truy cập khá hạn chế. Vấn đề là do ảnh hưởng của đầu vào trên tầng ẩn, và vì thế trên đầu ra của mạng hoặc là suy giảm hoặc là tăng lên cấp số nhân theo chu kỳ xung quanh các kết nối hồi quy của mạng. Hiệu ứng này còn gọi là vấn đề biến mất đạo hàm (vanishing gradient problem). Một lượng lớn các nghiên cứu được đưa ra vào những năm 1990 để giải quyết vấn đề giảm đạo hàm cho mạng RNN. Các nghiên cứu bao gồm quá trình huấn luyện không cần tính đạo hàm, như thuật toán giả mô phỏng và rời rạc lỗi truyền, hoặc dùng thời gian trễ, thời gian ràng buộc. Mạng LSTM (Long Short Term Memory) được đưa ra cũng là cách tiếp cận giải quyết vấn đề này. Kiến trúc mạng LSTM bao gồm một tập các mạng con được kết nối hồi quy, còn gọi là các khối nhớ. Các khối có thể được liên tưởng như là phiên bản khác của các chip nhớ trong máy tính số. Mỗi khối nhớ chứa một hoặc nhiều ô nhớ tự liên kết và ba đơn vị: đầu vào, đầu ra và cổng quên cung cấp khả năng liên tục viết, đọc và hoạt động khởi động cho các ô nhớ.

Một mạng LSTM tương đương với mạng RNN trừ việc các đơn vị tổng hợp trong tầng ẩn được thay thế bằng các khối nhớ. Các khối LSTM cũng có thể được hòa trộn với các đơn vị tổng hợp mặc dù về cơ bản là không cần thiết. Tầng đầu ra có thể được sử dụng cho các mạng LSTM như cho mạng RNN chuẩn. Các cổng nhân lên cho phép các ô nhớ LSTM được lưu trữ và truy cập thông tin trên một thời gian dài, vì thế giảm nhẹ vấn đề biến mất đạo hàm. Ví dụ ngay khi cổng đầu vào được đóng lại (có hàm kích hoạt gần 0), sự kích hoạt của ô sẽ không bị ghi đè bởi đầu vào đang đến trong mạng, do đó có thể cung cấp cho mạng sau này bằng cách mở cổng đầu ra. LSTM khá thành công trong một loạt các nhiệm vụ yêu cầu bộ nhớ phạm vi dài, và nó còn được áp dụng trong các vấn đề trong thế giới thực như là cấu trúc thứ cấp proteion, sinh âm nhạc, nhận dạng âm thanh, nhận dạng chữ viết, …

23

Ý tưởng ban đầu của RNN là kết nối những thông tin trước đó nhằm hỗ trợ cho các xử lý hiện tại. Nhưng đôi khi, chỉ cần dựa vào một số thông tin gần nhất để thực hiện tác vụ hiện tại. Ví dụ, trong mô hình hóa ngôn ngữ, chúng ta cố gắng dự đoán từ tiếp theo dựa vào các từ trước đó. Nếu chúng ta dự đoán từ cuối cùng trong câu “Mặt trời lặn ở phía …”, thì chúng ta không cần truy tìm quá nhiều từ trước đó, ta có thể đoán ngay từ tiếp theo sẽ là “Tây”. Trong trường hợp này, khoảng cách tới thông tin liên quan được rút ngắn lại, mạng RNN có thể học và sử dụng các thông tin quá khứ.

Nhưng cũng có trường hợp chúng ta cần nhiều thông tin hơn, nghĩa là phụ thuộc vào ngữ cảnh. Ví dụ nhưng khi dự đoán từ cuối cùng trong đoạn văn bản “Tôi là người Việt Nam. Tôi đang sống ở nước ngoài. Tôi có thể nói thuần thục tiếng … .” Từ thông tin gần nhất cho thấy rằng từ tiếp theo là tên một ngôn ngữ, nhưng khi chúng ta muốn biết cụ thể ngôn ngữ nào, thì cần quay về quá khứ xa hơn, để tìm được ngữ cảnh Việt Nam. Và như vậy, RRN có thể phải tìm những thông tin có liên quan và số lượng các điểm đó trở nên rất lớn. Không được như mong đợi, RNN không thể học để kết nối các thông tin lại với nhau.

Hình 1.15 RNN phụ thuộc long-term [13] .

Hạn chế ở mạng RNN là hidden layer không có trí nhớ dài hạn, hay còn được nhắc tới với tên vanishing/exploding gradient problem [3]. Nếu chỉ dừng lại ở việc áp dụng phương án học chuỗi với RNN thì vấn đề độ dài câu đối thoại sẽ là một bài toán khó. Bằng việc cải tiến, bổ sung các module nhớ cho RNN, LSTM (Long Short Term Memory network) một là trường hợp đặc biệt của RNN được tích hợp sẵn trong phương pháp học chuỗi seq2seq đã giải quyết được vấn đề này.

Long Short Term Memory có khả năng học long-term dependencies. Mô hình này được giới thiệu bởi Hochreiter & Schmidhuber (1997) và được cải tiến lại. Mô hình này có khả năng tương thích với nhiều bài toán nên được sử dụng rộng rãi ở các

ngành liên quan. LSTM được thiết kế nhằm loại bỏ vấn đề phụ thuộc quá dài. Ta quan sát lại mô hình RNN bên dưới, các layer đều mắc nối với nhau. Trong RNN chuẩn, module repeating này có cấu trúc rất đơn giản chỉ gồm một lớp đơn giản tanh layer.

Hình 1.16 Các module lặp của mạng RNN chứa một layer [13] .

LSTM cũng có cấu trúc mắt xích tương tự, nhưng các module lặp có cấu trúc khác hẳn. Thay vì chỉ có một layer neural network, thì LSTM có tới bốn layer, tương tác với nhau theo một cấu trúc cụ thể.

Hình 1.17 Các mô-đun lặp của mạng LSTM chứa bốn layer [13] .

Trong đó, các ký hiệu sử dụng trong mạng LSTM gồm có: hình chữ nhật là các lớp ẩn của mạng nơ-ron, hình tròn biểu diễn toán tử Pointwise, đường kẻ gộp lại với nhau biểu thị phép nối các toán hạng, và đường rẽ nhánh biểu thị cho sự sao chép từ vị trí này sang vị trí khác. Mô hình thiết kế của LSTM là một bảng mạch số, gồm các mạch logic và các phép toán logic trên đó. Thông tin, hay nói khác hơn là tần số của dòng điện di chuyển trong mạch sẽ được lưu trữ, lan truyền theo cách thiết kế bảng mạch. Mấu chốt của LSTM là cell state (trạng thái nhớ), đường kẻ ngang chạy dọc ở trên top diagram. Cell state giống như băng chuyền, chạy xuyên thẳng toàn bộ mắc

25

xích, chỉ một vài tương tác nhỏ tuyến tính (minor linear interaction) được thực hiện. Điều này giúp cho thông tin ít bị thay đổi xuyên suốt quá trình lan truyền.

Hình 1.18 Cell state của LSTM giống như một băng truyền [13] .

LSTM có khả năng thêm hoặc bớt thông tin vào cell state, được quy định một cách cẩn thận bởi các cấu trúc gọi là cổng (gate). Các cổng này là một cách (tuỳ chọn) để định nghĩa thông tin băng qua. Chúng được tạo bởi hàm sigmoid và một toán tử nhân pointwise.

Hình 1.19 Cổng trạng thái LSTM được tạo bởi hàm sigmoid và toán tử nhân. [13]

Hàm kích hoạt Sigmoid có giá trị từ 0 - 1, mô tả độ lớn thông tin được phép truyền qua tại mỗi lớp mạng. Nếu ta thu được zero điều này có nghĩa là “không cho bất kỳ cái gì đi qua”, ngược lại nếu thu được giá trị là một thì có nghĩa là “cho phép mọi thứ đi qua”. Một LSTM có ba cổng như vậy để bảo vệ và điều khiển cell state. Quá trình hoạt động của LSTM được thông qua các bước cơ bản sau.

Bước đầu tiên của mô hình LSTM là quyết định xem thông tin nào chúng ta cần loại bỏ khỏi cell state. Tiến trình này được thực hiện thông qua một sigmoid layer gọi là “forget gate layer” – cổng chặn.

Đầu vào là ℎt-1 và xt, đầu ra là một giá trị nằm trong khoảng [0, 1] cho cell state Ct-1. Số 1 tương đương với “giữ lại thông tin”, số 0 tương đương với “loại bỏ thông tin”.

Bước tiếp theo, cần quyết định thông tin nào cần được lưu lại tại cell state. Ta có hai phần là single sigmoid layer được gọi là “input gate layer” quyết định các giá trị chúng ta sẽ cập nhật. Tiếp theo, một tanh layer tạo ra một vector ứng viên mới Ct được thêm vào trong cell state.

Hình 1.20 LSTM focus I [13]

Công thức tính:

Ở bước tiếp theo, sẽ kết hợp hai thành phần này lại để cập nhật vào cell state. Lúc cập

nhật vào cell state cũ, Ct-1, vào cell state mới Ct. Ta sẽ đưa state cũ hàm ft,để quên

đi những gì trước đó. Sau đó, ta sẽ thêm it ∗ Ct. Đây là giá trị ứng viên mới, co giãn

(scale) số lượng giá trị mà ta muốn cập nhật cho mỗi state.

Hình 1.21 LSTM focus c. [13]

27

Công thức tính ft

Cuối cùng, cần quyết định xem thông tin output là gì. Output này cần dựa trên cell state, nhưng sẽ được lọc bớt thông tin. Đầu tiên, áp dụng single sigmoid layer để quyết định xem phần nào của cell state chúng ta dự định sẽ output. Sau đó, ta sẽ đẩy cell state qua tanh (đẩy giá trị vào khoảng -1 và 1) và nhân với một output sigmoid gate, để giữ lại những phần ta muốn output ra ngoài.

Hình 1.22 LSTM focus o. [13]

1.4.2 Mô hình LSTM

Mô hình LSTM là một bước đột phá đạt được từ mô hình RNN. Nó giải quyết triệt để vấn đề không xử lý được câu hỏi dài mà những mô hình khác đang gặp phải.

Hình 1.23 Mô hình LSTM Networks. [13]

Ở hình 1.36, mỗi một đường mang một véc-tơ từ đầu ra của một nút tới đầu vào của một nút khác. Các hình trong màu hồng biểu diễn các phép toán như: phép cộng véc-tơ, phép nhân véc-tơ, … còn các ô màu vàng được sử dụng để học trong các từng mạng nơ-ron. Các đường hợp nhau kí hiệu việc kết hợp, còn các đường rẽ nhánh chỉ

nội dung của nó được sao chép và chuyển tới các nơi khác nhau.

LSTM cung cấp nhiều khả năng kiểm soát và do đó, kết quả tốt hơn. Nhưng cũng đi kèm với sự phức tạp và chi phí hoạt động nhiều hơn.

29

2CHƯƠNG 2. BÀI TOÁN CHÚ THÍCH ẢNH TỰ ĐỘNG DỰA TRÊN CNN,

RNN & LSTM 2.1 Xác định bài toán.

• Input: Ảnh

Hình ảnh đưa vào có thể được trích xuất từ camera, video, webcam hoặc từ các thiết bị như máy ảnh, smart phone, …

• Output: Văn bản hoặc giọng nói với nhiều ngôn ngữ.

Dữ liệu ra là văn bản và giọng nói với nhiều ngôn ngữ khác nhau như: Tiếng việt, tiếng anh, tiếng pháp, tiếng nhật, …

2.2 Ý tưởng bài toán.

Với Input là ảnh thường được trích xuất đặc trưng (extract feature) qua pre- trained model với dataset lớn như ImageNet và model phổ biến như Darknet, VGG16, ResNet, quá trình được gọi là embedding và output là một vector.

Ý tưởng sẽ là dùng embedding của ảnh và dùng các từ phía trước để dự đoán từ

tiếp theo trong caption.

Ta sẽ sử dụng pre-trained model Inception v3 với dataset Imagenet. Do là pre- trained model yêu cầu ảnh đầu vào là 229*229 nên ta sẽ resize ảnh về kích thước này. Sau khi qua pre-trained model ta sẽ lấy được embedding vector của ảnh, kích thước 256*1

Hình 2.1 Mô hình chú thích ảnh của bài toán

Để dự đoán từ tiếp theo ta sẽ xây dựng từ điển các từ xuất hiện trong training set và bài toán trở thành bài toán phân loại từ, xem từ tiếp theo là từ nào.

30

Sau khi đưa ra chú thích, chúng ta sử dụng tiện ích text to speech (TTS) để chuyển từ văn bản sang giọng nói.

2.3 Tiến trình thực hiện bài toán:

2.3.1 Phát hiện đối tượng (Object detection).

Đầu vào là một ảnh, đối với bài toán phát hiện đối tượng (object detection), ta không chỉ phải phân loại được đối tượng (object) trên bức ảnh mà còn phải định vị được vị trí của đối tượng đó.

Để giải quyết bài toán object detection, ta chia ảnh thành nhiều hộp (box), mỗi box sẽ phát hiện đối tượng trong box đó. Vị trí của đối tượng chính là tọa độ của box đó. Thay vì chia thành từng box, ta sẽ sử dụng thuật toán để lựa chọn những khu vực ứng viên, các vùng ứng viên này có thể tưởng như là những vùng liên thông với nhau trên kênh màu RGB, sau đó với mỗi vùng ứng viên này, ta dùng model để phân loại object. Trong bài toán này chúng tôi sử dụng mô hình YOLOv3 để phát hiện đối tượng trong ảnh.

Phát hiện đối tượng với Yolov3 bằng Karas

Các bước thực hiện phát hiện đối tượng với Yolov3.

Bước 1: Nhập các thư viện

import numpy as np

from numpy import expand_dims

from keras.models import load_model, Model from

keras.preprocessing.image import load_img from

keras.preprocessing.image import img_to_array from

matplotlib import pyplot

from matplotlib.patches import Rectangle

Bước 2: Tạo một Class WeightReader để tải tệp weights đã được huấn luyện trước cho yolov3.

Lớp WeightReader sẽ phân tích cú pháp tệp và tải trọng số (Weights) mô hình vào bộ nhớ để đặt nó trong mô hình Keras.

Chúng ta cần xác định một mô hình Keras có số lượng và loại lớp thích hợp để phù hợp với trọng lượng mô hình đã tải xuống. Kiến trúc mô hình được gọi là

DarkNet ” và ban đầu được dựa trên mô hình VGG-16.

Chúng ta cần tải các trọng số của mô hình. Trọng số mô hình được lưu trữ ở bất kỳ định dạng nào được DarkNet sử dụng. Sử dụng lớp WeightReader được cung cấp trong tập lệnh.

Bước 3: Tạo mô hình Yolov3

#creating the YOLO model

def make_yolov3_model():

input_image = Input(shape=(None, None, 3))

# Layer 0 => 4

x = _conv_block(input_image, [{'filter': 32, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 0}, {'filter': 64, 'kernel': 3, 'stride': 2, 'bnorm': True, 'leaky': True, 'layer_idx': 1},{'filter': 32, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 2},{'filter': 64, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 3}])

# Tạo các Layer từ 5 => 98.

# Layer 99 => 106

yolo_106 = _conv_block(x, [{'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky':

True, 'layer_idx': 99},

{'filter': 256, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 100}, {'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 101}, {'filter': 256, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 102}, {'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 103}, {'filter': 256, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 104},

{'filter': 255, 'kernel': 1, 'stride': 1, 'bnorm': False, 'leaky': False, 'layer_idx': 105}], skip=False)model = Model(input_image, [yolo_82, yolo_94, yolo_106]) return model

Bước 4: Tạo mô hình yolo và tải các trọng lượng đã được huấn luyện trước (pre-trained weights).

# tạo yolo v3

yolov3 = make_yolov3_model ()

# tải các trọng lượng được đào tạo trên Flickr vào mô hình weight_reader = WeightReader ('yolov3.weights')

weight_reader.load_weights (yolov3)

Bước 5: Giá trị của các biến.

Các siêu tham số và giá trị dùng cài đặt trong mô hình YOLOv3 của bài toán.

32

Bước 6: Tải hình ảnh vào đúng hình dạng đầu vào là 460x460 from numpy import expand_dims def load_image_pixels (filename, shape) : # tải hình ảnh để có hình dạng

image = load_img (filename) width, height = image.size

# tải hình ảnh với kích thước yêu cầu

image = load_img (tên tệp, target_size = shape)

#convert to numpy array image = img_to_array (image)

#scale pixel value to [0, 1] image = image.astype ('float32') image / = 255.0

#thêm kích thước để chúng ta có một hình ảnh mẫu = expand_dims (image , 0)

Bước 7: Tạo lớp cho hộp giới hạn

class BoundBox:

def __init__(self, xmin, ymin, xmax, ymax, objness=None, classes=None):

self.xmin = xmin self.ymin = ymin

33 self.xmax = xmax self.ymax = ymax self.objness = objness self.classes = classes self.label = -1 self.score = -1

Bước 8: Xác định các chức năng của:

• Interval overlap

• Intersection over Union(IoU) của hai hộp.

• Non-Max Suppression

• Hàm Sigmoid

def _sigmoid(x):

return 1. / (1. + np.exp(-x))def _interval_overlap(interval_a, interval_b):

x1, x2 = interval_a x3, x4 = interval_bif x3 < x1: if x4 < x1: return 0 else: return min(x2,x4) — x1 else: if x2 < x3: return 0 else: return min(x2,x4) — x3

Bước 9: Giải mã đầu ra (out put) của mạng.

def decode_netout(netout, anchors, obj_thresh, net_h, net_w): grid_h, grid_w = netout.shape[:2]

nb_box = 3

netout = netout.reshape((grid_h, grid_w, nb_box, -1)) nb_class = netout.shape[-1] - 5

boxes = []

netout[..., :2] = _sigmoid(netout[..., :2]) netout[..., 4:] = _sigmoid(netout[..., 4:])

netout[..., 5:] = netout[..., 4][..., np.newaxis] * netout[..., 5:] netout[..., 5:] *= netout[..., 5:] > obj_thresh

for i in range(grid_h * grid_w): row = i / grid_w

col = i % grid_w

for b in range(nb_box):

#4th element is objectness score objectness

= netout[int(row)][int(col)][b][4] if

(objectness.all() <= obj_thresh): continue

# first 4 elements are x, y, w, and h

x, y, w, h = netout[int(row)][int(col)][b][:4]

x = (col + x) / grid_w # center position, unit: image width

y = (row + y) / grid_h # center position, unit: image height

w = anchors[2 * b + 0] * np.exp(w) / net_w # unit: image width

Một phần của tài liệu chú thích ảnh tự động dựa trên cnn, rnn và lstm (Trang 35)

Tải bản đầy đủ (DOCX)

(77 trang)
w