Bài toán 2: Dự đoán xác suất mắc bệnh của một người dựa trên các

Một phần của tài liệu HD3 trần ngọc tiến nghiên cứu một số ứng dụng của mạng thần kinh nhân tạo trong nhận dạng số viết tay và phát hiện nguy cơ mắc bệnh (Trang 95 - 127)

sức khỏe cụ thể

Do điều kiện khách quan, nhóm không thể thu thập được dữ liệu thực tế từ các bệnh viện nên nhóm đã tìm hiểu và nghiên cứu các chỉ số của bệnh nhân sau khi xét nghiệm máu về mức độ ảnh hưởng của chúng tới một số loại bệnh ung thư phổ biến. Dựa vào các ngưỡng chỉ số của người bình thường và người bệnh nhóm tạo ra một tập dữ liệu gồm 200000 hàng, 22 cột. Mỗi hàng tương ứng với một hồ sơ bệnh nhân, mỗi cột tương ứng với một chỉ số trong kết quả xét nghiệm máu. Để có thể dễ hình dung nhóm sẽ thực hiện bài toán với 3 loại bệnh là:

Ung thư gan: Bệnh ung thư gan được phản ành bởi 3 chỉ số chính là : PIVKA-II, AFP, AFP_L3

Ung thư tuyến tụy: Bệnh ung thư tuyến tụy được phản ành bởi 2 chỉ số chính là: CEA, CA19-9

Ung thư vòm họng: Bệnh ung thư vòm họng được phản ành bởi 3 chỉ số chính là : EBV, SSC

95 Chương trình code:

1 Khai báo thư viện và thiết lập giao diện import tkinter.ttk

import numpy as np import pandas as pd import tkinter

from tkinter import*

from tkinter import messagebox import matplotlib.pyplot as plt root = Tk()

# tạo tiêu đề cho app

root.title('CHAN_DOAN_BENH') # tạo kích thước cửa sổ

root.geometry("1400x500") # tạo hàm cập nhật listbox color = "black"

def update(data):

96 # xóa dữ liệu trên list

my_list.delete(0, END)

# thêm các toppings vào listbox for item in data:

my_list.insert(END, item)

# cập nhật listbox theo các kí tự gõ trên entry def fillout(e):

# xóa entry

my_entry.delete(0, END)

# thêm vào entry khi click chuột chọn một item trong listbox my_entry.insert(0, my_list.get(ANCHOR))

def check(e):

# lấy những gì được gõ ở phần entry typed = my_entry.get()

# nếu không gõ gì trên entry thì data = tất cả các item hiện có lưu ở biến toppings if typed == '': data = toppings # nếu có kí tự được gõ else: # data là một mảng trắng data = []

# khởi tạo vòng lặp với biến item chạy lần lượt các item trong toppings for item in toppings:

# trả về các kí tưj trung khớp trên entry và item trong biến toppings if typed.lower() in item.lower():

# lưu các kí tự trùng khớp vào mảng data data.append(item)

97 # cập nhật mảng data hiện tại

update(data) # tạo label

my_label = Label(root, text="SEARCH", font=("Helvetica", 13), fg=color) # xác định toạ độ cua label trên giao diện (adsbygoogle = window.adsbygoogle || []).push({});

my_label.place(x=5,y=12)

# tạo một entry box để nhập tư khóa

my_entry = Entry(root, font=("Helvetica", 20), fg = color) # xác định toạ độ cua entry box trên giao diện

my_entry.place(x = 100, y=8)

# tạo môt listbox chưa các item

my_list = Listbox(root, height = 20,width=70,fg = color) # xác định toạ độ cua listbox trên giao diện

my_list.place(x=50,y=60)

# khởi tạo mảng trắng toppings toppings = []

# khởi tạo môt vòng lặp 5000 lần for i in range(5000):

# khởi tạo một item gán vào biến list list = ("BN{}".format(i))

# lưu biến vừa khởi tạo vào mảng toppings toppings.append(list)

# cập nhật giá trị hiện tại của mảng toppings update(toppings)

98

# thực hiện điền item được click chon lên entry_box gọi hàm fillout my_list.bind("<<ListboxSelect>>", fillout)

# thực hiện tìm kiếm các item có trong toppings gọi hàm check my_entry.bind("<KeyRelease>", check)

