a. Bộ thư viện hỗ trợ Học sâu Tensorflow và Keras
Trong thực nghiệm, luận văn đã sử dụng ngôn ngữ lập trình Python với bộ thư viện hỗ trợ nghiên cứu học sâu là Tensorflow và Keras. TensorFlow thế hệ thứ hai của hệ thống học máy của Google Brain, với một bản cài đặt tham khảo đã phát hành dưới dạng phần mềm mã nguồn mở vào ngày 9/11/2015. Keras là một library được phát triển vào năm 2015 bởi François Chollet, là một kỹ sư nghiên cứu deep learning tại google. Nó là một open source cho neural network được viết bởi ngôn ngữ python. Keras là một API bậc cao có thể sử dụng chung với các thư viện deep learning nổi tiếng như Tensorflow (được phát triển bởi Google), CNTK (được phát triển bởi Microsoft), Theano (người phát triển chính Yoshua Bengio). Keras có một số ưu điểm như:
- Dễ sử dụng, xây dựng model nhanh.
- Có thể chạy trên cả CPU và GPU.
- Hỗ trợ xây dựng CNN, RNN hoặc có thể kết hợp cả hai.
Về cơ bản thì Tensorflow sẽ là một thư viện đắc lực giúp hỗ trợ xây dựng các mô hình học sâu cũng như cài đặt một cách dễ dàng. Học viên đã sử dụng thư viện Tensorflow để xây dựng mô hình học máy phát hiện và phân loại nhịp thở từ dữ liệu đầu vào.
37
Hình 2-9: Cấu trúc bộ thư viện Keras
b. Xây dựng mô hình BiLSTM
Để xây dựng được BiLSTM Model thì có hai thành phần chính cần phải quan tâm đến là các API liên quan đến Models và API liên quan đến Layers. Trong hình 2-8 thể hiện cấu trúc của một đơn vị LSTM được sử dụng trong báo cáo. Như đã trình
38
bày ở phần trên, cấu trúc của một khối LSTM gồm 4 mạng noron tương ứng với input gate, forget gate, output gate và new candidate.
Hình 2-10: Cấu trúc một khối LSTM
Hàm kích hoạt cho input gate, forget gate, output gate là hàm hard sigmoid. Một xấp xỉ của hàm sigmoid được cho bởi công thức 2.21. Việc tính hàm hard sigmoid nhanh hơn nhiều so với hàm sigmoid do không phải thực hiện tính 𝑒−𝑥. Hàm kích hoạt cho Output Hidden State và Candidate hidden state là hàm Tanh.
ℎ𝑎𝑟𝑑_𝑠𝑖𝑔𝑚𝑜𝑖𝑑(𝑥) = {
0 𝑖𝑓 𝑥 < −2.5 1 𝑖𝑓 𝑥 > 2.5 0.2 ∗ 𝑥 + 0.5 𝑜𝑡ℎ𝑒𝑟𝑤𝑖𝑠𝑒
(2.21) Kích thước của output hidden state là 64. Sẽ là một phần đầu vào cho các khối LSTM phía sau. Một mô hình BiLSTM sẽ là kết hợp của nhiều khối LSTM, có nghĩa là LSTM hai chiều. Ở lớp cuối, sau khi qua lớp BiLSTM, học viên đã tạo hai hàm
39
softmax với ý nghĩa thực hiện đồng thời hai nhiệm vụ: thứ 1 là phân loại nhịp thở (normal, deep, heavy, other) và thứ 2 là phát hiện nhịp thở (breath – có tiếng nhịp thở, non-breath – không có tiếng nhịp thở). Hình trạng mạng đầy đủ của mạng BiLSTM thể hiện trong hình 2-9 sau:
Hình 2-11: Kiến trúc mạng BiLSTM phát hiện tiếng nhịp thở
Hình 2-12: Hai thành phần chính tham gia xây dựng mô hình
Có nhiều phương thức khởi tạo model nhưng đơn giản hơn là sử dụng thông qua function API. Ưu điểm của phương pháp này có thể tùy biến nhiều hơn, giúp xây dựng các model phức tạp nhiều input và output. Tương tự như trong mạng CNN, dữ liệu cũng được đặt vào các hàng của một ma trận X_train rồi tiến hành chuẩn hóa sử dụng công thức 2.12 và one hot vector các nhãn.
40
Như đã phân tích ở trên mỗi một ma trận đặc trưng sẽ bao gồm 93 hàng tương ứng với số frame của bản ghi âm thanh đó, số cột tương ứng với số đặc trưng mô tả frame đó 39 đối với đặc trưng MFCC, đây cũng là kích thước đầu vào tại mỗi bước thời gian cho mạng LSTM.
Việc học trong mạng LSTM thông qua hai quá trình là lan truyền xuôi theo thời gian và lan truyền ngược theo thời gian. Do mạng phải đi lần lượt từ bước thời gian đầu tiên để tính output hidden state và cell state phục vụ quá trình tính toán cho các bước thời gian sau.
Cụ thể với kích thước mỗi batch được sử dụng trong báo cáo là 64, để tiết kiệm tính toán một ma trận có kích thước (64, đặc trưng mô tả 1 frame) tương ứng với một batch được đưa vào bước thời gian đầu tiên của mạng để tính toán ra ngay kết quả của output gate và cell state của 64 mẫu thuộc batch này. Kết quả output gate sẽ và cell state có kích thước (64, 64) sẽ được chuyển vào làm một phần đầu vào cho bước thời gian thứ hai, ngoài ra kết quả của output gate cũng được đưa thành đầu vào của lớp LSTM ở phía trên có kết nối một một với lớp LSTM ở dưới.
Tương tự như lớp LSTM ở dưới lớp LSTM ở trên cũng cho đầu ra là ma trận kích thước (64, 64). Quá trình lan truyền xuôi sẽ được thực hiện lần lượt theo thời gian. Tuy nhiên chỉ đầu ra bước thời gian cuối cùng (bước thời gian thứ 93 do dữ liệu của bài toán) của lớp trên được kết nối với 1 noron cùng hàm kích hoạt là hàm sigmoid để đưa ra xác suất tương ứng với 64 mẫu trong batch đó. Quá trình lan truyền xuôi theo thời gian của batch dừng ở đây.
Vì muốn tận dụng ưu điểm của LSTM ngược và LSTM xuôi để phân tích dữ liệu âm thanh nhịp thở theo thời gian thực thì học viên đã sử dụng mô hình BiLSTM. Kết quả của quá trình lan truyền xuôi sẽ là đầu vào cho quá trình lan truyền ngược theo thời gian, trung bình lỗi của batch được tính theo công thức 2.20. Việc lan truyền ngược sẽ đi lần lượt từ bước thời gian 93 về bước thời gian 1, từ lớp LSTM trên xuống lớp LSTM ở dưới. Đạo hàm từng phần của cổng trong các khối LSTM với hàm mất mát sẽ được tính để phục vụ cho quá trình tối ưu của thuật toán adam.
41
Quá trình lan truyền ngược được framework keras tính sẵn dựa trên cấu hình mạng được khai báo bằng cách sử dụng phương thức fit của model. Giống với mạng CNN learning rate decay và callback LogResult được sử dụng trong phương thức fit của keras
import numpy as np
from keras.models import Sequential,Model inp = Input(shape=data_input_shape)
z1 = Bidirectional(CuLSTM(64, return_sequences=True))(inp) z2 = Bidirectional(CuLSTM(units=64, return_sequences=True))(z1) z3 = add([z1, z2]) # residual connection
z4 = Bidirectional(CuLSTM(units=64, return_sequences=True))(z3) z5 = Bidirectional(CuLSTM(units=64, return_sequences=False))(z4) z6 = add([z4, z5]) # residual connection
z61 = Flatten()(z6)
z7 = Dense(128, activation='relu')(z61) z8 = Dropout(0.5)(z7)
out = Dense(classes_breaths, activation='softmax')(z8)
out2 = Dense(classes_classification, activation='softmax')(z8) model = Model(inputs=[inp], outputs=[out, out2])
opt = Adam(lr=learning_rate)
model.compile(loss="categorical_crossentropy", optimizer=opt,
metrics=['accuracy', tf.keras.metrics.Precision(), get_recall, get_f1]) model.summary() model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test)) Lệnh Ý nghĩa compile
Sau khi build model xong thì compile nó có tác dụng biên tập lại toàn bộ model của chúng ta đã build. Ở đây, có thể chọn các tham số để training model
summary Method này giúp chúng ta tổng hợp lại model xem model có bao nhiêu layer, tổng số tham số bao nhiêu,shape của mỗi layer
42
fit Dùng để đưa data vào training để tìm tham số model predict Dùng để predict nhãn dữ liệu mới
evaluate Để tính toán độ chính xác của model
history Dùng để xem accuracy loss qua từng epochs. Thường dùng với matplotlib để vẽ chart
Một số tham số cấu hình được lựa chọn trong quá trình training dữ liệu và tạo LSTM Model:
- Sequence Preprocessing (tiền xử lý chuỗi): dữ liệu âm thanh có dạng là một vector (mảng một chiều) do đó việc chọn loại xử lý chuỗi là phù hợp nhất. Trong tham số loại này chọn lựa pad_sequences để xử lý các chuỗi dữ liệu có độ dài không giống nhau, đảm bảo đầu vào dữ liệu độ dài giống nhau.
- Loss functions (quyết định độ quên dữ liệu sau từng bước lặp): sử dụng tham số binary_crossentropy do trong bài toán phát hiện nhịp thỉ chỉ bao gồm hai phân lớp là nhịp thở (+) hoặc không phải nhịp thở (-).
- Metrics (thước đo để đánh giá độ chính xác của model): loại tham số này phù hợp với cả bộ dữ liệu chỉ có hai nhãn hoặc nhiều phân lớp dữ liệu. Trong đó binary_accuracy phù hợp cho phân loại lớp với 2 nhãn dữ liệu và categorical_accuracy phù hợp với phân lớp nhiều nhãn dữ liệu.
- Activations (hàm activations train dữ liệu): lựa chọn Sigmoid range (0, 1)
cho phân lớp binary.
- Callbacks (xử lý tình huống đang train model thì gặp lỗi): tham số này có các lựa chọn sau đây. ModelCheckpoint (lưu lại model sau mỗi lần epoch dữ liệu), EarlyStopping (dừng train model khi hoàn thành một lần chạy duy nhất không cải tiến model thêm), ReduceLROnPlateau (nếu phát hiện
43
lỗi thì dừng train model, model không được cải thiện thêm). Như vậy lựa chọn ModelCheckpoint là phương án phù hợp nhất.
- Backends: Vì Keras là thư viện bậc cao còn thực tế nó vẫn cần phải kết nối đến một thư viện Học sâu mức thấp hơn, lựa chọn tham số này cho phép tùy biến chọn lựa thư viện Học sâu phù hợp. Trong nghiên cứu này, luận văn sử dụng “TensorFlow” cho cấu hình tham số backends.
Để có thể lưu lại LSTM model, nghiên cứu này đã sử dụng định dạng file H5. Sau khi train model thành công, sẽ lưu lại file này để tái sử dụng cho quá trình dự đoán nhãn dữ liệu.
# serialize model to JSON
model_json = model.to_json()
with open("model_multitask.json", "w") as json_file: json_file.write(model_json)
# serialize weights to HDF5
model.save_weights("model_multitask.h5")
print("Saved model")
# load json and create model
json_file = open('model_multitask.json', 'r')
loaded_model_json = json_file.read() json_file.close()
loaded_model = model_from_json(loaded_model_json)
# load weights into new model
loaded_model.load_weights("multitask.h5")
44
2.4 Sơ lược về hệ thống phát hiện và phân loại nhịp thở
Hình 2-13: Sơ đồ hệ thống phát hiện và phân loại nhịp thở
Một hệ thống theo dõi nhịp thở trong hình 3-8 sẽ có bao gồm bốn lớp để thực hiện trong quá trình nhận dạng ra một đoạn âm thanh có phải là nhịp thở hay không như sau:
- Lớp Physical: Lớp này hay còn gọi là lớp Vật lý bao gồm các thiết bị máy tính thu nhỏ Raspberry Pi không dây có gắn Micro để thu thập được dữ liệu là các file audio chứa nhịp thở của bệnh nhân. Máy tính thu nhỏ Raspberry Pi Zero được hỗ trợ các kết nối mạng wireless LAN và Bluetooth, microphone là BETA 98H/C. Thiết bị được thiết bị nhôm nguyên khối, dễ dàng cho việc đeo lên người bệnh nhân và thuận tiện cho việc thu dữ liệu âm thanh nhịp thở. Chúng tôi đã phát triển một mô đun nhúng trên thiết bị để ghi dữ liệu âm thanh nhịp thở và gửi chúng đến lớp tiếp theo. Chúng tôi sử dụng các thiết bị phần cứng tự chế do giá thành các thiết bị tự chế nhỏ hơn rất nhiều so với các thiết bị khác như (mobilephone), ngoài ra thì độ chính xác trên các thiết bị này được chúng tôi nghiên cứu và đã đạt được kết quả rất khả quan là trên 90% về độ chính xác.
- Lớp Mobile computing: Lớp này có nhiệm vụ trung chuyển dữ liệu giữa lớp Phisical và lớp Cloud. Lớp Mobile computing bao gồm một Raspberry Pi 4 – rẻ hơn sử dụng các thiết bị Anroid và một Wi-Fi router; được sử
45
dụng trong hai kịch bản: “Xem tại bệnh viện” và “Xem tại nhà”. Kịch bản thứ nhất “Xem tại bệnh viện”, một ứng dụng Python được phát triển để điều khiển thu âm thanh nhịp thở tại lớp Physical và chuyển dữ liệu âm thanh nhịp thở lên lớp Cloud. Kịch bản thứ hai “Xem tại nhà”, với kịch bản này sẽ giúp bác sĩ giám sát và thông báo về thông tin của bệnh nhân. Trong kịch bản thứ 2, chúng tôi triển khai một mô hình học sâu CNN tại biên để theo dõi dữ liệu âm thanh nhịp thở theo thời gian thực, mô hình học sâu CNN này có thể chạy trên thiết bị có cấu hình thấp và trực tiếp gửi kết quả tới bác sỹ.
- Lớp Cloud: Lớp Cloud sẽ thực hiện ba nhiệm vụ chính:
o Huấn luyện mô hình: Chúng tôi huấn luyện hai mô hình cho hai kịch bản: (1) một mô hình nhẹ sẽ chạy trên các thiết bị ở biên; (2) một mô hình nặng sẽ thực thi tại máy chủ trung tâm với độ chính xác cao. Với mô hình thứ nhất được sử dụng để giám sát thời gian thực tại bệnh viên, trong khi mô hình thứ hai để giám sát bệnh nhân tại nhà.
o Giám sát bệnh nhân từ xa tại nhà: Đây là nhiệm vụ giám sát bệnh nhân tại nhà, lớp Physical sẽ triển khai tại nhà của các bệnh nhân. Lớp Cloud sẽ giám sát dữ liệu chuyển từ gateway, phân tích dữ liệu và gửi kết quả cho bác sỹ. Như trong hình (Giám sát (Monitoring) → Gateway → Transferring (at-home) → Mô hình nặng (High-cost model) → Thông báo tại nhà (At-home notifying)).
o Quản lý bệnh nhân: Cho tất cả kịch bản (Xem tại nhà và Xem tại bệnh viện), kết quả được lưu trữ tại lớp Cloud. Do đó, một máy chủ web được hoạt động như một Hệ thống quản trị thông tin (Management Information System - MIS) được triển khai để hỗ trợ bác sỹ trong việc phân tích thông tin và cũng quản lý các bệnh nhân của họ.
46
- Lớp Application: bác sĩ truy cập vào hệ thống MIS để theo dõi và phân tích bệnh lý hô hấp của bệnh nhân; người nhà bệnh nhân cũng có thể theo dõi bệnh nhân thông qua thiết bị của họ (máy tính hoặc điện thoại) khi truy cập vào hệ thống MIS.
Đối với phương thức giao tiếp, chúng tôi sử dụng Bluetooth để chuyển giao dữ liệu thu thập từ các thiết bị máy tính nhúng tới ứng dụng điện thoại. Ngoài ra, giao tiếp giữa các lớp với nhau sẽ dựa trên kết nối WiFi.
2.5 Kết chương
Trước khi kết thúc chương nội dung số 2, luận văn xin được điểm lại một số nội dung trong chương nội dung số 2 như sau:
- Trình bày sơ lược về phương pháp Học sâu, trong đó chú trọng giải thích thuật ngữ học sâu và mối quan hệ giữa Trí tuệ nhân tạo – Học máy – Học sâu. Tìm hiểu những dấu mốc quan trọng của Học sâu cũng như đưa ra một số lý do giải thích vì sao Học sâu lại đem lại hiệu quả mạnh như vậy và các ứng dụng của Học sâu.
- Trình bày về kỹ thuật LSTM: mạng noron hồi quy và mạng LSTM.
- Xây dựng BiLSTM cho bài toán đồng thời vừa phát hiện nhịp thở và vừa phân loại nhịp thở: các bước nhận dạng nhịp thở sử dụng LSTM, thu thập và chuẩn hóa dữ liệu, lọc tín hiệu nhiễu bằng bộ lọc Kalman, tạo ra model BiLSTM bằng cách sử dụng thư viện Keras.
47
Chương 3. THỰC NGHIỆM, ĐÁNH GIÁ KẾT QUẢ PHÂN LOẠI NHỊP THỞ
Trong chương 3 học viên sẽ trình bày vào ba vấn đề chính là: thu thập dữ liệu, đánh giá các thực nghiệm và giới thiệu hệ thống nhận dạng nhịp thở. Đồng thời, học viên cũng đưa ra những kết quả đạt được trong việc phát triển ứng dụng phát hiện nhịp thở.
3.1 Thu thập dữ liệu
a. Định dạng file dữ liệu phù hợp
Về vấn đề thu thập dữ liệu, nói đến âm thanh và tín hiệu âm thanh nói chung là một trường nghiên cứu rất rộng lớn và phức tạp nếu muốn nghiên cứu sâu. Trong phạm vi luận văn này, âm thanh được coi như một đối tượng dữ liệu để qua đó tiến hành thử nghiệm đánh giá kết quả. Việc sử dụng dữ liệu âm thanh như nào nào cho phù hợp cũng phải được tính đến và lựa chọn kỹ lưỡng. Sao cho lượng thông tin cung cấp từ dữ liệu âm thanh là vừa đủ để không làm sai lệch kết quả cuối cùng lại vừa đảm bảo hiệu năng xử lý và tính toán của thuật toán được sử dụng.
Trong quá trình thử nghiệm để tìm ra đâu là phương án tối ưu nhất cho bài toán nhận dạng, luận văn có một bảng thống kê như sau:
Bảng 3-1: So sánh kết quả thử nghiệm lấy mẫu dữ liệu âm thanh
Thời gian lấy mẫu (giây) Số bít dữ liệu âm thanh Mono / Stereo Tần số lấy mẫu (Hz) Dung lượng file (MB) 60 8 Mono 8000 0.458 60 8 Mono 44100 2.523 60 16 Mono 8000 0.916
48
60 16 Mono 44100 5.047
Qua kết quả so sánh trên, có thể thấy rằng sử dụng tần số lấy mẫu ở mức 8000Hz, kênh Mono và số bít âm thanh là 8 sẽ cho phép đáp ứng được dữ liệu đủ để mang đến kết quả chính xác lại phù hợp với việc đáp ứng thời gian xử lý.
b. Thu thập dữ liệu
Dữ liệu được thu thập như sau. Người cần được theo dõi và lấy dữ liệu sẽ đeo thiết bị Raspberry Pi không dây có gắn micro ở cánh tay. Khi kết nối bắt đầu ổn định, sẽ bắt đầu thu thập dữ liệu. Người được theo dõi sẽ thở bình thường trong thời gian