You are on page 1of 52

BỘ GIÁO DỤC VÀ ĐÀO TẠO

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TP. HCM

ĐỒ ÁN CHUYÊN NGÀNH

ỨNG DỤNG HỌC CHUYỂN ĐỔI


CHO MẠNG ĐỐI NGHỊCH TẠO SINH

Ngành: CÔNG NGHỆ THÔNG TIN.


Chuyên ngành: CÔNG NGHỆ PHẦN MỀM.

Giảng viên hướng dẫn: ThS. Dương Thành Phết

Sinh viên thực hiện: MSSV: Lớp:


Đoàn Nguyễn Chí Thiện 1911061452 19DTHE4

TP. Hồ Chí Minh, 2022


PHIẾU PHÂN CÔNG NHIỆM VỤ

STT MSSV/ Họ Tên Nội dung công việc Tự đánh


thực hiện giá tỉ lệ và
điểm số
1 1911061452 - Xây dựng mô hình 100%
Đoàn Nguyễn Chí - Huấn luyện mô hình (9đ)
Thiện - Đánh giá mô hình
- Tìm kiếm dữ liệu
- Lọc dữ liệu
- Tiền xử lý dữ liệu
- Hậu xử lý dữ liệu
- Xây dựng giao diện
- Viết báo cáo

2
LỜI CAM ĐOAN
Em xin cam đoan rằng đồ án cơ sở với đề tài “Ứng dụng học chuyển đổi cho mạng
đối nghịch tạo sinh” là nghiên cứu độc lập của nhóm. Đồng thời những số liệu được
cung cấp từ báo cáo đều là kết quả nghiên cứu hoàn toàn trung thực, không sao chép từ
bất kì một công trình nghiên cứu khác nào. Những tài liệu trích dẫn đều đã được ghi rõ
nguồn gốc.
Những phần có sử dụng tài liệu tham khảo có trong đồ án đã được liệt kê và nêu
rõ ra tại phần tài liệu tham khảo. Đồng thời những số liệu hay kết quả trình bày trong đồ
án đều mang tính chất trung thực, không sao chép, đạo nhái.
Em xin chịu hoàn toàn trách nhiệm trước giảng viên hướng dẫn đồ án chuyên
ngành ThS.Dương Thành Phết và khoa Công Nghệ Thông Tin trường Đại học Công
nghê Tp.HCM nếu trường hợp phát hiện ra bất cứ sai phạm hay vấn đề sao chép nào
trong đề tài này.

3
LỜI CẢM ƠN
Để có được những kiến thức và sự chỉnh chu trong một đồ án. Đòi hỏi ở chúng
em phải có nhiều kỹ năng, kiến thức vững vàng. Tuy nhiên để có những kỹ năng, kiến
thức đó thì chúng ta cần đến sự hỗ trợ của Thầy (Cô) trong khoa. Và những Thầy (Cô)
đã giảng dạy chúng em qua từng bộ môn để có thể hoàn thiện dần bản thân mình.
Đối với đồ án này. Nhóm Em đã nhận được sự hỗ trợ tận tình từ Thầy Dương
Thành Phết, Thầy đã hỗ trợ và giảng dạy cho nhóm em rất nhiều trong đồ án này. Cũng
như là Thầy đã đưa ra những góp ý, nhận xét sâu sắc và hướng đến một đồ án mang tính
thực tế để nhóm em có thể sửa đổi và rút kinh nghiệm nhiều hơn.
Không chỉ vậy, Thầy còn chia sẻ cho nhóm em một số tài liệu tốt, cũng như một
số phần mềm mới để nhóm em có thể sử dụng. Và ứng dụng vào đồ án, có thể làm cho
đồ án trở nên đẹp hơn và tối ưu hơn.
Và cuối cùng nhóm em cảm ơn Thầy rất nhiều. Vì Thầy đã tận tình và nhiệt huyết
giảng dạy em trong suốt hai tháng vừa qua. Hai tháng hơn tuy ngắn ngủi nhưng lại mang
lại cho nhóm em nhiều điều bổ ích. Không chỉ vậy, với sự nhiệt huyết của Thầy đã giúp
em hiểu biết thêm được nhiều điều và tích lũy cho bản thân nhóm em nhiều kiến thức
bổ ích và kỹ năng cần có trong một bài đồ án.
Trong quá trình học tập và quá trình làm bài báo cáo do trình độ lý luận cũng như
kinh nghiệm thực tiễn của nhóm em còn nhiều hạn chế và thiếu sót. Nên bài báo cáo
không thể tránh khỏi những thiếu sót không mong muốn. Vì vậy, nhóm em rất mong
nhận được những ý kiến đóng góp của Thầy để có thể có nhiều kinh nghiệm hơn và sẽ
có thể làm cho nhóm em rất mong nhận được ý kiến đóng góp của Thầy để nhóm em
học thêm được nhiều kinh nghiệm. Để nhóm em có thể hoàn thiện nhiều hơn và có nhiều
kinh nghiệm hơn trong những báo cáo và những đồ án tiếp theo.

4
NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................
...................................................................................................................................

5
MỤC LỤC
LỜI CẢM ƠN
NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN .................................................................. 5
CHƯƠNG 1. TỔNG QUAN .................................................................................................. 7
1.1. Giới thiệu đề tài: .......................................................................................................... 7
1.1.1 Mô tả đề tài: ............................................................................................................. 7
1.1.2 Lý do chọn đề tài: ..................................................................................................... 7
1.2. Cấu trúc đồ án: ............................................................................................................. 7
CHƯƠNG 2. CƠ SỞ LÝ THUYẾT – CÔNG NGHỆ SỬ DỤNG ...................................... 9
2.1. Cơ sở lý thuyết: .......................................................................................................... 9
2.1.1. Giới thiệu về deep learning: ................................................................................. 9
2.1.2. Mạng tích chập – Convolutional Neural Network: ............................................ 12
2.1.3. Mạng đối sinh – Aderversial Neural Network (GAN): ....................................... 23
2.1.4. Mô hình CycleGAN: ........................................................................................... 27
2.1.5. Học chuyển đổi ................................................................................................... 31
2.2. Công nghệ sử dụng: ................................................................................................. 33
2.2.1. Ngôn ngữ Python: ............................................................................................... 33
2.2.2. Thư viện tensorflow:............................................................................................... 33
2.2.3. Thư viện OpenCV: .................................................................................................. 36
2.2.4. Thư viện QT: .......................................................................................................... 37
2.2.5. Google Colab: ........................................................................................................ 37
CHƯƠNG 3. KẾT QUẢ THỰC NGHIỆM ....................................................................... 39
3.1. Thiết lập mô hình huấn luyện ................................................................................. 39
3.1.1. Generator ........................................................................................................... 39
3.1.2. Discriminator: .................................................................................................... 43
3.1.3. Hàm mục tiêu ...................................................................................................... 43
3.2. Bộ dữ liệu .................................................................................................................. 45
3.3. Tài nguyên huấn luyện mô hình ............................................................................. 45
3.4. kết quả huấn luyện ................................................................................................... 46
3.5. Chức năng ứng dụng: .............................................................................................. 46
3.5.1. Màn hình chính: ................................................................................................. 47
3.5.2. Chức năng chọn ảnh từ thiết bị: ......................................................................... 47
3.5.3. Chức năng chuyển đổi ảnh: ................................................................................ 48
3.5.4. Chức năng xóa ảnh: ........................................................................................... 48
3.5.5. Chức năng xem chi tiết 1 ảnh bất kì: .................................................................. 49
3.5.6. Chức năng lưu ảnh sau khi chuyển về thiết bị: .................................................. 49
CHƯƠNG 4. KẾT LUẬN VÀ KIẾN NGHỊ ...................................................................... 51
4.1. Kết luận ...................................................................................................................... 51
4.2. Kiến nghị.................................................................................................................... 51
TÀI LIỆU THAM KHẢO...................................................................................................... 52

6
CHƯƠNG 1. TỔNG QUAN
1.1. Giới thiệu đề tài:
1.1.1 Mô tả đề tài:
Cùng với sự phát triển của các công nghệ hiện đại với khả năng tính toán khổng
lồ, các mô hình deep learning cũng phát triển 1 cách thần tốc, đặc biệt là mô hình sinh
dữ liệu, một mô hình mà cần khả năng tính toán khổng lồ mới có thể đảm đương được.
Ngoài đầu tư tài nguyên cho việc thiết kế các mô hình sinh dữ liệu mới, thì việc tận
dụng lại các mô hình phổ biến đã được huấn luyện sẵn và áp dụng nó đã tiết kiệm một
lượng tài nguyên khổng lồ và cũng đang là một hướng nguyên cứu được các nhà khoa
học đặc biệt quan tâm.
Thế giới ngày càng phát triển nên nhu cầu con người về mặt nghệ thuât cũng phát
triển theo, hiện nay có rất nhiều phần mềm chỉnh sửa ảnh, người dùng có thể tùy biến
các thông số như độ sáng, đồ thị màu, độ tương phản, độ mờ đục,… để cho ra các tấm
ảnh đúng theo sở thích người dùng.
Kết hợp cả hai lý do trên nên chúng em quyết định thực hiện đề tài này.
1.1.2 Lý do chọn đề tài:
Nghiên cứu về những mô hình lớn và cách áp dụng chúng vào mạng đối nghịch
tạo sinh phục vụ cho các tác vụ chuyển đổi ảnh,….