# khởi tạo hàm xử lí khi bấm button

2 Đọc và xử lý dữ liệu từ bảng training def handle_bt1():

# đọc file trainning

data = pd.read_csv("trainning_ungthu1.csv") # lưu lại gtri vào một mảng data

data = np.array(data)

# xáo trộn ngâu nhiên các hàng np.random.shuffle(data)

# tạo ma trận 0 kích thước 200000x22 train = np.zeros((200000, 22))

# lấy các gtri của từng hàng trong mỗi cột chia cho các gtri cho trước để làm nhỏ đầu vào

# sau đó điền các gtri đó vào hàng và côt tương ứng của ma trận 0 đã tạo ở trên for i in range(200000): train[i, 0] = data[i, 0] / 7 for i in range(200000): train[i, 1] = data[i, 1] / 180 for i in range(200000): train[i, 2] = data[i, 2] / 0.6 for i in range(200000):

99 train[i, 3] = data[i, 3] / 105 for i in range(200000): train[i, 4] = data[i, 4] / 40 for i in range(200000): train[i, 5] = data[i, 5] / 390 for i in range(200000): train[i, 6] = data[i, 6] / 20 for i in range(200000): train[i, 7] = data[i, 7] / 12 for i in range(200000): train[i, 8] = data[i, 8] / 6 for i in range(200000): train[i, 9] = data[i, 9] / 1.2 for i in range(200000): train[i, 10] = data[i, 10] / 1 for i in range(200000): train[i, 11] = data[i, 11] / 0.5 for i in range(200000): train[i, 12] = data[i, 12] / 0.7 for i in range(200000): train[i, 13] = data[i, 13] / 360 for i in range(200000): train[i, 14] = data[i, 14] / 12 for i in range(200000): train[i, 15] = data[i, 15] / 12 for i in range(200000): train[i, 16] = data[i, 16] / 6 for i in range(200000): train[i, 17] = data[i, 17] / 6

100 for i in range(200000): train[i, 18] = data[i, 18] / 60 for i in range(200000): train[i, 19] = data[i, 19] / 8 for i in range(200000): train[i, 20] = data[i, 20] / 130 for i in range(200000): train[i, 21] = data[i, 21] / 430

#khởi tạo ma trận xtrain là một mảng con của ma trận train ( các hàng 0,1,2,..194999),(các cột 0,1,2,..21)

# sau đó chuyển vị ma trận thu được một ma trận xtrain kích thước 22 x 195000 xtrain = np.array(train[:195000, :21]).T

# khởi tạo ma trận ytrain l một mảng con của ma trận data ( các hàng 0,1,2,..194999), (các cột 22,23,24)

# sau đó chuyển vị ma trận thu được một ma trận ytrain kích thước 3 x 195000 ytrain = np.array(data[:195000, 22:25]).T (adsbygoogle = window.adsbygoogle || []).push({});

# khởi tạo ma trận xtest là một mảng con của ma trận train (các hàng 194999,195000,..199999),(các cột 0,1,2,..21)

# sau đó chuyển vị ma trận thu được một ma trận xtest kích thước 22 x 5000 xtest = np.array(train[195000:200000, :21]).T

# khởi tạo ma trận ytest là một mảng con của ma trận data (các hàng 194999,195000,..199999),(các cột 22,23,24)

# sau đó chuyển vị ma trận thu được một ma trận xtest kích thước 22 x 5000 ytest = np.array(data[195000:200000, 22:25]).T

# gán các biến m, n tương ứng kích thước ma trận xtrain m, n = np.array(xtrain).shape

101

3 Khởi tạo các bộ trọng số, thực hiện lan truyền tiến, lan truyền ngược, các hàm và thuật toán liên quan

# khởi tạo các hàm tính toán giống với vd về nhận diện số viết tay def trong_so(): w1 = np.random.rand(20, 21) - 0.5 b1 = np.random.rand(20, 1) - 0.5 w2 = np.random.rand(3, 20) - 0.5 b2 = np.random.rand(3, 1) - 0.5 return w1, b1, w2, b2 def Relu(Z): return np.maximum(Z, 0) def sigmoid(x): return 1 / (1 + np.exp(-x)) def lan_truyen_tien(w1, w2, b1, b2, X): Z1 = np.dot(w1, X) + b1 A1 = Relu(Z1) Z2 = np.dot(w2, A1) + b2 A2 = sigmoid(Z2) return Z1, A1, Z2, A2

