정말 똑같은 모델링에 똑같이 normalized된 데이터셋

(직접 preprocessing을 함. [0, 1]로 scaling을 하던 평균, 분산을 구해 normalization을 하던)


똑같은 compile 똑같은 training loop



다른 점이라곤 딱 레이어마다(Dense, Conv1D, Conv2D, Conv3D 포함, RNN은 제외. 아 근데 Conv3D는 Custom이긴 함..)


레이어 뒤에 BatchNormalization()을 쓰느냐 안 쓰느냐 그 차이



그래서 쓰면, 레이어 -> BN레이어 -> ReLU레이어를 통과하게 되고

안 쓰면, 레이어 -> ReLU레이어를 통과하게 되는데



서로 완전히 다른 결과가 나와버리네..


이렇게까지 다른 결과가 나와버리나? 싶음 BatchNormalization 레이어 썼다고...



근데 둘 다 말이 안 되진 않아서...더 혼란스러움...







0 1 2 중에 하나로 분류하는 모델인데


2인 case는 사실 너무 명료한 case여서 눈으로도 파악이 가능한 수준이고, 중요한건 0/1을 0/1로 분류하느냐가 중요해서...


그렇기에 2로 분류하는건 좀 의미 없는 일이라 SparseCategoricalCrossEntropy를 Custom으로 건드려서

1. y_true가 0/1인데 2로 분류하는 case는 weights(=0.5 디폴트)를 주고(정 0/1 어디로 분류해야할지 모르겠으면 2로 넣어두라 그런거지)

2. y_true가 2인 case는 어디로 분류하든 weights (=0.5 디폴트)를 주도록(2인 case는 어디로 분류하시든 크게 내 관심이 아니다 그런 의미)

Custom으로 loss를 수정했음




이제 validation set에 대해,

BN 레이어를 쓰지 않는 경우에는, 2를 2로 분류를 거의 100퍼센트 잘하고, 0/1의 case를 2로 분류하는 경우도 정말 찾아보기 힘든데

BN 레이어를 쓰는 경우에는, 갑자기 custom loss를 잘 알아들은 것마냥 2를 0, 1, 2로 제각각 분류도 해버리고,

0/1의 case도 영 모르겠는건 2로 많이 분류를 해버림 (근데 너무 많이 해버린다는게 문제임...모델을 만드는 이유가 없어질 정도)


이건 이제 weights를 바꿔가면서 좀 더 알아볼 예정인데






아니 BN 레이어를 쓰는게 이렇게 다이나믹하게 결과가 바꾸어질 일인가? 싶어서

데이터셋이 normalized되지 않았으면 몰라 참나

아 batch_size=1이고 stateful한 RNN도 포함이 되어 있어서 BN을 쓴다는게 결과적으로는 InstanceNormalization과 비슷한 효과

(https://stackoverflow.com/a/69286469/7820717 참고)를 내긴하는데...




다시 한 번 BN 레이어 빼고도 돌려봐야겠네 그리고 train_loss를 좀 확인해봐야겠다


쩝..혹시나 코멘트 남겨주실 분들은 남겨주십셔ㅠ