1.2. Cấu trúc đồ án:


• Chương 1: Tổng quan
- Tên đề tài.
- Mô tả đề tài.
- Lý do chọn đề tài.
• Chương 2: Cơ sở lý thuyết và công nghệ sử dụng
- Các lý thuyết áp dụng.
- Các công nghệ sử dụng.
• Chương 3: Thực nghiệm
- Thiết kế mô hình.
- Tìm kiếm dữ liệu.
- Kết quả huấn luyện.
- Phần mềm demo.
7
• Chương 4: Kết luận
- Ưu điểm của mô hình
- Nhược điểm của mô hình.
- Hướng phát triển.
- Tài liệu tham khảo.

8
CHƯƠNG 2. CƠ SỞ LÝ THUYẾT – CÔNG NGHỆ SỬ DỤNG
2.1. Cơ sở lý thuyết:

2.1.1. Giới thiệu về deep learning:


2.1.1.1. Khái niệm:
Deep learning được bắt nguồn từ thuật toán Neural network vốn xuất phát chỉ là
một ngành nhỏ của Machine Learning. Deep Learning là một chi của ngành máy học
dựa trên một tập hợp các thuật toán để cố gắng mô hình dữ liệu trừu tượng hóa ở mức
cao bằng cách sử dụng nhiều lớp xử lý với cấu trúc phức tạp, hoặc bằng cách khác bao
gồm nhiều biến đổi phi tuyến. Tương tự như cách chúng ta học hỏi từ kinh nghiệm thuật
toán, deep learning sẽ thực hiện một nhiệm vụ nhiều lần mỗi lần tinh chỉnh nhiệm vụ
một chút để cải thiện kết quả. Deep Learning chỉ đơn giản là kết nối dữ liệu giữa tất cả
các tế bào thần kinh nhân tạo và điều chỉnh chúng theo dữ liệu mẫu.
Tương tự như cách chúng ta học hỏi từ kinh nghiệm thuật toán, deep learning sẽ
thực hiện một nhiệm vụ nhiều lần mỗi lần tinh chỉnh nhiệm vụ một chút để cải thiện kết
quả. Deep Learning chỉ đơn giản là kết nối dữ liệu giữa tất cả các tế bào thần kinh nhân
tạo và điều chỉnh chúng theo dữ liệu mẫu.

Hình 2.1: Kiến trúc mạng deep learning


Càng có nhiều tế bào thần kinh được thêm vào thì kích thước của dữ liệu sẽ càng
lớn. Nó tự động có tính năng học tập ở nhiều cấp độ trừu tượng. Qua đó cho phép một
hệ thống học hàm ánh xạ phức tạp mà không phụ thuộc vào bất kỳ thuật 2 toán cụ thể
nào. Không ai thực sự biết những gì xảy ra trong một mạng lưới thần kinh nhân tạo. Vì
vậy, hiện tại bạn có thể gọi Deep Learning là một cái hộp đen.

9
Deep Learning đã giúp máy tính thực thi những việc tưởng chừng như không thể
vào 15 năm trước: phân loại cả ngàn vật thể khác nhau trong các bức ảnh, tự tạo chú
thích cho ảnh, bắt chước giọng nói và chữ viết của con người, giao tiếp với con người,
hay thậm chí cả sáng tác văn, phim, ảnh, âm nhạc.

2.1.1.2. Cách thức hoạt động:


Cách thức hoạt động của thuật toán Deep Learning diễn ra như sau: Các dòng
thông tin sẽ được trải qua nhiều lớp cho đến lớp sau cùng. Lấy quy trình học của con
người làm ví dụ cụ thể. Qua các lớp đầu tiên sẽ tập trung vào việc học các khái niệm cụ
thể hơn trong khi các lớp sâu hơn sẽ sử dụng thông tin đã học để nghiên cứu và phân
tích sâu hơn trong các khái niệm trừu tượng . Quy trình xây dựng biểu diễn dữ liệu này
được gọi là trích xuất tính năng.
• Ví dụ về việc nhận diện con vật:
Nhiệm vụ của máy tính lúc này là nhận biết hình ảnh đã cho là hình của con mèo
hay là của con chó nếu bạn dạy máy tính nhận diện hình ảnh một con mèo thì chúng ta
sẽ lập trình ra nhiều lớp trong mạng thần kinh nhân tạo mỗi lớp có khả năng xác định
một đặc điểm cụ thể của con mèo như râu, vuốt, chân sau đó, cho máy tính xem hàng
ngàn bức ảnh mèo khác nhau (và chỉ ra rằng “Đây là con mèo”) cùng hàng ngàn bức
ảnh không phải mèo (và chỉ ra rằng “đây không phải mèo”).
Mạng thần kinh nhân tạo này xem hết các bức ảnh các lớp (còn gọi node) của nó
sẽ dần nhận ra râu, vuốt, chân…nó có thể biết lớp nào là quan trọng, lớp nào không quan
trọng. Nó cũng sẽ nhận ra rằng mèo luôn có chân nhưng những con vật không phải mèo
cũng có chân. Vì vậy, khi cần xác định mèo máy tính sẽ tìm chân và đi kèm với những
đặc điểm khác như móng vuốt hay râu…Deep Learning sẽ tự động tìm ra đặc điểm nào
quan trọng nhất để phân loại mục tiêu. Trong khi đối với Machine Learning những đặc
điểm này phải được đưa ra bởi con người.

10
Hình 2.2: Ví dụ về nhận dạng con vật

2.1.1.3. Ứng dụng thực tế:

• Ứng dụng deep learning vào hệ thống gợi ý:


Các nền tảng lớn hiện nay như Facebook, Lazada, Tiki…đều có hệ thống gợi ý rất
mạnh giúp tăng đáng kể độ tương tác của người dùng chúng dựa trên các dữ liệu của
người dùng phát sinh ra khi sử dụng và tương tác trên các thiết bị có kết nối internet để
gợi ý thêm những sản phẩm họ sẽ thích. Ví dụ như trên các nền tảng mua sắm, gợi ý các
bài quảng cáo hoặc được tài trợ như trên Facebook hay các khóa học mà người học quan
tâm như trên các nền tảng học online.
• Ứng dụng deep learning vào ứng dụng nhận diện hình ảnh:
Mục tiêu của công nghệ nhận diện ảnh là nhận biết và xác định các đối tượng trong
ảnh cũng như hiểu được nội dung và ngữ cảnh trong đó. Ví dụ dịch vụ nhận diện và xác
định khuôn mặt của AlchemyVision có khả năng phân biệt hai khuôn mặt tương tự nhau
giữa nam diễn viên Will Ferrell và tay trống của Red Hot Chili Peppers, Chad Smith.
Công nghệ nhận diện hình ảnh cũng được đưa vào Facebook để gợi ý người dùng tag
mặt bạn bè hay ứng dụng vào khoa học tội phạm và điều tra.
• Ứng dụng deep learning vào trong y khoa:
Chương trình phần mềm trí tuệ nhân tạo có tên là Watson của IBM đã phát hiện ra
một loại bệnh mà các bác sĩ đã không thể tìm ra ở một nữ bệnh nhân. Bằng cách so sánh
bộ gen của người phụ nữ này với hơn 20 triệu kết quả nghiên cứu bệnh khác. Watson đã

11
đưa ra kết quả là một chứng Leukemia cực kỳ hiếm gặp chỉ trong 10 phút. Và vẫn còn
rất nhiều ứng dụng hữu ích khác của deep learning trong thực tế.

2.1.2. Mạng tích chập – Convolutional Neural Network:

2.1.2.1. Khái niệm:


Convolutional Neural Network (CNNs – Mạng nơ-ron tích chập) là một trong
những mô hình Deep Learning 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 như hiện nay. 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ũng có lịch sử khá lâu đời. Kiến trúc gốc của mô hình CNN được giới thiệu
bởi một nhà khoa học máy tính người Nhật vào năm 1980. Sau đó, năm 1998, Yan
LeCun lần đầu huấn luyện mô hình CNN với thuật toán backpropagation cho bài toán
nhận dạng chữ viết tay. Tuy nhiên, mãi đến năm 2012, khi một nhà khoa học máy tính
người Ukraine Alex Krizhevsky (đệ của Geoffrey Hinton) xây dựng mô hình CNN
(AlexNet) và sử dụng GPU để tăng tốc quá trình huấn luyện deep nets để đạt được top
1 trong cuộc thi Computer Vision thường niên ImageNet với độ lỗi phân lớp top 5 giảm
hơn 10% so với những mô hình truyền thống trước đó, đã tạo nên làn sóng mãnh mẽ sử
dụng deep CNN với sự hỗ trợ của GPU để giải quyết càng nhiều các vấn đề trong
Computer Vision.

2.1.2.2. Các thành phần trong mạng tích chập

• Lớp tích chập(Convolution)


Convolution là một cửa sổ trượt (Sliding Windows) trên một ma trận.