# khởi tạo hàm tính lossfunction trên toàn bộ dữ liệu def lossfunction(A2):

# khởi tạo biến loss = 0 loss = 0

# khởi tạo một mảng trắng losstable = []

102 for i in range(3):

# tính lossfunction của các label 1 gán vào biến loss1 loss1 = - ytrain[i, :] * np.log(A2[i, :])

# tính lossfunction của các label 0 gán vào biến loss2 loss2 = -(1 - ytrain[i, :]) * np.log(1 - A2[i, :])

# tính tổng lossfunction của 2 label 1 và 0 và gán vào biến sum_loss1 sum_loss1 = loss1 + loss2

# tính gtri lossfunction trung bình trên cả bộ dữ liệu trainning gán vào biên sum_loss1

sum_loss1 = np.sum(sum_loss1) / n

# cộng sum_loss1 vào biến loss và lưu gtri vào biến loss loss += sum_loss1

# ghi lại giá trị lossfunction vào mảng trắng đã tạo ở trên losstable.append(sum_loss1)

# trả ra gtri của hàm return losstable, loss / 3 def ReLU_deriv(Z): return Z > 0

def backward_prop(Z1, A1, Z2, A2, w1, w2, X, Y): dZ2 = A2 - Y dW2 = 1 / n * dZ2.dot(A1.T) db2 = 1 / n * np.sum(dZ2) dZ1 = w2.T.dot(dZ2) * ReLU_deriv(Z1) dW1 = 1 / n * dZ1.dot(X.T) db1 = 1 / n * np.sum(dZ1) return dW1, db1, dW2, db2

103

def update_params(w1, b1, w2, b2, dW1, db1, dW2, db2, alpha): w1 = w1 - alpha * dW1

b1 = b1 - alpha * db1 w2 = w2 - alpha * dW2 b2 = b2 - alpha * db2 return w1, b1, w2, b2

def GD(X, Y, alpha, iter): w1, b1, w2, b2 = trong_so() # khởi tạo mảng trắng loss_table = [] # khởi tạo vòng lặp for i in range(iter): Z1, A1, Z2, A2 = lan_truyen_tien(w1, w2, b1, b2, X)

dW1, db1, dW2, db2 = backward_prop(Z1, A1, Z2, A2, w1, w2, X, Y) # gán giá trị đầu ra của hàm lossfunction(A2) vào 2 biến losstable,loss1 losstable,loss1 = lossfunction(A2)

# ghi lại giá trị của loss1 vào mảng trắng loss_table.append(loss1)

w1, b1, w2, b2 = update_params(w1, b1, w2, b2, dW1, db1, dW2, db2, alpha) # trả ra giá trị của hàm GD()

return w1, b1, w2, b2, loss_table, losstable

# lưu giá trị trả ra của hàm GD(xtrain, ytrain, 0.1, 900) vào các biến w1, b1, w2, b2, loss_table, losstable (adsbygoogle = window.adsbygoogle || []).push({});

w1, b1, w2, b2, loss_table, losstable = GD(xtrain, ytrain, 0.1, 900)

# gán giá trị trả ra A2 của hàm lan_truyen_tien(w1, w2, b1, b2, xtrain) vào biến predict_train

_, _, _, predict_train = lan_truyen_tien(w1, w2, b1, b2, xtrain)

104 predict_test

_, _, _, predict_test = lan_truyen_tien(w1, w2, b1, b2, xtest)

#gán gtri lần lượt các hàng 0,1,2 của ma trận losstable vào các biến để biểu diễn gtri hàm mất mát

loss_UTG = losstable[0] loss_UTTT = losstable[1] loss_UTVH = losstable[2]

#in gtri hàm mất mát của mỗi loại bệnh print("loss_UTG",loss_UTG)

print("loss_UTTT", loss_UTTT) print("loss_UTVH", loss_UTVH)

4 Tính toán độ chính xác của bộ trọng số và kết quả dự đoán # tạo vòng lặp để đánh giá

# j chạy từ 0 - 3 for j in range(3): # i chạy từ 0 - n for i in range(n):

