GAP và Softmax trong ResNet
Chào tất cả mọi người, hiện tại em đang tìm hiểu về ResNet và khi em nhìn vào paper, có 1 tấm hình về architecture của ResNet. Trong ảnh em thấy phần cuối cùng chính là Average Pool, 1000d-fc, softmax. Nhưng khi em thực hiện model như hình thì cho ra kết quả rất tệ (~10%) và rồi em tìm hiểu trên mạng thì thấy mọi người không sử dụng softmax và average pool mà chỉ sử dụng Flatten -> Linear Combination thì cho ra kết quả rất tốt (~95-98%). Anh chị cho em hỏi là tại sao lại không sử dụng softmax cho bài toán classification ạ. Em sử dụng: MNIST dataset Batch size: 32 optimize: SGD
2 CÂU TRẢ LỜI
Hàm softmax thường được sử dụng cho các bài toán phân loại, mình nghĩ vấn đề ở đây không phải là do softmax mà do lớp 1000d-fc. Bạn thử thay lớp đó thành bằng với num classes của tập dataset và thay optimizer bằng Adam thử xem
Em có sử dụng Adam thì đúng là nó có hiệu quả hơn so với SGD nhưng mà khi test trên tập test thì cho ra kết quả rất tệ. Mặc dù accuracy Train > 95% nhưng khi test thì accuracy Test giảm từ 95% xuống và Loss của nó từ từ tăng lên. Có cách nào để khắc phục được tình trạng này không ạ.
Note: Em đã thay 1000d-fc -> 10 num classes
Có rất nhiều vấn đề trong câu hỏi của bạn
- "em tìm hiểu trên mạng thì thấy mọi người không sử dụng (...) average pool". Mình dạo qua 2 lib cực nổi tiếng bên CV là timm và MMPretrain thì đều thấy họ sử dụng AvgPool cho Resnet:
- MMPretrain:
https://github.com/open-mmlab/mmpretrain/blob/main/configs/_base_/models/resnet50.py
- timm: https://github.com/huggingface/pytorch-image-models/blob/main/timm/layers/classifier.py#L55
- "em tìm hiểu trên mạng thì thấy mọi người không sử dụng softmax (...) thì cho ra kết quả rất tốt". Bạn train sử dụng loss gì và khi thực hiện inference thì bạn thực hiện như nào? Nếu bạn vừa sử dụng softmax vừa sử dụng CrossEntropyLoss của Pytorch thì rõ ràng là bạn đã sử dụng sai cách. Bạn có thể đọc về CrossEntropyLoss để hiểu rõ hơn