12
Hình 2.3: Cách hoạt động của lớp tích chập
Các convolutional layer có các parameter(kernel) đã được học để tự điều chỉnh lấy
ra những thông tin chính xác nhất mà không cần chọn các feature.
Trong hình ảnh ví dụ trên, ma trận bên trái là một hình ảnh trắng đen được số hóa.
Ma trận có kích thước 5×5 và mỗi điểm ảnh có giá trị 1 hoặc 0 là giao điểm của dòng
và cột.
Convolution hay tích chập là nhân từng phần tử trong ma trận 3. Sliding Window
hay còn gọi là kernel, filter hoặc feature detect là một ma trận có kích thước nhỏ như
trong ví dụ trên là 3×3.
Convolution hay tích chập là nhân từng phần tử bên trong ma trận 3×3 với ma trận
bên trái. Kết quả được một ma trận gọi là Convoled feature được sinh ra từ việc nhận
ma trận Filter với ma trận ảnh 5×5 bên trái.

• Đệm(padding)
một vấn đề rắc rối khi áp dụng các tầng tích chập là việc chúng ta có thể mất một
số điểm ảnh trên biên của ảnh. Vì chúng ta thường sử dụng các hạt nhân nhỏ, với một
phép tích chập ta có thể chỉ mất một ít điểm ảnh, tuy nhiên sự mất mát này có thể tích
lũy dần khi ta thực hiện qua nhiều tầng tích chập liên tiếp. Một giải pháp đơn giản cho
vấn đề này là chèn thêm các điểm ảnh xung quanh đường biên trên bức ảnh đầu vào,
nhờ đó làm tăng kích thước sử dụng của bức ảnh. Thông thường, chúng ta thiết lập các
giá trị của các điểm ảnh thêm vào là 0. ta đệm một đầu vào 3x3, làm tăng kích thước

13
lên thành 5×5. Đầu ra tương ứng sẽ tăng lên thành một ma trận 4×4.

hinh 2.4 minh hoa padding

• Bước trượt( Stride)


Trong tích chập, stride được hiểu là khoảng cách mỗi lần trược của cửa sổ trượt,
stride càng cao, khoảng cách mỗi lần trược càng lớn và bản đồ đặc trưng đầu ra càng
nhỏ, sử dụng stride sẽ giúp giảm thiểu thời gian tính toán, và tránh được việc lặp các
đặc trưng quá nhiều lần.

hinh2. 5 minh hoạ stride

• Hàm chuẩn hoá( normalization)


Hàm chuẩn hoá(normalization) là hàm dùng để biến đổi phân phối đầu vào theo kì
vọng bằng 0 và phương sai bằng . Normalization luôn là lĩnh vực nghiên cứu tích cực
trong Deep Learning. Các phương pháp Normalization có thể giúp mô hình huấn luyện
nhanh và kết quả tốt. một số lợi ích của hàm chuẩn hoá có thể kể đến như:

14
- Chuẩn hóa dữ liệu mỗi feature sẽ giữ được sự đóng góp của mọi feature trong
quá trình huấn luyện trong trường hợp giá trị một số features cao hơn nhiều so với các
feature còn lại. Với cách làm này sẽ làm mô hình unbiased (đối với các feature có giá
trị cao)
- làm giảm Internal Covariate Shift. Việc mô hình càng sâu sẽ có nhiều layer cùng
với đó là có nhiều hàm kích hoạt, nó sẽ làm biến đổi đi phân phối của dữ liệu. Do đó
chúng ta cần chuẩn hóa lại nó để có được sự đồng bộ phân phối của dữ liệu trong quá
trình huấn luyện. Khái niệm về Internal Covariate Shift mình lấy từ paper này, để hiểu
rõ hơn các bạn đọc paper đấy nhá.
- Normallization có thể làm bề mặt hàm loss trở nên mịn màng hơn (i.e. nó giới
hạn độ lớn của gradients chặt chẽ hơn nhiều ). Đại khái là việc tối ưu hàm mục tiêu sẽ
trở nên dễ dàng và nhanh chóng hơn.
- Việc tối ưu sẽ trở nên nhanh hơn bởi vì normalization không cho phép việc bùng
nổ (explode) weights và nó giới hạn chúng trong một vùng nhất định.
- Một lợi ích nữa nằm ngoài mục đích của normalization là nó giúp mô hình
Regularization(chỉ một ít, không đáng kể ).

hinh2. 7 normalization

• Instance normalization

Layer normalization và instance normalization rất tương tự nhau nhưng sự khác


biệt giữa chúng là instance normalization chuẩn hóa qua mỗi channel trong mỗi ví dụ
huấn luyện thay vì chuẩn hóa qua các features đầu vào trong một ví dụ huấn luyện. Không
giống như batch normalization,lớp instance normalization được áp dụng trong quá trình
thử nghiệm rất tốt ( do không phụ thuộc vào mini-batch ), được áp dụng cho toàn bộ loạt
ảnh thay vì một ảnh duy nhất

15
Trong đó, x∈ ℝ T ×C×W×H là đầu vào tensor chứa một batch của T ảnh. Gọi xₜᵢⱼₖ
biểu thị phần tử tijk-th của nó, trong đó k và j mở rộng kích thước không gian (Chiều
cao và Chiều rộng của hình ảnh), i là kênh đặc trưng (kênh màu nếu đầu vào là hình ảnh
RGB) và t là chỉ số của hình ảnh trong lô.

Các lợi ích của instance normalization:

- Việc chuẩn hóa này đơn giản hóa quá trình huấn luyện của mô hình.
- Instance normalization có thể áp dụng trong quá trình thử nghiệm mô hình.
- Nó có thể thay thể batch normalization trong một số bài toán về Deep Learning.

- Dễ dàng triển khai nó.

• Hàm kích hoạt( activation function)

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ột mạng nơ-ron nhân tạo, hàm kích hoạt đóng vai trò là thành
phần phi tuyến tại output của các nơ-ron. nếu không có các hàm kích hoạt phi tuyến, thì
mạng nơ-ron của chúng ta dù có nhiều lớp vẫn sẽ có hiệu quả như một lớp tuyến tính.
Bởi vì phép tính tích chập có tính chất tuyến tính, nên nếu chúng ta sử dụng nhiều lớp
tích chập với nhau mà không có hàm kích hoạt phi tuyến tính thì hiệu quả cũng chỉ như
một lớp tích chập.

16
Các hàm kích hoạt thường được sử dụng:

• Tanh

Hàm nhận đầu vào là một số thực và chuyển thành một giá trị trong khoảng (-1;
1). Cũng như Sigmoid, hàm Tanh bị bão hoà ở 2 đầu (gradient thay đổi rất ít ở 2 đầu).
Tuy nhiên hàm Tanh lại đối xứng qua 0 nên khắc phục được một nhược điểm của
Sigmoid.

Công thức

hinh2. 8 đồ thị hàm Tanh

• ReLU

Hàm ReLU đang được sử dụng khá nhiều trong những năm gần đây khi huấn luyện
các mạng neuron. ReLU đơn giản lọc các giá trị < 0. Nhìn vào công thức chúng ta dễ
dàng hiểu được cách hoạt động của nó. Một số ưu điểm khá vượt trội của nó so với
Sigmoid và Tanh:

17
Tốc độ hội tụ nhanh hơn hẳn. ReLU có tốc độ hội tụ nhanh gấp 6 lần Tanh
(Krizhevsky et al.). Điều này có thể do ReLU không bị bão hoà ở 2 đầu như Sigmoid và
Tanh.

Tính toán nhanh hơn. Tanh và Sigmoid sử dụng hàm exp và công thức phức tạp
hơn ReLU rất nhiều do vậy sẽ tốn nhiều chi phí hơn để tính toán.

Tuy nhiên ReLU cũng có một nhược điểm: Với các node có giá trị nhỏ hơn 0, qua
ReLU activation sẽ thành 0, hiện tượng đấy gọi là “Dying ReLU“. Nếu các node bị
chuyển thành 0 thì sẽ không có ý nghĩa với bước linear activation ở lớp tiếp theo và các
hệ số tương ứng từ node đấy cũng không được cập nhật với gradient descent. => Leaky
ReLU ra đời.

Khi learning rate lớn, các trọng số (weights) có thể thay đổi theo cách làm tất cả
neuron dừng việc cập nhật.

Công thức

18
hinh2. 10 đồ thị hàm ReLU

• Leaky ReLU

Leaky ReLU là một cố gắng trong việc loại bỏ "dying ReLU". Thay vì trả về giá
trị 0 với các đầu vào <0 thì Leaky ReLU tạo ra một đường xiên có độ dốc nhỏ (xem đồ
thị). Có nhiều báo cáo về việc hiệu Leaky ReLU có hiệu quả tốt hơn ReLU, nhưng hiệu
quả này vẫn chưa rõ ràng và nhất quán.

Công thức

với α là hằng số nhỏ.

19
hinh2. 11 đồ thị hàm Leaky ReLU

• UP SAMPLING
Lớp up sampling dung để phóng to ảnh, thường sử dụng kĩ thuật nearset neighbor
để điền vào vị trí còn trống khi phóng to ảnh
Kĩ thuật nearest neighbor là kĩ thuật chia ảnh phóng to thành số khu vực tương ứng
với số giá trị của ảnh trước khi phóng to, sau đó điền giá trị của những vị trí thiếu giá trị
bằng giá trị đại diện cho khu vực đó

20
hinh2. 12 minh hoạ up sample

2.1.2.3. Cấu trúc mạng tích chập