# nếu gtri tại hàng j cột i của predict_train >= 0,5 thi gán cho nó gtri 1 if predict_train[j, i] >= 0.5:

predict_train[j, i] = 1

# nếu gtri tại hàng j cột i của predict_train < 0,5 thi gán cho nó gtri 0 else:

predict_train[j, i] = 0 for j in range(3):

for i in range(5000):

# nếu gtri tại hàng j cột i của predict_test >= 0,5 thi gán cho nó gtri 1 if predict_test[j, i] >= 0.5:

105 predict_test[j, i] = 1

# nếu gtri tại hàng j cột i của predict_test < 0,5 thi gán cho nó gtri 0 else:

predict_test[j, i] = 0

# so sánh lần lượt các phần tử trong mảng predict_train với ytrain

# đem tổng số các phần tử trùng khớp chia cho tổng số các phần tư của ytrain # gán giá trị tìm được vào biến acctrain

acctrain = np.sum(predict_train == ytrain) / 585000 # nhân acctrain với 100

acctrain = acctrain*100

# so sánh lần lượt các phần tử trong mảng predict_test với ytest

# đem tổng số các phần tử trùng khớp chia cho tổng số các phần tư của ytest # gán giá trị tìm được vào biến acctest

acctest_UTG = np.sum(predict_test[0,:] == ytest[0,:]) / 5000 acctest_UTTT = np.sum(predict_test[1, :] == ytest[1, :]) / 5000 acctest_UTVH = np.sum(predict_test[2, :] == ytest[2, :]) / 5000 # nhân acctest với 100

acctest_UTG = float(acctest_UTG * 100) acctest_UTTT = float(acctest_UTTT * 100) acctest_UTVH = float(acctest_UTVH * 100) # khởi tảo mảng con của xtest

input = xtest[:, 2]

# reshape mảng về kích thước 6x1 input = np.array(input).reshape(21, 1) (adsbygoogle = window.adsbygoogle || []).push({});

# gán giá trị trả ra A2 của hàm lan_truyen_tien(w1, w2, b1, b2, input) vào biến test _, _, _, test = lan_truyen_tien(w1, w2, b1, b2, input)

# gán các gtri lần lượt các hàng của mảng vào các biến UTGAN, UTTT, UTVH UTGAN1 = float(test[0])*100

106 UTTTUY1 = float(test[1])*100

UTVHONG1 = float(test[2])*100

5 In thông số, kết quả ra giao diện

# khởi tạo label trên app hiển thị mã bệnh nhân + kết qua của entry_box khởi tạo ở trên lbl.configure(text="MÃ BỆNH NHÂN:" +" "+ my_entry.get(), fg = color)

# thay đổi nội dung hiển thi của label

suckhoe.configure(text ="CHỈ SỐ SỨC KHỎE:",fg = "RED")

# thay đổi nội dung các label bằng các chỉ số chính là các giá trị lần lượt tại từng hàng của mảng input

lbl11.configure(text="-RBC:" +" "+ str(data.T[0,2]) +" "+ "T/L",fg = color) lbl12.configure(text="-HBG:" + " "+ str(data.T[1,2]) +" "+"G/L",fg = color) lbl13.configure(text="-HCT:" +" "+ str(data.T[2,2])+" "+"L/L",fg = color) lbl14.configure(text="-MCV:" +" "+ str(data.T[3,2])+" "+"fL",fg = color)

lbl15.configure(text="-PIVKA-II:" +" "+ str(data.T[4,2])+" "+"mAu/ml",fg = color) lbl16.configure(text="-MCHC:" +" "+ str(data.T[5,2])+" "+"g/L",fg = color)

