나같은 실수를 하는 사람이 또 있을까봐 남겨둔다...
튜너를 분명 사용했는데 f1 score이 무슨일이지.?
당황스럽고 황당하다,, 테스트를 해봐도 결과가 좋을리가 없지 역시
f1 accuracy direction이 min이 되어있고 val_f1_score direction이 min이 되어있다 이게 무슨일이야...
나는 설정한 적이 없는데 새로 정의되어서 들어가는 값은 디폴트로 min값이 들어가는 것 같다
keras tuner를 돌린 의미가 없어진건가... ㅠㅠㅠㅠ
또 에러 해결해보자 ~~!
Custom 하게 metrics를 Compile해서 tuner hyperband 돌릴 때는 string일 경우 direction 설정을 해줘야한다고 했는데
해봤는데
이게 무슨 일이지
내가 설정해준 val_f1_score값은 max로 되어있고 나머지 f1 score는 min으로 되어있다. 동시에 두개를 제어하는 방법을 알아야하는데..
다시 방법을 찾아보자 !
https://www.kaggle.com/imeintanis/tps-jan21-nn-starter-keras-tuner-ensemble
구글링을 열심히 하던 와중 이 문제를 해결할 수 있는 key를 찾은 것 같다.
코드를 자세히 보고 있는데
f1 = tfa.metrics.F1Score(num_classes = len(CLASSES), average='macro')
model.compile(optimizer = keras.optimizers.Adam(hp.Float('learning_rate', 1e-4, 1e-2, sampling = 'log')), loss = tf.keras.losses.BinaryCrossentropy(),
metrics=[tf.keras.metrics.BinaryAccuracy(name='accuracy'), f1])
여기를 자세히 보면 metrics 뒤에 필자의 경우는 tf.keras.metrics.BinaryAccuracy(name = 'accuracy'), f1 이렇게 두개의 값이 들어가있다.
기존에 하던 방식은 f1을 저 방법을 통해서 선언해두고 나서, 그냥 compile 할때 f1에 넣어줬다.
여기서 찾아낸 것은 BinaryAccuracy(name = 'accuracy')로 설정을 해주었기 때문에
tuner = kt.Hyperband(model_builder,
objective = 'val_accuracy',
max_epochs = 30,
directory = '/home/eunbi/',
project_name = 'Onto_kerastuner')
다음과 같이 kt.Objective('val_accuracy', "max")와 같이 사용하지 않아도 그냥 val_을 붙이거나 train accuracy 가 기준이면 그냥 'accuracy'라고 해도 값이 사용이 된다는 것이다!
그래서 바꾼 방법은
#얘 이름을 이렇게 지정해줘야 나중에 밑에서 accuracy로 하던 f1 score로 하던 방법이 생긴다.
f1 = tfa.metrics.F1Score(num_classes = len(CLASSES), average='macro', name = 'f1_score')
이렇게 이름만 선언해주기..
해결 !
'Deep learning' 카테고리의 다른 글
Tensorflow Batchnormalization (전이학습) 중요한 사항 (0) | 2021.09.13 |
---|---|
EfficientNetV2 (0) | 2021.08.30 |
Keras Tuner 사용방법(튜토리얼) (0) | 2021.08.24 |
Keras Tuner 케라스 튜너 설치 (0) | 2021.08.23 |
Optimizer (0) | 2021.08.18 |