Mạng CNN là một tập hợp các lớp Convolution chồng lên nhau và sử dụng các
hàm nonlinear activation như ReLU và tanh để kích hoạt các trọng số trong các node.
Mỗi một lớp sau khi thông qua các hàm kích hoạt sẽ tạo ra các thông tin trừu tượng hơn
cho các lớp tiếp theo.
Mỗi một lớp sau khi thông qua các hàm kích hoạt sẽ tạo ra các thông tin trừu tượng
hơn cho các lớp tiếp theo. Trong mô hình mạng truyền tiến (feedforward neural network)
thì mỗi neural đầu vào (input node) cho mỗi neural đầu ra trong các lớp tiếp theo.
Mô hình này gọi là mạng kết nối đầy đủ (fully connected layer) hay mạng toàn vẹn
(affine layer). Còn trong mô hình CNNs thì ngược lại. Các layer liên kết được với nhau
thông qua cơ chế convolution.
Layer tiếp theo là kết quả convolution từ layer trước đó, nhờ vậy mà ta có được
các kết nối cục bộ. Như vậy mỗi neuron ở lớp kế tiếp sinh ra từ kết quả của filter áp đặt
lên một vùng ảnh cục bộ của neuron trước đó.
Mỗi một lớp được sử dụng các filter khác nhau thông thường có hàng trăm hàng
nghìn filter như vậy và kết hợp kết quả của chúng lại. Ngoài ra có một số layer khác như
pooling/subsampling layer dùng để chắt lọc lại các thông tin hữu ích hơn (loại bỏ các
thông tin nhiễu).
Trong quá trình huấn luyện mạng (traning) CNN tự động học các giá trị qua các
lớp filter dựa vào cách thức mà bạn thực hiện. Ví dụ trong tác vụ phân lớp ảnh, CNNs
sẽ cố gắng tìm ra thông số tối ưu cho các filter tương ứng theo thứ tự raw pixel > edges
> shapes > facial > high-level features. Layer cuối cùng được dùng để phân lớp ảnh.

21
Hình 2.4: Cấu trúc mạng tích chập
Trong mô hình CNN có 2 khía cạnh cần quan tâm là tính bất biến (Location
Invariance) và tính kết hợp (Compositionality). Với cùng một đối tượng, nếu đối tượng
này được chiếu theo các gốc độ khác nhau (translation, rotation, scaling) thì độ chính
xác của thuật toán sẽ bị ảnh hưởng đáng kể.
Pooling layer sẽ cho bạn tính bất biến đối với phép dịch chuyển (translation), phép
quay (rotation) và phép co giãn (scaling). Tính kết hợp cục bộ cho ta các cấp độ biểu
diễn thông tin từ mức độ thấp đến mức độ cao và trừu tượng hơn thông qua convolution
từ các filter.
Đó là lý do tại sao CNNs cho ra mô hình với độ chính xác rất cao. Cũng giống như
cách con người nhận biết các vật thể trong tự nhiên.
Mạng CNN sử dụng 3 ý tưởng cơ bản:
• Các trường tiếp nhận cục bộ (local receptive field): Đầu vào của mạng CNN là
một ảnh. Ví dụ như ảnh có kích thước 28×28 thì tương ứng đầu vào là một ma trận có
28×28 và giá trị mỗi điểm ảnh là một ô trong ma trận. Trong mô hình mạng ANN truyền
thống thì chúng ta sẽ kết nối các neuron đầu vào vào tầng ảnh.Tuy nhiên trong CNN
chúng ta không làm như vậy mà chúng ta chỉ kết nối trong một vùng nhỏ của các neuron
đầu vào như một filter có kích thước 5×5 tương ứng (28- 5 + 1) 24 điểm ảnh đầu vào.
Mỗi một kết nối sẽ học một trọng số và mỗi neuron ẩn sẽ học một bias. Mỗi một vùng
5×5 đấy gọi là một trường tiếp nhận cục bộ.
• Trọng số chia sẻ (shared weights): một convolutional layer bao gồm các feature
map khác nhau. Mỗi một feature map giúp detect một vài feature trong bức ảnh. Lợi ích
lớn nhất của trọng số chia sẻ là giảm tối đa số lượng tham số trong mạng CNN.
• Tổng hợp (pooling): Lớp pooling thường được sử dụng ngay sau lớp
convulational để đơn giản hóa thông tin đầu ra để giảm bớt số lượng neuron.

22
2.1.3. Mạng đối sinh – Aderversial Neural Network (GAN):

2.1.3.1. Khái niệm:


Mạng sáng tạo đối nghịch (Generative Adversarial Network) với tên ngắn phổ biến
GAN là một lớp các mô hình sinh mẫu sử dụng các kiến trúc học sâu(deep learning).
Mô hình sinh là một bài toán trong học máy liên quan đến việc tự động phát hiện
và học các mẫu phổ biến trong dữ liệu để từ đó, mô hình có thể sáng tạo ra các ví dụ
mới phù hợp với dữ liệu gốc.
GAN là một cách tiếp cận thông minh để huấn luyện mô hình sinh bằng cách nhìn
nhận bài toán sinh như một bài toán học có giám sát với hai thành phần: mô hình sinh
được huấn luyện để sáng tạo ví dụ mới, và một mô hình đánh giá để phân biệt các ví dụ
là một thực thể thật hay một thực thể giả (được sáng tạo ra). Hai mô hình được huấn
luyện song song, đối nghịch, cho đến khi mô hình phân biệt bị đánh lừa trên hơn 50%
số mẫu, tức là mô hình sinh thành công trong việc tạo ra dữ liêu giả chất lượng cao.
GAN đã làm thay đổi bức tranh công nghệ một cách nhanh chóng và đầy cảm
hứng. Nó cho phép các mô hình tạo ra các ví dụ thực tế trong nhiều vấn đề khác nhau.

Hình 2.5: Biến bản vẽ thành ảnh màu

2.1.3.2. Thành phần:


Kiến trúc của GAN bao gồm hai thành phần nhỏ là một mô hình sinh để sinh ra ví
dụ mới và một mô hình phân biệt để xác định các thực thể là giả (được tạo ra bởi mô
hình sinh) hay là một thự thể thật.

23
• Generative network (mạng sinh): sinh ra data giả, và mục tiêu là làm sao cho sinh
ra được các data giống với thật nhất, làm Discriminator không thể phân biệt nổi. Các
sample được sinh dựa trên các latent code (mã ngầm) z.
• Discriminative network (mạng phân biệt): có nhiệm vụ cố gắng phân biệt giữa
data thật và dữ liệu giả mạo.
Generator và Discriminator đều là mạng neural network và cùng “cạnh tranh”
nhau, Generator cố gắng tạo ra dữ liệu giống thật nhất có thể, còn Discriminator cố gắng
phân biệt dữ liệu mà Genarator đổ vào và chứng minh nó là đồ giả sau đó thông báo lại
cho Generator để nó cải thiện, cứ như thế quá trình này lặp đi lặp lại để generator có thể
tạo ra sample hoàn hảo nhất mà Discriminator không thể phân biệt được.

Hình 2.6: Vai trò của 2 thành phần trong mạng GAN

2.1.3.3. Hàm mục tiêu:


Vì ta có 2 mạng Generator và Discriminator với mục tiêu khác nhau, nên cần 2
hàm mục tiêu cho mỗi mạng.
• Hàm mục tiêu của mạng Discriminator:
Discriminator có nhiệm vụ phân biệt đâu là ảnh thật và đâu là ảnh giả, vì thế ta sử
dụng hàm binary cross entropy để làm hàm mục tiêu. Mục tiêu của Discriminator là tối
đa hóa giá trị của hàm mục tiêu dưới đây:

24
➢ D: Mạng Discriminator
➢ 𝑃{𝑑𝑎𝑡𝑎} (𝑥): Phân phối xác xuất của dữ liệu thật
➢ P(z): Phân phối xác xuất của dữ liệu Generator sinh ra
➢ 𝑥: Mẫu thử được lấy ra ngẫu nhiên của 𝑃{𝑑𝑎𝑡𝑎} (𝑥)
➢ z: Mẫu thử được lấy ra ngẫu nhiên của 𝑃{𝑑𝑎𝑡𝑎} (𝑧)
➢ D(x): Phân phối xác xuất của mạng Discriminator khi đưa vào dữ liệu thật
➢ D(G(z)): Phân phối xác xuất của mạng Discriminator khi đưa vào dữ liệu
của mạng Generator sinh ra
• Hàm mục tiêu của mạng Generator
Mạng Generator có nhiệm vụ sinh dữ liệu đầu ra sao cho mạng Discriminator
không phân biệt được dữ liệu đó là dữ liệu thật hay dữ liệu từ Generator sinh ra nên sẽ
cố gắng tối thiểu hóa giá trị của hàm mục tiêu dưới đây.

• G: Mạng Generator
• P(z): Phân phối xác xuất của dữ liệu generator sinh ra
• G(z): dữ liệu Generator sinh ra
• D(G(z)): Phân phối xác xuất của mạng Discriminator khi đưa vào dữ liệu của
mạng Generator sinh ra
• Hàm mục tiêu tổng quát
Từ hai hàm mục tiêu trên, ta có thể viết gộp chúng lại với nhau thành hàm mục
tiêu dưới đây.

Hàm mục tiêu này có tên gọi là hàm loss GAN, được dung phổ biến trong các mô
hình GAN phổ biến.

25
Từ hàm loss GAN có thể thấy là việc train Generator và Discriminator đối nghịch
nhau, trong khi Discriminator cố gắng tối đa giá trị hàm mục tiêu thì Generator cố
gắng tối thiểu hóa giá trị hàm mục tiêu. Quá trình huấn luyện mô hình mạng đối sinh
kết thúc khi mô hình đạt đến trạng thái cân bằng của 2 models, gọi là Nash equilibrium.