lbl17.configure(text="-AFP:" + " " + str(data.T[6, 2]) + " " + "ul/mL", fg=color) lbl18.configure(text="-EBV:" + " " + str(data.T[7, 2]) + " " + "G/L", fg=color) lbl19.configure(text="-CEA:" + " " + str(data.T[8, 2]) + " " + "ng/mL", fg=color) lbl20.configure(text="-SSC:" + " " + str(data.T[9, 2]) + " " + "ng/mL", fg=color) lbl21.configure(text="-GGT:" + " " + str(data.T[10, 2]) + " " + "U/L", fg=color) lbl22.configure(text="-BASO:" + " " + str(data.T[11, 2]) + " " + "G/L", fg=color) lbl23.configure(text="-LUC:" + " " + str(data.T[12, 2]) + " " + "G/L", fg=color) lbl24.configure(text="-PLT:" + " " + str(data.T[13, 2]) + " " + "G/L", fg=color) lbl25.configure(text="-AFP_L3:" + " " + str(data.T[14, 2]) + " " + "%", fg=color) lbl26.configure(text="-MPV:" + " " + str(data.T[15, 2]) + " " + "fL", fg=color) lbl27.configure(text="-GLU:" + " " + str(data.T[16, 2]) + " " + "mm/L", fg=color) lbl28.configure(text="-AFP:" + " " + str(data.T[17, 2]) + " " + "mm/L", fg=color)

107

lbl29.configure(text="-CA19-9:" + " " + str(data.T[18, 2]) + " " + "U/mL", fg=color) lbl30.configure(text="-URE:" + " " + str(data.T[19, 2]) + " " + "umol/L", fg=color) lbl31.configure(text="-CRE:" + " " + str(data.T[20, 2]) + " " + "umol/L", fg=color) lbl32.configure(text="-URIC:" + " " + str(data.T[21, 2]) + " " + "umol/L", fg=color) # thay đổi nội dung label dự đoán kết quả

UTG.configure(text = "NGUY CO UNG THU GAN: %0.2f"%(UTGAN1)+"%",fg = color)

UTTT.configure(text = "NGUY CO UNG THU TUYEN TUY: %0.2f"%(UTTTUY1)+"%",fg = color)

UTVH.configure(text = "NGUY CO UNG THU VOM HONG: %0.2f"%(UTVHONG1)+"%",fg = color)

# thay đổi nội dung label độ chính xxác acc_bp.configure(text = "%0.2f"%acc_bp + "%")

acc_UTG.configure(text="%0.2f" % acctest_UTG + "%",fg = color) acc_UTTT.configure(text="%0.2f" % acctest_UTTT + "%",fg = color) acc_UTVH.configure(text="%0.2f" % acctest_UTVH + "%",fg = color) # tháy đổi nội dung label tính toán độ chính xác trung bình trên cả 3 bệnh lbl4.configure(text="CHẨN ĐOÁN ", fg="red")

# khởi tạo một đầu vào tương tưj in ra màn hình để kiểm tra input = xtest[:, 2]

input = np.array(input).reshape(21, 1)

_, _, _, test1 = lan_truyen_tien(w1, w2, b1, b2, input) for i in range(3):

if test1[i,0] >=0.5: test1[i,0] = 1

108 else:

test1[i,0] = 0 predict = test1[:,0] print("x_test",xtest[:,2])

print("label thuc y_test",ytest[:,2]) print("label predict: ",predict)

solanlap = [i for i in range(900)] plt.plot(solanlap, loss_table, 'r')

plt.title("ảnh hưởng của iteration tới LOSSFUNCTION") plt.xlabel("iteration")

plt.ylabel("loss") plt.show()

# khởi tạo hàm thực thi button "RESET" def handle_bt2(): (adsbygoogle = window.adsbygoogle || []).push({});

# thay đổi thông tin các label hiển thị trên màn hình lbl.configure(text="NO INFORMATION", fg = "red") suckhoe.configure(text="", fg="red") lbl11.configure(text="", fg="red") lbl12.configure(text="", fg="red") lbl13.configure(text="", fg="red") lbl14.configure(text="", fg="red") lbl15.configure(text="", fg="red") lbl16.configure(text="", fg="red") lbl17.configure(text="", fg="red") lbl18.configure(text="", fg="red") lbl19.configure(text="", fg="red")

109 lbl20.configure(text="", fg="red") lbl21.configure(text="", fg="red") lbl22.configure(text="", fg="red") lbl23.configure(text="", fg="red") lbl24.configure(text="", fg="red") lbl25.configure(text="", fg="red") lbl26.configure(text="", fg="red") lbl27.configure(text="", fg="red") lbl28.configure(text="", fg="red") lbl29.configure(text="", fg="red") lbl30.configure(text="", fg="red") lbl31.configure(text="", fg="red") lbl32.configure(text="", fg="red")

