TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN TRUYỀN THÔNG BÁO CÁO BÀI TẬP LỚN HỌC MÁY VÀ KHAI PHÁ DỮ LIỆU Đề tài Xây dựng một số mô hình học máy cơ bản nhận diện chữ số viết tay sử d. Mục lục Mở đầu 3 1. Tổng quan. 5 Hướng tiếp cận : 5 2. Cơ sở lý thuyết. 5 2.1. Convolution neural network. 5 2.2. He weight initialization scheme. 7 2.3. Hàm kích hoạt ReLU. 8 2.4. Kfold crossvalidation. 8 2.5. Loss function – cross entropy và softmax. 8 2.6. Bộ dữ liệu MNIST. 10 2.7. Thuật toán tối ưu gradient descent. 10 4. Khai phá dữ liệu và xử lý dữ liệu. 11 4.1. Tải xuống dataset. 11 4.2. Xử lý dataset. 12 5. Xác định model. 13 6. Đánh giá model. 14 7. Kết quả đánh giá hiện tại. 15 8. Lưu và đánh giá mô hình lần cuối. 15 9. Dùng mô hình đưa ra dự đoán. 16 10. Kết quả thu được và phân chia công việc trong nhóm. 17 10.1. Kết quả thu được. 17 10.2. Khó khăn trong quá trình thực hiện. 17 10.3. Phân công công việc. 17 10.4. Hướng phát triển của cả nhóm. 18 Tài liệu tham khảo 18
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN & TRUYỀN THÔNG - *** - BÁO CÁO BÀI TẬP LỚN HỌC MÁY VÀ KHAI PHÁ DỮ LIỆU Đề tài: Xây dựng một số mô hình học máy cơ bản nhận diện chữ số viết tay sử dụng Convolutional Neural Network Giảng viên hướng dẫn: PGS.TS Thân Quang Khoát Nhóm sinh viên thực hiện: ST Họ và Tên MSSV Nguyễn Văn Thông 201838 T 1 39 2 Trịnh Quang Trung 201838 45 3 Lê Văn Quân 201633 56 4 Nguyễn Tiến Sang 201634 74 Hà Nội, ngày 10 tháng 1 năm 2022 Mục lục Mở đầu 1 Tổng quan Hướng tiếp cận : 2 Cơ sở lý thuyết 2.1 Convolution neural network 2.2 He weight initialization scheme 2.3 Hàm kích hoạt ReLU 2.4 K-fold cross-validation 2.5 Loss function – cross entropy và softmax 2.6 Bộ dữ liệu MNIST 2.7 Thuật toán tối ưu gradient descent 4 Khai phá dữ liệu và xử lý dữ liệu 4.1 Tải xuống dataset 4.2 Xử lý dataset 5 Xác định model 6 Đánh giá model 7 Kết quả đánh giá hiện tại 8 Lưu và đánh giá mô hình lần cuối 9 Dùng mô hình đưa ra dự đoán 10 Kết quả thu được và phân chia công việc trong nhóm 17 10.1 Kết quả thu được 10.2 Khó khăn trong quá trình thực hiện 10.3 Phân công công việc 10.4 Hướng phát triển của cả nhóm Tài liệu tham khảo Mở đầu Những năm gần đây, AI - Artificial Intelligence (Trí Tuệ Nhân Tạo), và cụ thể hơn là Machine Learning (Học Máy hoặc Máy Học) nổi lên như một bằng chứng của cuộc cách mạng công nghiệp lần thứ tư (1 - động cơ hơi nước, 2 - năng lượng điện, 3 - công nghệ thông tin) Trí Tuệ Nhân Tạo đang len lỏi vào mọi lĩnh vực trong đời sống mà có thể chúng ta không nhận ra Xe tự hành của Google và Tesla, hệ thống tự tag khuôn mặt trong ảnh của Facebook, trợ lý ảo Siri của Apple, hệ thống gợi ý sản phẩm của Amazon, hệ thống gợi ý phim của Netflix, máy chơi cờ vây AlphaGo của Google DeepMind, …, chỉ là một vài trong vô vàn những ứng dụng của AI/Machine Learning Machine Learning là một tập con của AI Theo định nghĩa của Wikipedia, Machine learning is the subfield of computer science that “gives computers the ability to learn without being explicitly programmed” Nói đơn giản, Machine Learning là một lĩnh vực nhỏ của Khoa Học Máy Tính, nó có khả năng tự học hỏi dựa trên dữ liệu đưa vào mà không cần phải được lập trình cụ thể Các kĩ thuật học máy hiện tại được phân thành 3 loại chính: Học có giám sát - supervised learning: thuật toán dự đoán đầu ra (outcome) của một dữ liệu mới (new input) dựa trên các cặp (input, outcome) đã biết từ trước Cặp dữ liệu này còn được gọi là (data, label), tức (dữ liệu, nhãn) Supervised learning là nhóm phổ biến nhất trong các thuật toán học máy Học không giám sát – unsupervised learning: trong thuật toán này, chúng ta không biết được outcome hay nhãn mà chỉ có dữ liệu đầu vào Thuật toán unsupervised learning sẽ dựa vào cấu trúc của dữ liệu để thực hiện một công việc nào đó, ví dụ như phân nhóm (clustering) hoặc giảm số chiều của dữ liệu (dimension reduction) để thuận tiện trong việc lưu trữ và tính toán Học tăng cường – reinforcement learning: là các bài toán giúp cho một hệ thống tự động xác định hành vi dựa trên hoàn cảnh để đạt được lợi ích cao nhất (maximizing the performance) Hiện tại, reinforcement learning chủ yếu được áp dụng vào lý thuyết trò chơi (game theory), các thuật toán cần xác định nước đi tiếp theo để đạt được điểm số cao nhất Trong project này, nhóm sẽ sử dụng thuật toán học có giám sát để xây dựng mô hình học máy nhận diện chữ số viết tay, với bộ dữ liệu MNIST 1 Tổng quan - Mô hình dự đoán chữ số viết tay mà nhóm lên kế hoạch tìm hiểu và xây dựng có nhiệm vụ nhận diện và phân biệt được các bức ảnh chụp số viết tay - Sử dụng https://colab.research.google.com/ để thực thi quá trình huấn luyện mô hình - Bộ dữ liệu sử dụng là bộ dữ liệu MNIST, lấy trực tiếp từ API của thư viện keras - Mô hình sử dụng là CNN, là một neural network để phân loại bộ chữ số viết tay - Mô hình sử k-fold cross validation để đánh giá mô hình Hướng tiếp cận: - Dựa vào bộ dữ liệu MNIST xây dựng mô hình mạng neuron để phân lớp với đâu ra là 10 node để dự đoán xác suất 1 bức ảnh thuộc về lớp nào 2 Cơ sở lý thuyết 2.1 Convolution neural network - Convolutional Neural Network (CNN – Mạng nơ-ron tích chập) là một trong những mô hình học máy tiên tiến Nó giúp cho chúng ta xây dựng được những hệ thống thông minh với độ chính xác cao CNN được sử dụng nhiều trong các bài toán nhận dạng các object trong ảnh - CNN được thiết kế với mục đích xử lý dữ liệu thông qua nhiều lớp mảng - So với các mạng neural thông thường, CNN nhận đầu vào là mảng 2 chiều và hoạt động trực tiếp trên ảnh - CNN so sánh hình ảnh theo từng mảng nhỏ (feature) và xác định xem nó là ảnh gì - Khi xem xét 1 bức ảnh mới, CNN sẽ không nhận biết được nó ở vị trí nào mà sẽ thử chúng tất cả các vị trí khác nhau, tạo thành 1 bộ lọc, gọi là filter - Các thành phần chính của mạng CNN: Convolution layer-lớp có vai trò quan trọng nhất, đây là lớp thực hiện mọi tính toán của mô hình Mục đích chính của lớp này là trích xuất ra các feature của đối tượng trên ảnh, nói cách khác thì nó sẽ học các mẫu cụ thể trong ảnh và có thể nhận ra nó ở mọi nơi trong ảnh o Convolution là 1 phép nhân element-wise, hiểu là máy tính sẽ quét từng phần của bức ảnh, thường kích thước ma trận quét nhỏ (3x3) và nhân nó với một filter Đầu ra của phép nhân element-wise được gọi là feature-map, các bước này lặp đi lặp lại, sau các bước này thì kích thước của ảnh giảm đi o Trong convolution có các khái niệm: + filter map: CNN sử dụng các filter để áp dụng vào các vùng của hình ảnh, những filter map này được gọi là ma trận 3 chiều, chứa các số và chúng là các paramenter + feature map: thể hiện kết quả của quá trình mỗi lần filter map quét qua input, sau mỗi lần quét sẽ xảy ra quá trình tính toán + stride: sự dịch chuyển các filter map theo pixel dựa vào giá trị này từ trái sang phải + padding: là các giá trị 0 được thêm vào lớp input Relu layer: là hàm kích hoạt trong CNN và được gọi là activation function Hàm kích hoạt có tác dụng mô phỏng các neuron có tỷ lệ truyền xung qua axon Hiện nay, hàm relu được dùng phổ biến và vô cùng thông dụng Nó được sử dụng cho các nhu cầu huấn luyện mạng neuron vì việc tính toán sẽ trở nên nhanh hơn Pooling layer: khi đầu vào quá lớn, các lớp pooling xếp vào giữa các lớp convolution layer để làm giảm các tham số, hiện nay có 2 loại chủ yếu : max pooling và average Fully connected layer: lớp này có nhiệm vụ đưa ra kết quả sau khi lớp convolution và pooling đã nhận được ảnh truyền Lúc này, ta thu được kết quả là model đã đọc được thông tin của ảnh và để liên kết chúng cũng cho ra nhiều output hơn thì ta sử dụng fully connected layer Ngoài ra, nếu như fully connected layer có được dữ liệu hình ảnh thì chúng sẽ chuyển nó thành mục chưa được phân chia chất lượng - Cấu trúc của mạng CNN: là một trong những tập hợp các lớp convolution bị chồng lên nhau cũng như sử dụng các hàm nonlinear activation như ReLU và tanh để kích hoạt trọng số trong node, những lớp này sau khi đã thông qua hàm kích hoạt thì có thể tạo ra những thông tin trìu tượng hơn cho những lớp tiếp theo Những layer tiếp theo sẽ là kết quả từ những convolution từ các filter trước đó, vì thế mà sẽ có các kết nối cục bộ phù hợp nhất, vậy mỗi neuron ở lớp sinh ra tiếp theo từ kết quả filter sẽ áp đặt lên vùng ảnh cục bộ của một neuron có trước đó Trong khi huấn luyện mạng, CNN sẽ tự động học hỏi các giá trị thông qua lớp filter dựa vào cách thức mà người dùng thực hiện Cấu trúc cơ bản của CNN thường gồm 3 phần chính là: o Local receptive field (trường cục bộ): lớp này có nhiệm vụ tách lọc dữ liệu, thông tin ảnh và lựa chọn các vùng ảnh có giá trị sử dụng cao nhất o Shared weights and bias (trọng số chia sẻ): lớp này làm giảm tối đa lượng tham số có tác dụng chính của yếu tố này trong mạng CNN Trong mỗi convolution sẽ có các feature map khác nhau và mỗi feature lại có khả năng giúp detect một vài feature trong ảnh o Pooling layer (lớp tổng hợp): là lớp cuối cùng có tác dụng làm đơn giản các thông tin đầu ra, sau khi hoàn tất tính toán và quét qua các lớp thì đến pooling layer để lược bớt các thông tin không cần thiết, từ đó cho ra kết quả 2.2 Hàm kích hoạt ReLU - Hàm kích hoạt (activation function): mô phỏng tỷ lệ truyền xung qua axon của một neuron thần kinh Trong mạng neuron, hàm kích hoạt đóng vai trò là thành phần phi tuyến tính tại các output của các neuron - Hàm kích hoạt ReLU: o Công thức: f(x) = max(0, x) o Ưu điểm: tốc độ hội tụ nhanh, tính toán nhanh o Nhược điểm: có thể xuất hiện hiện tượng ‘Dying ReLU’ (z = 0) 2.3 K-fold cross-validation - Cross-validation là một phương pháp thống kê được sử dụng để ước lượng hiệu quả của các mô hình machine learning, dễ thực hiện và cho ra ước lượng tin cậy hơn các phương pháp khác Tham số k là số nhóm mà bộ dữ liệu được chia ra - K-fold cross-validation là kỹ thuật lấy mẫu để đánh giá mô hình machine learning khi lượng dữ liệu không đủ lớn o Kỹ thuật gồm các bước: Xáo trộn dataset một cách ngẫu nhiên Chia dataset thành k nhóm Với mỗi nhóm Sử dụng nhóm hiện tại để làm tập đánh giá Các nhóm còn lại làm tập huấn luyện Huấn luyện mô hình Đánh giá và sau đó hủy mô hình Tổng hợp hiệu quả của mô hình từ các số liệu đánh giá 2.4 Loss function – cross entropy và softmax - Giả sử trong quá trình training, output của 1 bức ảnh số 9 được kỳ vọng là y=(0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0)T nghĩa là xác suất tại vị trí số 9 đạt max, nhưng uotput thực tế là y^=(0.0,0.0,0.0,0.0,0.0,0.1,0.1,0.4,0.3,0.1) thì chúng ta phải điều chỉnh tham số mô hình sao cho y^ tiến gần đến y, cách phổ biến nhất là cross-entropy - Chúng ta cần một mô hình xác suất sao cho với mỗi input x, ai thể hiện xác suất để input đó rơi vào class i Vậy điều kiện cần là các ai phải dương và tổng của chúng bằng 1 Để có thể thỏa mãn điều kiện này, chúng ta cần nhìn vào mọi giá trị zi và dựa trên quan hệ giữa các zi này để tính toán giá trị của ai Ngoài các điều kiện ai lớn hơn 0 và có tổng bằng 1, chúng ta sẽ thêm một điều kiện cũng rất tự nhiên nữa, đó là: giá trị zi càng lớn thì xác suất dữ liệu rơi vào class i càng cao Điều kiện cuối này chỉ ra rằng chúng ta cần một hàm đồng biến ở đây - Chú ý rằng zi có thể nhận giá trị cả âm và dương Một hàm số mượt đơn giản có thể chắc chắn biến zi thành một giá trị dương, và hơn nữa, đồng biến,là hàm Điều kiện mượt để thuận lợi hơn trong việc tính đạo hàm sau này Điều kiện cuối cùng, tổng các ai bằng 1 có thể được đảm bảo nếu: - Hàm số này, tính tất cả các ai dựa vào tất cả các zi, thõa mãn tất cả các điều kiện đã xét: dương, tổng bằng 1, giữ được thứ tự của zi Hàm số này được gọi là softmax function Chú ý rằng với cách định nghĩa này, không có xác suất aiai nào tuyệt đối bằng 0 hoặc tuyệt đối bằng 1, mặc dù chúng có thể rất gần 0 hoặc 1 khi zi rất nhỏ hoặc rất lớn khi so sánh với các zj, j≠i - Lúc này, ta có thể giả sử rằng: P(yk=i|xk;W)= ai - Trong đó, P(y=i|x;W) được hiểu là xác suất để một điểm dữ liệu x rơi vào class thứ i nếu biết tham số mô hình (ma trận trọng số) là W - Entropy là trung bình cộng thông tin của biến ngẫu nhiên rời rạc, cross-entropy là độ đo giữa 2 phân bố p và q để đo lượng trung bình thông tin khi dùng mã hóa thông tin của phân bố q thay cho mã hóa thông tin phân bố q Cross-entropy giữa 2 phân phối p và q được định nghĩa là: Với p và q rời rạc, công thức trở thành: - Cross-entropy loss là 1 loss function trong machine learning, xem P là phân phối đúng, Q là phân phối hiện tại, ta có: o Loss function đạt min khi P==Q, Loss = 0 o Function này rất nặng khi xác suất p_i lớn nhưng q_i lại nhỏ, là do hàm –logb(x) tăng rất nhanh khi x càng nhỏ và tiến về 0 Tức là rất nhạy cảm với sự sai khác giữa p_i và q_i, khi càng khác nhau thì giá trị cross-entropy càng tăng nhanh Cross-entropy loss được sử dụng trong phân bố xác suất của dữ liệu, trong khi các hàm khác phạt các giá trị sai thì crossentropy loss phạt mô hình dựa trên tính đúng và độ chắc chắn của dự đoán, thường dùng trong các bài toán phân loại 2.5 Bộ dữ liệu MNIST - Bộ dữ liệu đơn giản theo tiêu chuẩn hiện tại, chứa các bức ảnh chữ số viết tay được lấy từ tập dữ liệu của cục thống kê dân số Hoa Kỳ, với độ chính xác phân loại ~ 95% thường được ứng dụng trong machine learning - Có thể tải về trực tiếp qua API từ thư viện keras - Bộ gồm 60000 bức ảnh nhỏ vuông 28x28 pixel màu xám của các chữ số viết tay từ 0 – 9 làm bộ đào tạo và 10000 bức ảnh làm bộ đánh giá 2.7 Thuật toán tối ưu gradient descent - Trong Machine Learning nói riêng và Toán Tối ưu nói chung, chúng ta thường xuyên phải tìm giá trị nhỏ nhất (hoặc đôi khi là lớn nhất) của một hàm số nào đó Nhìn chung, việc tìm global minimum của các hàm mất mát trong Machine Learning là rất phức tạp, thậm chí là bất khả thi Thay vào đó, người ta thường cố gắng tìm các điểm local minimum, và ở một mức độ nào đó, coi đó là nghiệm cần tìm của bài toán - Các điểm local minimum là nghiệm của phương trình đạo hàm bằng 0 Nếu bằng một cách nào đó có thể tìm được toàn bộ (hữu hạn) các điểm cực tiểu, ta chỉ cần thay từng điểm local minimum đó vào hàm số rồi tìm điểm làm cho hàm có giá trị nhỏ nhất Tuy nhiên, trong hầu hết các trường hợp, việc giải phương trình đạo hàm bằng 0 là bất khả thi Nguyên nhân có thể đến từ sự phức tạp của dạng của đạo hàm, từ việc các điểm dữ liệu có số chiều lớn, hoặc từ việc có quá nhiều điểm dữ liệu - Hướng tiếp cận phổ biến nhất là xuất phát từ một điểm mà chúng ta coi là gần với nghiệm của bài toán, sau đó dùng một phép toán lặp để tiến dần đến điểm cần tìm, tức đến khi đạo hàm gần với 0 Gradient Descent (viết gọn là GD) và các biến thể của nó là một trong những phương pháp được dùng nhiều nhất - Giả sử xtxt là điểm ta tìm được sau vòng lặp thứ tt Ta cần tìm một thuật toán để đưa xtxt về càng gần x∗x∗ càng tốt o Nếu đạo hàm của hàm số tại xt: f′(xt)>0 thì xt nằm về bên phải so với x* (và ngược lại) Để điểm tiếp theo xt+1 gần với x* hơn, chúng ta cần di chuyển xt về phía bên trái, tức về phía âm Nói các khác, chúng ta cần di chuyển ngược dấu với đạo hàm: xt+1 = xt +Δ Trong đó Δ là một đại lượng ngược dấu với đạo hàm f′(xt) o xt càng xa x* về phía bên phải thì f′(xt) càng lớn hơn 0 (và ngược lại) Vậy, lượng di chuyển Δ, một cách trực quan nhất, là tỉ lệ thuận với −f′(xt) với η (đọc là eta) là một số dương được gọi là learning rate (tốc độ học) Dấu trừ thể hiện việc chúng ta phải đi ngược với đạo hàm (Đây cũng chính là lý do phương pháp này được gọi là Gradient Descent - descent nghĩa là đi ngược 4 Khai phá dữ liệu và xử lý dữ liệu 4.1 Tải xuống dataset - Dùng API từ thư viện keras để dowload bộ dữ liệu về: from tensorflow.keras.datasets import mnist (trainX, trainy), (testX, testy) = mnist.load_data() - Show kích thước dữ liệu: print('train: X=%s, y=%s' % (trainX.shape, trainy.shape)) print('tesy: X=%s, y=%s' % (testX.shape, testy.shape)) o Train: X=(60000, 28, 28), y=(60000,) o Test: X=(10000, 28, 28), y=(10000,) - Show vài bức ảnh với colormap=’gray’ và nhãn của nó: 4.2 Xử lý dataset - Hiện tại, dataset tải về có dạng: o Bộ train: data(60000, 28, 28) nhãn (60000, ) o Bộ test: data(10000, 28, 28) nhãn (10000, ) - Cần đưa toàn bộ dataset về chung 1 kênh màu để thuận tiện tính toán trong quá trình huấn luyện nhưng vẫn giữ được hiệu quả của mô hình, reshape data về dạng: o Bộ train: data(60000, 28, 28, 1) nhãn (60000, ) o Bộ test: data(10000, 28, 28, 1) nhãn (10000, ) trainX = trainX.reshape((trainX.shape[0], 28, 28, 1)) testX = testX.reshape((testX.shape[0], 28, 28, 1)) o Train: X=(60000, 28, 28, 1), y=(60000,) o Test: X=(10000, 28, 28, 1), y=(10000,) - Mã hóa nhãn, bằng cách chuyển số nguyên (nhãn) thành vector nhị phân 10 phần tử với phần tử thứ x (nhãn = x) bằng 1: 0 [1 0 0 0 0 0 0 0 0 0.] 1 [0 1 0 0 0 0 0 0 0 0.] 2 [0 0 1 0 0 0 0 0 0 0.] 3 [0 0 0 1 0 0 0 0 0 0.] 4 [0 0 0 0 1 0 0 0 0 0.] 5 [0 0 0 0 0 1 0 0 0 0.] 6 [0 0 0 0 0 0 1 0 0 0.] 7 [0 0 0 0 0 0 0 1 0 0.] 8 [0 0 0 0 0 0 0 0 1 0.] 9 [0 0 0 0 0 0 0 0 0 1.] - Hiện tại thì các giá trị pixel của các điểm ảnh nằm trong khoảng 0 và 255, nên cần chuyển về 0 và 1 để tối ưu cho việc tính toán: train_norm = trainX.astype('float32') test_norm = testX.astype('float32') train_norm = train_norm / 255.0 test_norm = test_norm / 255.0 5 Xác định model - Trong thư viện Keras có hỗ trợ 2 cách để xây dựng models là: Sequenltial model và Function API, ở đây nhóm sử dụng Sequential model: from tensorflow.keras.models import Sequential model = Sequential() - Cần xác định cấu trúc mô hình: o Phần 1: Gồm các convolution layer và các pooling layer Bắt đầu với 1 convolution layer với kích thước filter nhỏ (3x3) Tiếp theo là 1 pooling layer (sử dụng max pooling layer) với 32 filter Các filter map này sau khi xử lý sẽ cung cấp các feature cho classifier o Phần 2: Gồm các classifier để đưa ra dự đoán - Với bài toán phân loại chữ số viết tay, output cần là 10 node để đưa ra dự đoán sự phân bố xác suất 1 bức ảnh thuộc về node nào trong 10 node ouput - Sử dụng ReLU activation function cho tất cả các lớp và He weight initialization scheme để khởi tạo các giá trị ban đầu cho input - Hàm Flatten() trải phẳng ma trận, kích thước 28x28 thành 1x784 - Lớp Dense thứ nhất nhận 100 neural, hàm kích hoạt ReLU và He weight scheme - Lớp Dense thứ hai nhận 10 neural, phương pháp phân loại softmax - Sử dụng hàm mất mát entropy (cross-entropy) và hàm tối ưu hóa Gradient Descent với learning rate = 0.01 và momentum = 0.9 def define_model(): model = Sequential() model.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', input_shape=(28, 28, 1))) model.add(MaxPooling2D((2, 2))) model.add(Flatten()) model.add(Dense(100, activation='relu', kernel_initializer='he_uniform')) model.add(Dense(10, activation='softmax')) opt = SGD(learning_rate=0.01, momentum=0.9) model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy']) return model 6 Đánh giá model - Sử dụng k-fold cross-validation để đánh giá mô hình, để có cái nhìn khách quan cho độ chính xác cho mô hình (với k = 5), để sử dụng k-fold cross-validation, có thể dùng lớp Kfold từ API scikit-learning - API Keras cung cấp tham số validation_data cho hàm model.fit() để đánh giá mô hình, sau khi huấn luyện mô hình có thể cho ra đánh giá mô hình def evaluate_model(dataX, dataY, n_folds=5): # prepare cross validation kfold = KFold(n_folds, shuffle=True, random_state=1) # enumerate splits for train_ix, test_ix in kfold.split(dataX): # define model model = define_model() # select rows for train and test trainX, trainY, testX, testY = dataX[train_ix], dataY[train_ix], dataX[test_ix], dataY[test_ix] # fit model history = model.fit(trainX, trainY, epochs=10, batch_size=32, validation_data=(testX, testY), verbose=0) # evaluate model _, acc = model.evaluate(testX, testY, verbose=0) print('> %.3f' % (acc * 100.0)) # stores scores return 7 Kết quả đánh giá hiện tại - Sau khi thực hiện quá trình huấn luyện và đánh giá mô hình trên với bộ dữ liệu huấn luyện MNIST, có được 5 độ chính xác cho 5 quá trình huấn luyện trong quá trình sử dụng k-fold để đánh giá: - Có thể thấy đây là 1 kết quả khá cao 8 Lưu và đánh giá mô hình lần cuối - Sử dụng hàm save để lưu model lại file: ‘final_model.h5’ model.save('final_model.h5') - Tải lên model và đánh giá bằng bộ test từ dataset lấy lúc đầu: def run_test_harness(): # load model model = load_model('final_model.h5') # evaluate model on test dataset _, acc = model.evaluate(testX, testY, verbose=0) print('> %.3f' % (acc * 100.0)) - Kết quả : > 98.620 - - Có thể thấy kết quả gần với quá trình đánh giá với k-fold, đây là 1 kết quả có thể chấp nhận được 9 Dùng mô hình đưa ra dự đoán - Sử dụng các bức ảnh tự vẽ các chữ số, sau đó dùng mô hình đã qua huấn luyện để đánh giá xem mức độ dự đoán của mô hình đến mức nào - Quá trình kiểm thử mô hình: Input Output 0 1 4 5 3 1 Có thể thấy mô hình cho ra kết quả tương đối chính xác, ở đây mô hình đã dự đoán sai số 8 (dự đoán thành số 3) và số 7 (dự đoán thành số 1) vìdo số 8 và số 3, số 7 và số 1 có nhiều điểm tương đồng nên mô hình đã dự đoán sai Khi reshape về dạng mà mô hình có thể dự đoán (28x28) thì bức ảnh có thể bị mất nét dẫn đến việc mô hình dự đoán sai đầu ra bức ảnh Do mô hình hiện tại chỉ có 1 lớp convolution và 2 lớp dense nên độ chuẩn xác của mô hình chưa cao 10 Cải thiện mô hình 10.1 xác định mô hình mới : - Mô hình mới cần thêm 1 lớp convolution và 1 lớp dense để tăng tính chính xác của mô hình - Lớp convolution đầu tiên bắt đầu với filter với kích thước 5x5, số filter là 32 ... nhận diện chữ số viết tay, với liệu MNIST Tổng quan - Mơ hình dự đốn chữ số viết tay mà nhóm lên kế hoạch tìm hiểu xây dựng có nhiệm vụ nhận diện phân biệt ảnh chụp số viết tay - Sử dụng https://colab.research.google.com/... hình - Bộ liệu sử dụng liệu MNIST, lấy trực tiếp từ API thư viện keras - Mơ hình sử dụng CNN, neural network để phân loại chữ số viết tay - Mơ hình sử k-fold cross validation để đánh giá mơ hình. .. áp dụng vào lý thuyết trò chơi (game theory), thuật toán cần xác định nước để đạt điểm số cao Trong project này, nhóm sử dụng thuật tốn học có giám sát để xây dựng mơ hình học máy nhận diện chữ