Cách thiết kế mạng CNN cho bài toàn input là image, out là image
Chào các bạn, Mình là lính mới trong deep learning, đang học phần xử lý hình ảnh dùng CNN. Mình có bài toán này mong các bạn cùng thảo luận để giúp mình đưa ra cấu trúc mạng CNN phù hợp. Bài toán như sau:
Mình có 1 mô hình vận tốc như hinh của output, sau khi dùng toán học tính ra được hình ảnh trường sóng địa chấn như hình của input. Nhiệm vụ là dùng CNN với các input là hình ảnh trường sóng địa chấn, dự đoán ngược lại mô hình vận tốc. Mo hình vận tốc dự đoán đc sẽ so sánh với lable để đánh giá chất lượng mô hình CNN. Mình có 500 input images có kích thước là (600x600x1), các input sẽ có hình ảnh khác nhau chút do mình tạo từ các mô hình vận tốc khác nhau
Tương ứng là các labeled output images có cùng kích thước (600x600x1)
Và mô hình vận tốc dự đoán có dạng
Các bạn cho mình hỏi:
- Convol layer để tạo features nên bao nhiêu lớp? tương ứng với activation layers loại j?
- Pooling layer nên sử dụng thuật toán nào: max, average, sum..., bao nhiêu lớp?
- Với size của inputs và outputs vậy nếu mình iterate khoảng 500epoches thì dự là mất bao lâu. Máy của mình là CPU core i7 2.7Ghz, ram 32GB, GPU Nvidia Quadro K1100M nhưng mình chưa biết cách xài CUDA?
Mong các bạn cho lời khuyên, cám ơn nhiều nha!
2 ANSWERS
Mình có tìm hiểu thì có vài lời khuyên là bỏ Pooling layers và fullyConnectedLayer và giữ padding trong convolution2dLayer là same (cùng shape với input). Bạn nào có kinh nghiệm chia sẻ cùng mình cách làm này với
@BruceKieu Mình có một vài suggest cho bạn như sau:
- Thứ nhất: Mình thấy dữ liệu dạng này khá đặc thù nên bạn có thể cân nhắc xem liệu có thể sử dụng thêm các thông số khác ngoài dữ liệu ảnh về trường sóng địa chấn làn đầu vào hay không (ví dụ các dạng dữ liệu thu được từ các cảm biến khác chẳng hạn)? Vì mình không có background về mảng này nên cũng không chắc là về mặt đặc trưng thì trường sóng dạng hình ảnh này có thích hợp để sử dụng dự đoán ra mô hình vận tốc hay không. Nếu được thì bạn nên chọn lựa các feature phù hợp thì mô hình sẽ cho chính xác hơn
- Thứ hai: Giả sử bạn đang chọn đúng các dữ liệu đầu vào thì như câu hỏi bạn nêu mình thấy bạn có thể tiếp cận theo các mô hình encoder - decoder thường áp dụng tương tự cho các bài toán segmentation như Unet hoặc các kiến trúc khác. Nếu bạn dùng PyTorch thì có thể tham khảo sẵn các kiến trúc segmentation mới nhất được implement tại đây. Bạn cứ thử nghiệm thử các kiến trúc này trước để xem có thực sự hiệu quả không
Chúc bạn vui vẻ
Cám ơn @pham.van.toan . Sorry đã để bạn bận tâm về mảng chuyên ngành địa chấn. Mình xin phát biểu lại đầu bài như vậy cho đỡ dính tới chuyên môn nha. Mình có bộ dữ liệu gồm 500 file hình ảnh có kích thước 600x600x1 dùng làm X (input). Và 1 bộ dữ liệu khác gồm 500 hình ảnh có kích thước 600x600x1 là Y^ (output). Điều đặc biệt ở đây là X được tính toán từ Y^ bằng công thức toán học. Khi chạy phương trình toán chỉ cần thêm 1 thông số W. Bây giờ mình muốn làm ngược lại từ X suy ra Y, tức là loại bỏ ảnh hưởng của W. So sánh Y với Y^ sẽ đánh giá đc chất lượng mô hình. Mình đọc bài báo thì họ nói dùng CNN n mình nghĩ mãi chưa ra. Thông thường CNN để classification (output là vector) thì mình hiểu, n để regression thì mình chưa tưởng tượng đc (output là tensor). Hi vọng bạn hiểu hơn bài toán của mình và cho thêm lời khuyên nếu có thể. Nếu bạn cần thêm thông tin để hiểu hơn vde thì mình gửi bạn thêm. Cám ơn bạn đã chia sẻ.
@BruceKieu Vậy bạn có thể sử dụng kiến trúc encoder-decoder với đầu vào là 1 ảnh 600x600x1 và đầu ra tương ứng cũng là 600x600x1. Các mô hình mình đã gửi trên github ở comment bên trên bạn nên thử trước với chúng. Bạn có thể ép mô hình dự đoán đúng giá trị trên từng pixel so với ground truth (có thể sử dụng loss MSE để tối ưu chẳng hạn).
Mình mới tìm hiểu về encoder-decoder, đúng là shape output = shape input, vẫn dùng maxpooling và có thêm upsampling (cái này mình chưa rõ cách phục hồi về shape ban đầu lắm). Mình sẽ tìm hiểu thêm và thử. Cám ơn bạn, có j mình xin hỏi bạn thêm nha.
Mình đã thiết kế đc Unet architecture, nhưng đang có vde về database. Bạn cho mình hỏi làm cách nào để thiết kế mạng Unet sử dụng thêm các thông số khác bổ trợ cho main input? và có nhất thiết số lượng ảnh input phải bằng output (mask) trong mạng Unet ko? cám ơn bạn
@BruceKieu Mình chưa hiểu rõ ý câu hỏi của bạn lắm.
Mình đọc thêm thì thấy input và label là tương quan 1:1, tức là ko thể nhiều input có cùng 1 label, trừ trường hợp input đó dc augmented (resize, flip, rotate...). Ý mình ở đây là từ velocity model (label) mình có thể mô phỏng đc nhiều image khác nhau (giống như khi bạn chụp ảnh có các bộ lọc khác nhau), liệu mình có thể sử dụng nhiều image cùng sinh ra từ 1 label đó feed vào Unet, các image này bản chất khác augmentation. Mình chưa hiểu labels (masks) cho trường hợp instant segmentation có cần phải định nghĩa cụ thể từng layer trong model là j ko. Ví dụ mô hình của mình có 10 lớp thì mình phải tạo list classes = ['1','2',...'10'] hay tự động CNN sẽ học bằng cách minimize loss_func của input images và label images. Mình đang gặp khó khi viết phần utils và train cho multi-class instant segmentation (5 class for example). Mình đang theo github của bạn này, nhưng rất tiếc bạn í viết cho binary case. Mình thử chuyển sang dùng crossentropy() cho out_channel=5 nhưng ko thành công. Nhờ bạn tư vấn cách chuyển từ binary sang multi-channel với, cần thay đổi j trong phần dataset.py, utils.py hay train.py. Mình test model.py thì thành công cho multi-channel. Mình tắc mấy ngày ở chỗ này... Các ví dụ khác mình tìm dc toàn là binary segmentation hoặc là simple semantic segmentation. Mong đc bạn hỗ trợ, cám ơn bạn nhiều