2.1.3.4. Ứng dụng thực tế:


Kể từ khi ra mắt, mạng đối sinh đã được ứng dụng rộng rãi khắp nơi, dươi đây sẽ
liệt kê ra một vài ứng dụng của mạng đối sinh.
• Tạo ra khuôn mặt người: GAN có khả năng tạo ra những khuôn mặt nhân tạo
mà rất khó phân biệt với người thật. Chất lượng của những mô hình GAN áp dụng trên
khuôn mặt ngày càng tốt hơn qua từng năm.

Hình 2.7: Ứng dụng mạng GAN sinh mặt người


• Image to Image Translation: Cùng một bức ảnh chụp quang cảnh, mạng GAN
có thể tạo ra các bối cảnh khác nhau của nó như trời tối/trời sáng, ban ngày/ban đêm,
thay đổi theo các mùa,…. Trước đây để thực hiện được điều này là một việc rất khó vì
chúng ta phải thực hiện color transfering bằng các thuật toán cổ điển trong computer
vision. Hạn chế của chúng đó là chỉ dựa trên các tinh chỉnh về màu sắc mà không tận
dụng được các đặc trưng khái quát mà GAN học được từ dữ liệu lớn. Do đó ảnh sinh ra
thường không tự nhiên và phải customize lại rất nhiều.

26
Hình 2.8: Mạng GAN trong chuyển đổi ngày đêm
• Text to image: Chuyển từ đoạn văn bản sang hình ảnh, mạng GAN có thể tạo ra
các bức ảnh phù hợp với nội dung mà một câu văn mô tả.

2.1.4. Mô hình CycleGAN:

2.1.4.1. Khái niệm về CycleGAN:


Image-to-image translation là một lớp bài toán computer vision mà mục tiêu là học
một ánh xạ giữa ảnh input và ảnh output. Bài toán này có thể áp dụng vào một số lĩnh
vực như style transfer, tô màu ảnh, làm nét ảnh, sinh dữ liệu cho segmentation, face
filter,...
Thông thường để huấn luyện một mô hình Image-to-image translation, ta sẽ cần
một lượng lớn các cặp ảnh input và label. Ví dụ như: ảnh màu và ảnh grayscale tương
ứng với nó, ảnh mờ và ảnh đã được làm nét, ....Tuy nhiên, việc chuấn bị dataset theo
kiểu này có thể khá tốn kém trong một số trường hợp như: style transfer ảnh từ mùa hè
sang mùa đông (kiếm được ảnh phong cảnh trong các điều kiện khác nhau), biến ngựa
thường thành ngựa vằn (khó mà kiếm được ảnh của 1 con ngựa thường và ảnh của nó
nhưng là ngựa vằn).

27
Hình 2.9: Chuyển đổi hè sang đông

Hình 2.10: Chuyển ảnh trắng đen sang ảnh màu


Do các bộ dataset theo cặp gần như là không tồn tại nên mới nảy sinh như cầu phát
triển một mô hình có khả năng học từ dữ liệu unpaired. Cụ thể hơn là có thể sử dụng bất
kỳ hai tập ảnh không liên quan và các đặc trưng chung được trích xuất từ mỗi bộ sưu
tập và sử dụng trong quá trình image translation. Đây được gọi là bài toán unpaired
image-to-image translation.
Một cách tiếp cận thành công cho unpaired image-to-image translation là mô hình
CycleGAN.

2.1.4.2. Kiến trúc CycleGAN:


CycleGAN là một mở rộng của kiến trúc GAN cổ điển bao gồm 2 Generator và 2
Discriminator. Generator đầu tiên gọi là G, nhận đầu vào là ảnh từ domain X (ngựa vằn)
và convert nó sang domain Y (ngựa thường). Generator còn lại gọi là Y, có nhiệm vụ
convert ảnh từ domain Y sang X. Mỗi mạng Generator có 1 Discriminator tương ứng
với nó.

28
• X: ảnh thuộc miền X, ví dụ : ảnh mùa hè
• Y: ảnh thuộc miền Y, ví dụ: ảnh mùa đông
• G: mạng Generator có nhiệm vụ chuyển ảnh thuộc miền X sang ảnh thuộc miền
Y
• F: mạng Generator có nhiệm vụ chuyển ảnh thuộc miền Y sang ảnh thuộc miền
X
• Dx: mạng Discriminator dùng để phân biệt ảnh ở miền X và ảnh được F chuyển
sang
• Dy: mạng Discriminator dùng để phân biệt ảnh ở miền Y và ảnh được G chuyển
sang

2.1.4.3. Kiến trúc mạng Generator:


Mạng Generator tận dụng kiến trúc của mạng Generator của mô hình pix2pix, mô
hình pix2pix là một kiến trúc mạng GAN được sử dụng phổ biến trong các tác vụ chuyển
đổi ảnh sang ảnh sử dụng kiến trúc mạng GAN.

Kiến trúc mạng Generator gồm 2 phần: contracting path và expansive path
• Contracting path bao gồm 5 khối convolution dùng để trích xuất đặc trưng của
bức ảnh.

29
• Expansive path gồm 5 khối deconvolution dùng để từ những đặc trưng trích xuất
được chuyển đổi và phóng to thành ảnh.
• Trong kiến trúc unet còn sử dụng them kĩ thuật skip connection, sau khi các đặc
trưng đi qua các khối deconvolution thì sẽ được nối thêm các đặc trưng có kích thước
tương ứng của phần decode nhằm tránh mất mát thông tin khi chuyển đổi ảnh.

2.1.4.4. Kiến trúc mạng Discriminator:


Mạng discriminator cũng sử dụng kiến trúc mạng discriminator của mô hình
pix2pix.

Mạng Discriminator bao gồm 10 khối convolution dùng để dự đoán ảnh thật hay
là ảnh của Generator sinh ra. Discriminator sử dụng kiến trúc PatchGAN. Thông thường
trong bài toán classification, output của mạng sẽ là một giá trị scalar - xác suất thuộc
class nào đó. Trong mô hình CycleGAN, tác giả thiết kế Discriminator sao cho output
của nó là một feature map N×N×1. Có thể xem là Discriminator sẽ chia ảnh đầu vào
thành 1 lưới N×N và giá trị tại mỗi vùng trên lưới sẽ là xác suất để vùng tương ứng trên
ảnh là thật hay giả.

2.1.4.5. Hàm mục tiêu của mạng GAN:


