본문 바로가기

분류 전체보기

Loss weight, Class weight, Sample weight 케라스로 모델을 설계한 다음, 학습시키는 과정에서 적용할 수 있는 weight의 종류는 크게 3개이다. Loss weight model.compile( )에서 "loss_weights" 파라미터를 통해 넣어줄 수 있다. 모델에 2개 이상의 loss functin이 걸리는 경우 사용할 수 있는 파라미터이다. (EX) model.compile(optimizer='adam', loss=['binary_crossentropy', 'mse'], loss_weights=[2, 1]) Class weight 클래스 불균형을 해결하기 위한 방법으로 샘플 수가 상대적으로 적은 Class 쪽에 가중치를 부여하는 방식이 있다. model.fit( )이나 model.fit_generator( )의 "class_weight" .. 더보기
Probability Calibration 개념 정리 의료 AI 영역에서 일을 하다보면 의사로부터 "인공지능 모델의 출력값이 정확히 무엇을 의미하는 건가요? 0.7이라는 숫자는 환자가 실제로 질병을 갖고 있을 확률이라는 뜻인가요?"와 같은 맥락의 질문을 되게 많이 듣게 된다. 솔직히 그런 질문을 처음 들었을 때는 '어..? 나도 모르겠는데??...'하는 생각이 제일 먼저 들었다. 출력값에 thr 걸어줘서 단순히 True or False로만 생각해봤지 출력값 그 자체가 갖는 의미에 대해서는 깊게 생각해본적이 없었다. 그래서 이것 저것 검색하다보니 Probability Calibration이라는 개념을 접하게 됐다. 연구가 엄청 활발한 분야는 아닌 것 같은데 Medical Imaging 영역에서는 꼭 필요한 개념이라 차근차근 공부하며 정리해나가고자 한다. Pr.. 더보기
NIA AIHub 원격 서버 환경 구축 1. 서버에 아나콘다 설치 https://jcil.co.kr/18 어렵게 어렵게 설치하고 주피터 노트북 설정도 해서 port 열어서 사용하려고 했더니, 서버 관리하는 곳으로부터 포트 열어주는 건 불가능하고 기존 도커 환경(?)에서 새로 가상환경 설치해서 사용하라는 안내 받음 2. 이게 구조가 아래 처럼 이루어져 있다. "Naver VPN → Window 원격 데스크톱 연결 → 내부 리눅스 서버 접속 → Docker 환경에서 개발" 결론이 뭐냐면 Window 원격 데스크톱 연결로 들어가면 기본으로 제공되는 주피터 노트북이 있는데 여기서 터미널을 열어서 가상환경을 파줘야한다. 또 중요한 건 conda env list 와 같은 명령어는 먹히는데 conda activate 명령어는 안 먹힌다. su 를 먼저 입.. 더보기
Python Multiprocessing 작업하며 발생한 이슈들 정리 1. Queue에서 get( )을 해줘도 Memory 반납이 안 되는 현상 DICOM을 PNG로 변환하는 과정에서 속도 좀 올리려고 Multiprocessing 작업을 하던 중에 Queue( )도 사용하게 됐는데, 이 놈이 get( )을 하면 메모리 반납도 같이 해줘야하는데 계속 들고 있어서 서버가 터지기 직전까지 간 적이 있다. 2~3일 구글링 끝에 원인을 찾게 됐다. Numpy version 문제였다. 1.16에서 1.18로 바꾸니까 잘 되더라. 이 글이 나 같은 현상을 겪는 사람들에게 얼른 노출이 되어 도움이 되길 바라며... https://stackoverflow.com/questions/54419043/memory-use-if-multiprocessing-queue-is-not-used-by-t.. 더보기
How to get reproducible results with Keras (or Tensorflow) ? You can use Tensorflow-Determinism. Check this Link. Line 5 and 6 are important to set reprocibility of Keras. import os import random import numpy as np import tensorflow as tf from tfdeterminism import patch patch() random_seed = 7 os.environ["PYTHONHASHSEED"] = "0" os.environ['TF_DETERMINISTIC_OPS'] = '1' os.environ['TF_CUDNN_DETERMINISTIC'] = '1' np.random.seed(random_seed) random.seed(rando.. 더보기
Generative Adversarial Network (GAN) 설계 시 고려할 부분 GAN은 Generator와 Discriminator가 서로 경쟁하며 학습이 진행되는 network 구조라서 어느 하나의 성능이 낮으면 한 쪽으로 훅 치우치는 경향이 있다. Optimizer와 Learning rate에 따른 성능 차이도 꽤 심하게 나타난다. GAN에서 개인적으로 가장 곤란한 게 성능이 안 나와서 train loss든 train accuracy든 들여다봐도 뭐가 문제인지 해석하기 어렵다는 점이다. 이럴 땐 우선 Discriminator의 복잡도를 올려보자. 더보기
(5) Domain-Adversarial training of Neural Networks (DANN) Keras Code Review Domain Adaptation의 한 부류인 Latent Feature Space Trasnformation에 대한 다섯번째 정리 글이다. 이번 글에서는 Domain-Adversarial training of Neural Networks 논문를 Keras로 직접 구현한 코드 리뷰 시간을 갖고자 한다. 이전에 혼자서 CycleGAN 구현했던 코드를 바탕으로 여러 Github 참고하면서 작업을 진행했다. 먼저 이전 글에서 설명했던 그림을 다시 봐보면서 구현 시 고려해야할 점들을 짚어보자. Inputa Data를 Source와 Target으로 구성하면서 어떻게 Task Classifier는 Source만으로 학습하게 만들지?? 어떻게 하면 Generator가 Domain 특성은 뭉개면서 Task에는 좋은 Fe.. 더보기
(4) Advancing medical Imaging Informatics by Deep Learning-Based Domain Adaptation - Adversarial Training Domain Adaptation의 한 부류인 Latent Feature Space Transformatioon에 대한 네 번째 정리 글이다. 두 번째, 세 번째 글에서는 Divergence minimization에 대해 다뤘었고, 이번 글에서는 Adversarial training에 대해 정리하려고 한다. 논문에서는 Adversarial training에 대해 6 문장 정도만 할당해서 간략하게 언급하고 있는데 그 내용을 정리해보면 아래와 같다. DA를 위해 GAN의 경쟁적 학습 개념을 적용한 방법이다. generator와 discriminator를 경쟁적으로 학습시킨다. discriminator가 input image의 domain이 source인지 target인지를 구분 못하도록 generator를 학.. 더보기