UTG.configure(text="NO INFORMATION", fg="red") UTTT.configure(text="NO INFORMATION", fg="red") UTVH.configure(text="NO INFORMATION", fg="red") acc_UTG.configure(text="", fg="red")

acc_UTTT.configure(text="", fg="red") acc_UTVH.configure(text="", fg="red")

lbl4.configure(text="CHẨN ĐOÁN ", fg="red")

# khởi tạo các button1 và chức năng của button1 gọi đến hàm handle_bt1

button1 = Button(root,height = 2,width = 10, text = "RUN",font=("Helvetica", 14), fg = color, command = handle_bt1)

# khởi tạo các button2 và chức năng của button1 gọi đến hàm handle_bt2

110 fg = color, command = handle_bt2)

# khởi tạo label hiển thị trên giao diện app

lbl = Label(root, text = "NO INFORMATION",font=("Helvetica", 20), fg = "red") # khởi tạo các ô trắng bằng thư viện canvas

canvas = Canvas(root, height = 200, width = 590, bg = color) canvas2 =Canvas(root, height = 90, width = 300, bg = color) canvas3 =Canvas(root, height = 90, width = 150, bg = color) # khởi tạo các label giao diện app

suckhoe = Label(root, text = "", fg ="red") lbl11 = Label(root, fg ="red") lbl12 = Label(root, fg ="red") lbl13 = Label(root, fg ="red") lbl14 = Label(root, fg ="red") lbl15 = Label(root, fg ="red") lbl16 = Label(root, fg ="red") lbl17 = Label(root, fg ="red") lbl18 = Label(root, fg ="red") lbl19 = Label(root, fg ="red") lbl20 = Label(root, fg ="red") lbl21 = Label(root, fg ="red") lbl22 = Label(root, fg ="red") lbl23 = Label(root, fg ="red") lbl24 = Label(root, fg ="red") lbl25 = Label(root, fg ="red") lbl26 = Label(root, fg ="red") lbl27 = Label(root, fg ="red")

111 lbl28 = Label(root, fg ="red") lbl29 = Label(root, fg ="red") lbl30 = Label(root, fg ="red") lbl31 = Label(root, fg ="red") lbl32 = Label(root, fg ="red")

UTG = Label(root, text = "NO INFORMATION", fg ="red") UTTT = Label(root, text = "NO INFORMATION", fg ="red") UTVH = Label(root, text = "NO INFORMATION", fg ="red") acc_UTG = Label(root, fg ="red")

acc_UTTT = Label(root, fg ="red") acc_UTVH = Label(root, fg ="red")

lbl4 = Label(root, text = "CHẨN ĐOÁN", fg ="red")

accuracy = Label(root, text = "ĐỘ CHÍNH XAC ", fg ="red")

# sắp xếp bố cục của app, toạ độ của các label, canvas, button, listbox, entry_box button1.place(x = 550, y = 140) button2.place(x = 550, y = 230) canvas.place(x = 710, y =124) canvas2.place(x=780, y = 363) canvas3.place(x=1080, y = 363) lbl.place(x=890, y = 30) suckhoe.place(x=930, y = 100) lbl11.place(x = 720, y =140) lbl12.place(x = 720, y =170)

112 lbl13.place(x = 720, y =200) lbl14.place(x = 720, y =230) lbl15.place(x = 720, y =260) lbl16.place(x = 720, y =290) lbl17.place(x = 870, y =140) lbl18.place(x = 870, y =170) lbl19.place(x = 870, y =200) lbl20.place(x = 870, y =230) lbl21.place(x = 870, y =260) lbl22.place(x = 870, y =290) lbl23.place(x = 1020, y =140) lbl24.place(x = 1020, y =170) lbl25.place(x = 1020, y =200) lbl26.place(x = 1020, y =230) lbl27.place(x = 1020, y =260) lbl28.place(x = 1020, y =290) lbl29.place(x = 1170, y =140) lbl30.place(x = 1170, y =170) lbl31.place(x = 1170, y =200) lbl32.place(x = 1170, y =230) UTG.place(x = 800, y =370) UTTT.place(x =800, y =400) UTVH.place(x =800, y =430)