Mạng CycleGAN được cấu tạo từ 2 mạng GAN đối lập nhau nên sẽ có 2 hàm mục
tiêu adversarial loss tương ứng với mỗi mạng GAN.
• Hàm adversarial loss dùng cho mạng G, và Dy:
Ladv(G,DY,X,Y)=n1[logDY(y)]+n1[log(1−DY(G(x))]
• Hàm adversarial loss dùng cho mạng F, Dx:
Ladv(F,DX,Y,X)=n1[logDX(x)]+n1[log(1−DX(F(y))]

30
Chỉ riêng adversarial loss là không đủ để mô hình cho ra kết quả tốt. Nó sẽ lai
generator theo hướng tạo ra được ảnh output bất kỳ trong domain mục tiêu chứ không
phải output mong muốn. Ví dụ với bài toán biến ngựa vằn thành ngựa thường, generator
có thể biến con ngựa vằn thành 1 con ngựa thường rất đẹp nhưng lại không có đặc điểm
nào liên quan tới con ngựa vằn ban đầu.
Để giải quyết vấn đề này, cycle consistency loss được giới thiệu. Trong paper, tác
giả cho rằng nếu ảnh x từ miền X được chuyển đổi sang miền Y và sau đó chuyển đổi
ngược lại về miền X lần lượt bằng 2 generator G, F thì ta sẽ được ảnh x ban
đầu: x→G(x)→F(G(x))≈x
Lcycle(G,F)=n1∑∣F(G(xi))−xi∣+∣G(F(yi))−yi∣
Toàn bộ hàm mục tiêu của mạng CycleGAN:
L=Ladv(G,DY,X,Y)+Ladv(F,DX,Y,X)+λLcycle(G,F)
trong đó λ là siêu tham số và được chọn là 10.

2.1.5. Học chuyển đổi

2.1.5.1. Các vấn đề khi huấn luyện mạng đối sinh


Huấn luyện mô hình đối sinh là một việc không hề đơn giản. huấn luyện mô hình
đối sinh cần rất nhiều thời gian vì có rất nhiều mô hình con trong đó. Không giống như
những mô hình tích chập khác hàm mất mát càng nhỏ thì mô hình càng tốt, mô hình đối
sinh chỉ tốt khi những mô hình thành phần đạt đến điểm cân bằng, nếu như một mô hình
thành phần trong mạng đối sinh hội tụ nhanh hơn những mô hình khác, thường là mô
hình phân loại, thì mạng đối sinh cũng sẽ thất bại bởi vì những mô hình còn lại không
theo kịp. Ngoài ra, có những trường hợp mô hình sinh tìm ra được những kẻ hỡ của mô
hình phân biệt, theo đó sẽ cho ra những bức ảnh hoàn toàn giống nhau nhằm đánh lừa
mạng phân biệt, làm cho mạng phân biệt không thể phân biệt được thật giả, vấn đề đó
được gọi là sự đổ sập của mô hình( model collapsed).

2.1.5.2. học chuyển đổi là gì

Học chuyển đổi(Transfer learning) là việc ứng dụng kỹ năng/tri thức mình học được
từ vấn đề này (source domain – Ds), với ứng dụng này (source task – Ts) sang vấn đề

31
khác (target domain -Dt) với ứng dụng khác (target task – Tt) có liên quan. Transfer
learning nhằm cải thiện việc học hàm f(.) cho ứng dụng Tt trên miền Dt”

Nói một cách đơn giản, Chúng ta sẽ áp dụng tri thức đã được học từ một pre-trained
model sang bài toán hiện tại với điều kiện 2 bài toán phải có liên quan tới nhau. Tưởng
tượng xem, thay vì chạy bộ từ đầu đến cuối đường, chúng ta bắt grab đến đoạn mà grab
không thể đi được thì chúng ta tự đi tiếp. Hãy hình dung sẽ ra sao nếu đoạn đường grab
đi được là gần hết quãng đường mà chúng ta cần đi?

2.1.5.3. Các lợi ích của học chuyển đổi

- Thời gian: Việc sử dụng Pretrained Model bản thân nó không chỉ giúp giảm thời
gian vào việc tạo ra một model mới để thực hiện một target tasks mà dựa trên một source
tasks sẵn có, mà còn giảm thời gian train một model từ đầu vì Weights của phần source
tasks đã có sẵn.

- Cải thiện accuracy và tiết kiệm chi phí huấn luyện: Ví dụ trong bài toán phân loại
chó và mèo. Nếu huấn luyện từ đầu, bạn sẽ tốn nhiều epochs huấn luyện hơn để đạt được
độ chính xác cao. Tuy nhiên nếu bạn biết tận dụng lại các pretrained-model thì sẽ cần ít
epochs huấn luyện hơn để đạt được một độ chính xác mong đợi. Thậm chí độ chính xác
có thể lớn hơn so với khi không áp dụng transfer learning.

- Hiệu quả với dữ liệu nhỏ: Trong trường hợp bộ dữ liệu có kích thước quá nhỏ và
khó có thể tìm kiếm và mở rộng thêm thì các mô hình được huấn luyện từ chúng sẽ khó
có thể dự báo tốt. Tận dụng lại tri thức từ các pretrained-model với cùng tác vụ phân loại
sẽ giúp các mô hình được huấn luyện dự báo tốt hơn với dữ liệu mới vì mô hình được
học trên cả 2 nguồn tri thức đó là dữ liệu huấn luyện và dữ liệu mà nó đã được học trước
đó.

32
2.2. Công nghệ sử dụng:

2.2.1. Ngôn ngữ Python:

Python là một ngôn ngữ lập trình thông dịch (interpreted), hướng đối tượng
(object-oriented), và là một ngôn ngữ bậc cao (high-level) ngữ nghĩa động (dynamic
semantics). Python hỗ trợ các module và gói (packages), khuyến khích chương trình
module hóa và tái sử dụng mã. Trình thông dịch Python và thư viện chuẩn mở rộng có
sẵn dưới dạng mã nguồn hoặc dạng nhị phân miễn phí cho tất cả các nền tảng chính và
có thể được phân phối tự do.
2.2.2. Thư viện tensorflow:

2.2.2.1. Tổng quan:


TensorFlow chính là thư viện mã nguồn mở cho machine learning nổi tiếng nhất
thế giới, được phát triển bởi các nhà nghiên cứu từ Google. Việc hỗ trợ mạnh mẽ các
phép toán học để tính toán trong machine learning và deep learning đã giúp việc tiếp
cận các bài toán trở nên đơn giản, nhanh chóng và tiện lợi hơn nhiều.
Các hàm được dựng sẵn trong thư viện cho từng bài toán cho phép TensorFlow
xây dựng được nhiều neural network. Nó còn cho phép bạn tính toán song song trên
nhiều máy tính khác nhau, thậm chí trên nhiều CPU, GPU trong cùng 1 máy hay tạo ra
các dataflow graph – đồ thị luồng dữ liệu để dựng nên các model. Nếu bạn muốn chọn
con đường sự nghiệp trong lĩnh vực A.I. này, nắm rõ những điều cơ bản của TensorFlow
thực sự rất quan trọng.
33
Được viết bằng C++ và thao tác interface bằng Python nên phần performance của
TensorFlow cực kỳ tốt. Đối tượng sử dụng nó cũng đa dạng không kém: từ các nhà
nghiên cứu, nhà khoa học dữ liệu và dĩ nhiên không thể thiếu các lập trình viên.
2.2.2.2. Lịch sử ra đời:
Vài năm trước, khi phải xử lý lượng dữ liệu khổng lồ, deep learning bắt đầu cho
thấy hiệu năng vượt trội so với tất cả các thuật toán machine learning khác. Google sớm
nhận ra tiềm năng này và nghĩ rằng họ nên sử dụng deep neural network để cải thiện các
dịch vụ của mình, trong đó có:
- Gmail.
- Hình ảnh.
- Google search engine.
Thế là họ dựng 1 framework có tên là TensorFlow để các nhà nghiên cứu cũng
như lập trình viên có thể làm việc cùng nhau trên model A.I. 1 khi đã được phát triển và
scale hoàn chỉnh, rất nhiều người đã có thể sử dụng được nó.
Ra mắt lần đầu vào cuối năm 2015, phiên bản TensorFlow ổn định cuối cùng cũng
xuất hiện vào năm 2017. Là mã nguồn mở dưới sự cho phép của Apache Open Source,
giờ đây bạn có thể sử dụng, điều chỉnh và tái đóng góp phiên bản được điều chỉnh đó,
đổi lại không cần phải trả bất cứ đồng nào cho Google.
2.2.2.3. Kiến trúc:
Kiến trúc TensorFlow hoạt động được chia thành 3 phần:
- Tiền xử lý dữ liệu
- Dựng model
- Train và ước tính model
2.2.2.4. Cách hoạt động:
TensorFlow cho phép các lập trình viên tạo ra dataflow graph, cấu trúc mô tả làm
thế nào dữ liệu có thể di chuyển qua 1 biểu đồ, hay 1 sê-ri các node đang xử lý. Mỗi
node trong đồ thị đại diện 1 operation toán học, và mỗi kết nối hay edge giữa các node
là 1 mảng dữ liệu đa chiều, hay còn được gọi là ‘tensor’.
TensorFlow cung cấp tất cả những điều này cho lập trình viên theo phương thức
của ngôn ngữ Python. Vì Python khá dễ học và làm việc, ngoài ra còn cung cấp nhiều
cách tiện lợi để ta hiểu được làm thế nào các high-level abstractions có thể kết hợp cùng

34
nhau. Node và tensor trong TensorFlow là các đối tượng Python, và các ứng dụng
TensorFlow bản thân chúng cũng là các ứng dụng Python.
Các operation toán học thực sự thì không được thi hành bằng Python. Các thư viện
biến đổi có sẵn thông qua TensorFlow được viết bằng các binary C++ hiệu suất cao.
Python chỉ điều hướng lưu lượng giữa các phần và cung cấp các high-level abstraction
lập trình để nối chúng lại với nhau.
2.2.2.5. Lợi ích:
Lợi ích dễ thấy nhưng quan trọng nhất mà TensorFlow cung cấp cho việc lập trình
machine learning chính là abstraction. Thay vì phải đối phó với những tình huống rườm
rà từ việc thực hiện triển khai các thuật toán, hay tìm ra cách hợp lý để chuyển output
của 1 chức năng sang input của 1 chức năng khác, giờ đây bạn có thể tập trung vào phần
logic tổng thể của 1 ứng dụng hơn. TensorFlow sẽ chăm sóc phần còn lại thay cho bạn.
Ngoài ra TensorFlow còn ung cấp các tiện ích bổ sung cho các lập trình viên cần
debug cũng như giúp bạn tự suy xét các ứng dụng TensorFlow. Chế độ eager
execution cho phép bạn đánh giá và sửa đổi từng operation của biểu đồ 1 cách riêng biệt
và minh bạch, thay vì phải dựng toàn bộ biểu đồ dưới dạng 1 đối tượng độc lập vốn khá
mơ hồ hay phải đánh giá chung tổng thể. Cuối cùng, 1 tính năng khá độc đáo của
TensorFlow là TensorBoard. TensorBoard cho phép bạn quan sát 1 cách trực quan
những gì TensorFlow đang làm.
TensorFlow còn có nhiều cải tiến từ sự hậu thuẫn từ các ekíp thương mại hạng A
tại Google. Google không những tiếp lửa cho tiến độ nhanh chóng cho sự phát triển
đằng sau dự án, mà còn tạo ra nhiều phục vụ độc đáo xung quanh TensorFlow để nó dễ
dàng deploy và sử dụng: như silicon TPU mình đã nói ở trên để tăng tốc hiệu suất đám
mây Google, 1 online hub cho việc chia sẻ các model được tạo với framework, sự hiện
diện của in-browser và gần gũi với mobile của framework, và nhiều hơn thế nữa…
2.2.2.6. Thành phần:
Tensor: Tên của TensorFlow được đưa ra trực tiếp là nhờ vào framework cốt lõi
của nó: Tensor. Trong TensorFlow, tất cả các tính toán đều liên quan tới các tensor. 1
tensor là 1 vector hay ma trận của n-chiều không gian đại diện cho tất cả loại dữ liệu.
Tất cả giá trị trong 1 tensor chứa đựng loại dữ liệu giống hệt nhau với 1 shape đã biết
(hoặc đã biết 1 phần). Shape của dữ liệu chính là chiều của ma trận hay mảng. 1 tensor
có thể được bắt nguồn từ dữ liệu input hay kết quả của 1 tính toán. Trong TensorFlow,
35
tất cả các hoạt động được tiến hành bên trong 1 graph – biểu đồ. Biểu đồ là 1 tập hợp
tính toán được diễn ra liên tiếp. Mỗi operation được gọi là 1 op node (operation node)
và được kết nối với nhau.
Biểu đồ phát thảo các op và kết nối giữa các node. Tuy nhiên, nó không hiển thị
các giá trị. Phần edge của các node chính là tensor, 1 cách để nhập operation với dữ liệu.
Garph: TensorFlow sử dụng framework dạng biểu đồ. Biểu đồ tập hợp và mô tả
tất cả các chuỗi tính toán được thực hiện trong quá trình training. Biểu đồ cũng mang
rất nhiều lợi thế.
Nó được làm ra để chạy trên nhiều CPU hay GPU, ngay cả các hệ điều hành trên
thiết bị điện thoại.
Tính di động của biểu đồ cho phép bảo toàn các tính toán để bạn sử dụng ngay hay
sau đó. Biểu đồ có thể được lưu lại để thực thi trong tương lai.
Tất cả tính toán trong biểu đồ được thực hiện bằng cách kết nối các tensor lại với
nhau. 1 tensor có 1 node và 1edge. Node mang operation toán học và sản xuất các output
ở đầu cuối. Các edge giải thích mối quan hệ input/output giữa các node.
2.2.3. Thư viện OpenCV:

OpenCV (được viết tắt từ Open Computer Vision) là một bộ công cụ phần mềm để
xử lý hình ảnh, video, phân tích và học máy theo thời gian thực. Bộ công cụ này có hơn
2500 thuật toán được sử dụng cổ điển và hiện đại được tối ưu hóa cho thị giác máy tính
và học máy.
OpenCV hỗ trợ nhiều ngôn ngữ lập trình như C, C++, Java, Python,…tối ưu hóa
thiết kế đa nền tảng và có khả năng hoạt động trên nhiều phần cứng khác nhau. Được
thiết kế để tận dụng tất cả các khả năng có có sẵn trong phần cứng, OpenCV giúp đảm
bảo mang lại hiệu suất tốt nhất cho các ứng dụng máy tính sử dụng bộ công cụ này.

36
2.2.4. Thư viện QT:
Qt là một Application framework đa nền tảng viết trên ngôn ngữ C++ , được dùng
để phát triển các ứng dụng trên desktop, hệ thống nhúng và mobile. Hỗ trợ cho các
platform bao gồm : Linux, OS X, Windows, VxWorks, QNX, Android, iOS,
BlackBerry, Sailfish OS và một số platform khác. PyQt là Python interface của Qt, kết
hợp của ngôn ngữ lập trình Python và thư viện Qt, là một thư viện bao gồm các thành
phần giao diện điều khiển (widgets , graphical control elements).
PyQt API bao gồm các module bao gồm số lượng lớn với
các classes và functions hỗ trợ cho việc thiết kế ra các giao diện giao tiếp với người
dùng của các phần mềm chức năng. Hỗ trợ với Python 2.x và 3.x.

2.2.5. Google Colab:

Colaboratory hay còn gọi là Google Colab, là một sản phẩm từ Google Research,
nó cho phép chạy các dòng code python thông qua trình duyệt, đặc biệt phù hợp với
Data analysis, machine learning và giáo dục. Colab không cần yêu cầu cài đặt hay cấu
hình máy tính, mọi thứ có thể chạy thông qua trình duyệt, bạn có thể sử dụng tài nguyên
máy tính từ CPU tốc độ cao và cả GPUs và cả TPUs đều được cung cấp cho bạn.
Colab cung cấp nhiều loại GPU, thường là Nvidia K80s, T4s, P4s and P100s, tuy
nhiên người dùng không thể chọn loại GPU trong Colab, GPU trong Colab thay đổi theo
thời gian. Vì là dịch vụ miễn phí, nên Colab sẽ có những thứ tự ưu tiên trong việc sử

37
dụng tài nguyên hệ thống, cũng như giới hạn thời gian sử dụng, thời gian sử dụng tối đa
lên tới 12 giờ.

38
CHƯƠNG 3. KẾT QUẢ THỰC NGHIỆM
3.1. Thiết lập mô hình huấn luyện
3.1.1. Generator

Mô hình được em thiết kế theo kiến trúc unet. Kiến trúc unet gồm 2 phần:
contracting path và expanding path.
Contracting path:
Contracting path được sử dụng để trích xuất đặc trưng của mô hình, phần
contracting path ban đầu gồm 10 khối convolution đầu vào là 1 ảnh màu 256x256x3
sau đó đi qua các khối tích chập co dần kích thước ảnh để trích xuất đặc trưng, những
lớp covolution đầu thì trích ra những đường thẳng đường chéo, ngang dọc, càng đi sâu,
các đặc trưng càng trừu tượng và càng thể hiện tính chất riêng của ảnh, còn được gọi
ma trận đặc trưng cấp cao.
Trong phần contracting path, với đầu vào là 1 ảnh 256x256x3 em sẽ sử dụng các
mô hình đã được huấn luyện sẵn, bao gồm mô hình đồ án cơ sở, VGG19, Resnet50,
Densenet121.
Đối với mô hình của đồ án cơ sở, kiến trúc của mô hình này cũng là mô hình U-
net nên em tiến hành loại bỏ phần expansive path của mô hình, giữ lại phần
contracting path và biến đổi contracting path thành 1 mô hình có 5 đầu ra gồm
128x128, 64x64, 32x32, 16x16, 8x8 tương ứng với từng đầu vào lần lượt của
expansive path.

Hinh3.1 kiến trúc Unet

39
VGG19 là mô hình học sâu nổi tiếng gồm 16 khối tích chập và 3 tầng kết nối đầy
đủ được huấn luyện trên bộ dữ liệu imagenet với hơn 14 triệu ảnh và 20000 loại hình
ảnh khác nhau

hinh 3 2 kiến trúc VGG19

Với mô hình VGG19, một mô hình được huấn luyện tốt trên bộ dữ liệu
imageNet, đầu tiên em sẽ loại bỏ phần fully connected, thay đầu vào là ảnh màu RGB
có kích thước 256x256x3 thì đầu ra sẽ cho ra ảnh 8x8x512, sau đó biến đổi mô hình
VGG19 thành 1 mô hình có 5 đầu ra với các kích thước là 128x128x64, 64x64x128,
32x32x256, 16x16x512, 8x8x512. Và cuói cùng là sẽ đóng băng các khối convolution
từ khối 1 đến khối 10 không cập nhật trọng số trong lúc huấn luyện để không thay đổi
trọng số của các lớp này khi huấn luyện.
Mô hình resnet50 gồm 50 khối tích chập được kết nối với nhau và sử dụng
phương pháp skip connected, được huấn luyện trên bộ data imageNet với hơn 14 triệu
ảnh và 20000 loại ảnh

40
hinh 3.3 kiến trúc Resnet50

Với mô hình Resnet50, em cũng làm tương tự như mô hình VGG19, loại bỏ phần
fully connected, biến đổi mô hình thành 1 đầu vào là ảnh màu RGB có kích thước
256x256x3 và 5 đầu ra có kích thước128x128x64, 64x64x128, 32x32x256,
16x16x512, 8x8x512. Sau đó đóng băng các khối layered từ khối convolution 38 đến
khối 50.
Kiến trúc của mô hình densenet121 gồm 121 khối tích chập được kết nối với nhau,
và có sử dụng kĩ thuật skip connected nối đầu vào và đầu ra với nhau

hinh 3.4 kiến trúc Densenet121

Với mô hình Densenet 121, em cũng làm tương tự như hai mô hình trên, và đóng
băng từ khối convolution70 đến khối convolution 121.

Expansive path:

41
Với 5 đầu vào là 8x8, 16x16, 32x32, 64x64, 128x128. Đầu tiên em sẽ nối đầu vào
8x8 với 2 khối deconvolution dùng để biến đổi đặc trưng của ảnh và phóng to ảnh lên 2
lần, tiếp theo sẽ nối đầu ra với đầu vào 16x16 rồi cho đi qua 2 khối deconvolution để
biến đổi đặc trưng và phóng to ảnh lên 2 lần, lặp lại cho đến khi đi ảnh lên kích thước
256x256, lúc này cho ảnh đi qua 1 khối deconvolution với 3 lớp filter để cho đầu ra là
ảnh 256x256x3.

hinh 3.5 kiến trúc Unet 2 phần

Khối deconvolution bao gồm 4 thành phần:


• 1 lớp up sample

• 1 lớp convolution(3x3,padding= same, stride=1)

• 1 hàm instance normalization

• 1 hàm ReLU

42
3.1.2. Discriminator:

Mạng discriminator gồm 6 khối convolution nhận đầu vào là 1 ảnh 256x256x3
đầu ra là 1 feature map 16x16 để xem xét từng phần trong ảnh đầu vào là thật hay là
giả
Khối convolution của mạng discriminator gồm 3 thành phần:
• 1 lớp convolution(3x3, padding = same, stride = 1 hoặc 2)

• 1 hàm instance Normalitzation

• 1 hàm LeakyReLU

hinh 3.6 kiến trúc discriminator

3.1.3. Hàm mục tiêu

- Discriminator:

b: nhãn mục tiêu của ảnh thật


a: nhãn mục tiêu của ảnh giả
D(x): nhãn dự đoán của mô hình khi đưa ảnh thật

43
D(G(z)): nhãn mô hình dự đoán khi đưa ảnh giả
- Generator
Mô hình Generator có độ phức tạp hơn hơn mô hình discriminator nhiều bởi vì
không những phải sinh ra ảnh giống như ảnh mùa đông mà còn sinh ra ảnh có nét
giống như ảnh đầu vào vì thế hàm mục tiêu cho mô hình generator vì thế cũng nhiều
hơn
- hàm mục tiêu của mạng sinh dữ liệu(loss square GAN)

1 2
ℒ 𝐺𝐴𝑁 (𝐺, 𝐷, 𝑥) = 𝐸𝑥~𝑝𝑑𝑎𝑡𝑎 ((𝐷(𝐺 (𝑥)) − 𝑐) )
2

• D(G(x): là nhãn mà mạng discriminator dự đoán ảnh của mạng generator sinh
ra

• C: là nhãn mục tiêu mà hàm generator muốn hàm discriminator dự đoán đúng
- hàm mục tiêu dung để đồng nhất 2 mạng generator lại với nhau(Cycle-
consistancy loss)

𝓛𝒄𝒚𝒄 (𝑮, 𝑭, 𝑫𝑿 , 𝑿, 𝜸) = 𝑬𝒙~𝒑𝒅𝒂𝒕𝒂(𝒙) [𝜸||(𝒇𝑫𝑿 (𝑭(𝑮(𝒙))) − 𝒇𝑫𝑿 (𝒙)||𝟏 +

(𝟏 − 𝜸)||𝑭(𝑮(𝒙)) − 𝒙||𝟏 ]

• F(G(x)):ảnh x được chuyển vòng tròn từ mạng G rồi qua mạng F


• 𝒇𝑫𝑿 (𝒙):là nhãn dự đoán của mạng Dx khi đoán ảnh thật x

• 𝒇𝑫𝑿 (𝑭(𝑮(𝒙))): nhãn dự đoán của mạng Dx khi dự đoán ảnh được chuyển vòng

tròn
• 𝜸: trọng số giữa phép tính thường là 0.5

- hàm mục tiêu tránh cho việc mạng generator chuyển đổi quá mức(Identity loss)
ℒ 𝑖𝑑𝑒𝑛𝑡𝑖𝑡𝑦 (𝐺, 𝐹 ) = 𝐸𝑦~𝑃𝑑𝑎𝑡𝑎 (𝑦) [ ‖𝐺 (𝑦) − 𝑦||1] + 𝐸𝑥~𝑃𝑑𝑎𝑡𝑎(𝑥) [ ‖𝐹 (𝑥) − 𝑥||1]
• 𝐺 (𝑦): ảnh sinh ra khi mạng G chuyển đổi ảnh của chính miền mục tiêu
• 𝐹 (𝑥): ảnh x khi mạng F chuyển đổi ảnh của ảnh của chính miền mục tiêu

- hàm tổng của mạng generator:


ℒ = ℒ 𝐺𝐴𝑁 (𝐺, 𝐷, 𝑥) + ℒ̃ (𝐺, 𝐹, 𝐷𝑋 , 𝑋, 𝛾 ) + ℒ 𝑖𝑑𝑒𝑛𝑡𝑖𝑡𝑦 (𝐺, 𝐹 )

44
3.2. Bộ dữ liệu

Bộ dữ liệu bao gồm 2000 ảnh mùa hè, 2000 ảnh mùa đông của nhà cửa, thành
phố, góc đường cho tập huấn luyện và 200 ảnh mùa hè nhà cửa, thành phố cho tập
kiểm thử. Tất cả đều được em thu thập qua các trang web như flickr, stock, google,….

hinh 3.7 dữ liệu huấn luyện

3.3. Tài nguyên huấn luyện mô hình

Mô hình được huấn luyện trên google colab, được trang bị GPU tesla T4 và
12GB ram, GPU tesla T4 được trang bị 16GB VRam sử dụng kiến trúc turing phục vụ
tối đa cho việc tính toán các mô hình deep learning.
45
3.4. kết quả huấn luyện

Thời gian: thời gian huấn luyện rơi vào khoảng 1 đến 2 tuần cho mỗi mô hình
pretrain khác nhau. So với việc huấn luyện một mô hình được tạo mới trong vòng 2-3
tuần là ngắn hơn rất nhiều.
Hình ảnh của các mô hình cho ra :

hinh 3.8 kết quả huấn luyện


3.5. Chức năng ứng dụng:

Chọn ảnh đầu vào từ thiết bị (có thể chọn nhiều ảnh hoặc chọn cả thư mục).
Chuyển tất cả ảnh vừa chọn sang phong cảnh mùa đông.
Xóa các ảnh không mong muốn.
Double click vào bất kì tấm nào để xem chi tiết trước và sau khi chuyển đổi.
Lưu tất cả ảnh đã chuyển về thiết bị.

46
3.5.1. Màn hình chính:

Hình 3.1: Màn hình chính ứng dụng.

3.5.2. Chức năng chọn ảnh từ thiết bị:


Người dùng có 2 lựa chọn:
Chọn 1 hoặc nhiều ảnh tùy ý.
Chọn cả thư mục chứa ảnh.

47
3.5.3. Chức năng chuyển đổi ảnh:
Người dùng click nút “Chuyển” để chương trình thực hiện quá trình chuyển đổi
ảnh. Càng nhiều ảnh quá trình chuyển đổi sẽ càng lâu. 1 bức hình chuyển trong vòng
sắp xỉ 1s.

hinh 3.9 chức năng chuyển ảnh

3.5.4. Chức năng xóa ảnh:


Người dùng có thể xóa bất kì hình ảnh nào nếu muốn (trước khi chuyển và sau
khi chuyển).

48
Hình 3.10 Chức năng xoá ảnh

3.5.5. Chức năng xem chi tiết 1 ảnh bất kì:

Hình 3.11: Người dùng được phép xem chi tiết.

3.5.6. Chức năng lưu ảnh sau khi chuyển về thiết bị:
Người dùng chọn thư mục cần lưu và phần mềm sẽ thực hiện quá trình lưu ảnh.

49
Hình 3.12: Lưu ảnh đã chuyển vào thư mục thành công.

50
CHƯƠNG 4. KẾT LUẬN VÀ KIẾN NGHỊ
4.1. Kết luận
Qua quá trình thử nghiệm và đánh giá các mô hình, từ đó chọn ra các mô hình với khả
năng sinh ảnh tốt, và những mô hình mặc dù không được huấn luyện trên các tác vụ có hình
ảnh liên quan thì khả năng học chuyển đổi của các mô hình đấy cũng đem lại kết quả khả
quan và tiêu tốn ít thời gian, chứng minh rằng việc tận dụng các mạng học sâu được huấn
luyện sẵn tiết kiệm được rất nhiều thời gian và công sức rất nhiều so với việc thiết kế một mô
hình mới trong lĩnh vực mạng sinh dữ liệu.

4.2. Kiến nghị


Mặc dù có việc sinh ảnh từ những mô hình trên khá tốt, nhưng vẫn còn có những
ảnh không thể chuyển được, hoặc là chuyển bị nhiễu. Trong tương lai, việc áp dụng
những kĩ thuật mới ví dụ như adapter instance normalization hoặc classfition
activation map hay áp dụng những mô hình mới hơn như inceptionv3 sẽ cho ra những
bức ảnh có độ hài hoà màu sắc tốt hơn, góp phần nâng cao khả năng chuyển đổi ảnh
của mô hình

51
TÀI LIỆU THAM KHẢO
[1] https://topdev.vn/blog/tensorflow-la-gi/
[2] https://topdev.vn/blog/opencv-la-gi-hoc-computer-vision-khong-kho/
[3] https://towardsdatascience.com/cyclegan-learning-to-translate-images-
[4] https://topdev.vn/blog/thuat-toan-cnn-convolutional-neural-network/
[5] https://machinelearningmastery.com/what-are-generative-adversarial-
networks-gans/
[6] https://topdev.vn/blog/thuat-toan-cnn-convolutional-neural-network/
[7] https://codelearn.io/sharing/google-colab-la-gi
[8] https://openplanning.net/11385/gioi-thieu-ve-python
[9] https://www.anaconda.com/products/distribution
[10] https://www.spyder-ide.org/
[11]https://phamdinhkhanh.github.io/2020/04/15/TransferLearning.
[12] https://www.analyticsvidhya.com/blog/2020/08/top-4-pre-trained-models-
for-image-classification-with-python-code/
[13]https://iq.opengenus.org/vgg19-architecture/
[14]https://viblo.asia/p/normalization-and-normalization-techniques-in-deep-
learning-QpmleJyn5rd
[15]https://aicurious.io/posts/2019-09-23-cac-ham-kich-hoat-activation-function-
trong-neural-networks/

52

You might also like