AI프렌즈 위성관측 데이터 활용 강수량 산출 AI 경진대회

알고리즘 | 정형 | 회귀 | 기상 | MAE,F1score

  • moneyIcon 상금 : 총 250만원
  • 939명 마감

 

리더보드 1.51736점 코드 공개 (ResNet 기반 모델)

2020.05.14 16:54 9,081 조회 language

이 코드는 시스템 자원을 매우 많이 필요로 합니다.

시스템 자원이 부족할 경우 학습 데이터를 작게 나눠 여러개의 모델을 만든 후 앙상블을 하면 비슷한 결과를 볼 수 있습니다.


학습에 사용되지 않은 1909개의 데이터로 가채점 결과 1.40393점이 나왔으나

리더보드 제출 결과 1.51736점로 예상 점수와 많은 차이를 보였습니다.

코드
로그인이 필요합니다
0 / 1000
성민석
2020.05.14 20:01

감사합니다

endgame
2020.05.14 23:45

감사합니다!

SuperSunkist
2020.05.19 02:27

삭제된 댓글입니다

핑크퐁
2020.05.21 00:36

좋은 글 감사합니다. "강수량을 예측할 지점에서 멀리 있는 데이터일 수록 영향이 적어져 풀링레이어가 결과 예측에 방해가 될 것으로 판단" 이라는 아이디어가 흥미롭네요. 혹시 이를 해결하기 위해서 어떤 접근법을 사용하셨나요?

GoldBar
2020.05.25 23:38

처음에는 오토인코더, U-net으로 접근하였는데 생각보다 결과가 좋지 않았습니다.
그러다 강수량 예측에는 강수지점의 데이터가 중요하지 멀리 떨어진 곳의 데이터는 크게 중요하지 않을거라는 가설을 세웠습니다.
가설이 맞다면 차원축소를 거치지 않은 모델이 차원 축소를 거친 모델보다 성능이 좋을 것입니다.
그래서 컨볼루션 레이어만을 이용하여 모델을 만들고 적은 양의 데이터로 학습 시킨 결과 1.65점정도의 결과를 얻을 수 있었습니다.

GoldBar
2020.05.21 06:21

그후 차원을 건들지 않는 선에서 여러가지 모델을 만들어봤고 그 중에서 이미 검증된 ResNet을 활용한 모델이 좋은 결과를 얻었습니다.
ResNet 말고도 Inception등을 이용하여 다양한 모델들도 비슷한 성능을 볼 수 있고 다양한 모델을 앙상블할 수록 더 좋은 결과를 얻을 수 있습니다.

핑크퐁
2020.05.21 10:38

좋은 인사이트 감사합니다.

뭉뭉
2020.05.22 00:33

일반적으로는 convolution을 진행하면서 feature map을 서서히 늘려가면서 마지막 레이어에서 1개로 줄이는 과정을 취하는데, 
위 모델에서는 256 -> 128 -> 64 -> 32 -> 1 로 서서히 줄이신 이유가 있을까요? 
실험적인 결과인가요 ? 

GoldBar
2020.05.22 01:32

보통 pooling을 거치면서 축소된 차원에대한 보상(?)으로 feature map을 늘리는데 여기선 pooling이 없어서 feature map을 늘려갈 필요는 없을거같습니다.
256->128->64->32로 줄인건 마음에 안정감(?)이 드는 숫자라 선택하였습니다.

뭉뭉
2020.05.22 02:32

아.. 그런 착안점이군요. 
혹시 마지막으로 앙상블 개수와 앙상블 전후의 결과값을  알 수 있을까요? 

GoldBar
2020.05.22 06:07

리더보드 스코어는 확인을 못해봤고 교차검증을 통해 만들어진 5개의 모델을 자체 테스트 결과는 본문에 있는데 각 코델은 1.43전후로 나왔고 소프트보팅 결과 1.4점이 나왔고 리더보드에서 1.51점이 나왔습니다.
그후 Resnet과 Inception을 혼합한 모델 5개(1.44점전후)를 더 만들어 10개의 모델 앙상블 결과 리더보드 1.49점을 기록했습니다.
본문 모델 숫자만 봐꿔가며 앙상블해도 효과가 있을것으로 보이는데 시간관계상 더 이상의 진행은 못하고 있습니다.

GoldBar
2020.05.22 06:15

업로드 전 확인용 테스트셋과 검증셋에 대한 데이터 부풀리기를 하지 않은거라 학습데이터도 최대한 늘리면 조금더 성능이  좋아질 것으로 보이는데 시간이 문제네요.

뭉뭉
2020.05.22 11:45

아하 그렇군요 .. ! 인사이트 감사합니다 

지구본으로지구를
2020.05.25 08:36

kernel size 를 1->2->3 으로 늘려주신 이유가 있으실까요?

GoldBar
2020.05.25 10:48

커널 사이즈 1로 주변에 영향을 안받은 피쳐맵을 생성하고 커널 사이즈를 키워나가며 조금씩 주변에 영향을 받은 피쳐맵을 추가해주었습니다.
커널사이즈가 처음부터 크게 시작하면 주변에 영향을 받은 데이터로 피쳐맵이 만들어져 그 후 영향을 안받은 피쳐맵을 생성할 수가 없어 커널 사이즈를 1->2->3으로 키웠습니다.

Kimgoing
2020.05.25 22:04

먼저 공부에 많은 도움이 되었습니다. 감사합니다.

그런데 저는 아래코드를 칠때 인덱스 에러가 뜨던데 어떻게 해결 하셨나요?
x_train = x_train[np.sum((y_train_>= 50]
y_train = y_train[np.sum((y_train_>= 50]

x_train.shape, y_train.shape

(위 코드 실행시 인덱스 에러 발생. np는 1차원이고 x_train은 4차원이라서 에러가 발생한다고 생각하고 있습니다.)
IndexError: too many indices for array 

GoldBar
2020.05.25 22:40

이전 셀에서 y_train_ 가 정확히 작성 되었는지 확인해봐야할 것같습니다. (y_train이 있고 y_train_가 있습니다.)
코드가 모두 정확히 작성되었다면 정상적으로 작동 될거에요.

Kimgoing
2020.05.25 22:45

네 알겠습니다. 감사합니다.

Kimgoing
2020.06.14 15:02

안녕하세요 
y_train = y_train.reshape(-1, x_train.shape[1], x_train.shape[2],1)
y_test = y_test.reshape(-1, y_test.shape[1], y_test.shape[2],1)
y_train과 y_test 값의 shape가 (데이터의 갯수, 가로, 세로, 채널)이 되도록 채널 차원을 추가하셨는데요. x_train과 x_test에서는 reshape을 하지 않아도 채널까지 잘 나왔는데 왜 y_train과 test에선 reshape를 해줘야하는지 궁금하네요.

GoldBar
2020.06.14 17:38

x는 여러 채널을 선택해서 채널의 차원이 남아 있는데 y는 특정 채널 하나만을 선택하여 채널을 표현하는 차원이 사라진 상태입니다.
그래서 reshape를 통해 y에 채널을 만들어준거에요.
6번 셀과 7번셀의 출력 결과를 보시면 차이를 알 수 있습니다.

Kimgoing
2020.06.15 16:52

네 올려주신 코드를 확인해서 결과는 알고 있었는데  특정 채널 하나만 선택하는 경우 채널을 표현하는 차원이 사라진다는 사실은 처음 알았네요 친절하신 답변 감사합니다.