113 acc_UTG.place(x = 1120, y =370) acc_UTTT.place(x = 1120, y =400) acc_UTVH.place(x = 1120, y =430) lbl4.place(x = 860, y=340) accuracy.place( x = 1100, y =340) # hiển thị thực thi app

root.mainloop()

Kết quả chạy chương trình

Hình 4-11 Giao diện chương trình dự đoán

114

4.3Thử nghiệm và đánh giá hệ thống

Trong bài toán số 1:

Kết quả chạy chương trình với các hệ số learning rate khác nhau:

Từ bảng kết quả trên ta thấy với learning rate là 1, số lần lặp 300 độ chính xác trên tập trainning rất cao vì vậy trong bài toán dự đoán chữ số ta sẽ sử dụng bộ số trên.

Trong bài toán số 2: (adsbygoogle = window.adsbygoogle || []).push({});

❖ Ban đầu nhóm tạo 1 tập dữ liệu với 20000 dữ liệu Lần chạy thứ nhất với các thông số

• Learning rate : 0.5 • Số lần lặp: 300 • Số lớp ẩn: 50

115 Ta thu được • loss_UTG 0.6930486288738151 • loss_UTTT 0.6930528832966404 • loss_UTVH 0.6928909507245145  loss_trungbinh ~ 0.7

 Đồ thị giảm mạnh sau khoảng 20 lần chạy, tuy nhiên lossfunction ở mức rất cao dẫn tới độ chính xác rất thấp

Lần chạy thứ hai với các thông số • Learning rate : 0.3

• Số lần lặp: 500 • Số lớp ẩn : 50

116 Ta thu được:

• loss_UTG 0.6932923897717506 • loss_UTTT 0.6931881292766071 • loss_UTVH 0.6931070157283328

Kết luận: Kết quả gần như không thay đổi, hiện tượng OVERFITING do lượng dữ liệu đầu vào chưa đủ để mô hình có thể học hỏi và đưa ra dự đoán nên độ chính xác trên tập test gần như không thể cái thiện mặc dù trên tập trainning có thể cái thiện ❖ Tập dữ liệu với 200000 dữ liệu

Lần chạy thứ nhất • Learning rate : 0.5

117 • Số lần lặp: 300 • So lớp ẩn: 50 Ta thu được: • loss_UTG 0.30091290913139657 • loss_UTTT 0.18005818845174035 • loss_UTVH 0.21728261379970168  loss_trungbinh ~ 0.23

 Nhận xét sự bất ổn của đồ thị, do bước nhảy còn lớn, hàm mất mát vẫn còn cao

Lần chạy thứ hai với thông số • Learning rate : 0.3

• Số lần lặp: 500

118 • Số lớp ẩn : 50 Ta thu được: • loss_UTG 0.21887631457600604 • loss_UTTT 0.22512184338267985 • loss_UTVH 0.10624281743795591  loss_trungbinh ~ 0.18

 Nhận xét sự bất ổn của đồ thị, do bước nhảy còn lớn, hàm mất mát vẫn còn cao

Lần chạy thứ ba với thông số • Learning rate : 0.2

• Số lần lặp: 600 • Số lớp ẩn : 50

119 Ta thu được: • loss_UTG 0.25021847407790776 • loss_UTTT 0.09382886568315578 • loss_UTVH 0.10912298641795942  loss_trungbinh :0.15

 => Nhận xét sự bất ổn của đồ thị, do bước nhảy còn vẫn còn khá cao mặc dù mức độ giảm đã ổn định hơn, lossfunction ở mức tương đối

Lần chạy thứ tư với thông số • Learning rate : 0.1

• Số lần lặp: 900 • Số lớp ẩn : 20

120 Ta thu được: • loss_UTG : 0.16323042318539596 • loss_UTTT : 0.09406318927201206 • loss_UTVH: 0.10231265537894242  loss_trungbinh ~ 0.116

 Đồ thị giảm ổn định, bước nhảy và số lần lặp phù hợp, lossfunction ở mức nhỏ và đủ để độ chính xác đạt mức cao.

Một phần của tài liệu HD3 trần ngọc tiến nghiên cứu một số ứng dụng của mạng thần kinh nhân tạo trong nhận dạng số viết tay và phát hiện nguy cơ mắc bệnh (Trang 95 - 127)