[수행업무] - OMICS 및 의생명정보/ 화합물 데이터를 활용한 인공지능 모델 개발 - 인공지능 모델을 이용한 약물의 잠재적인 타겟 혹은 바이오마커 분석 및 예측 - OMICS 및 의생명정보/ 화합물 데이터 분석 시스템 구축 및 관리 (수집/ 적재/ 처리)
[자격요건] - 학력 : 박사 선호(단, 학사/ 석사도 지원가능하며 관련 경력 보유 필수) - 전공 : 생물정보학, 시스템생물학, 컴퓨터 공학/ 전산학/ 인공지능 관련 전공자 - 경력 : 최소 5~10년 - 머신러닝/ 딥러닝(Tensorflow, Pytorch, Keras 등) 연구 경력 보유 및 관련 논문 이해/ 활용 가능자 - 프로그래밍 언어 (Python, R 등)를 활용한 OMICS 데이터 통계 분석 기술 보유 - 빅데이터 분석 경험, 유전체/ 의생명 데이터 외 다양한 DB 활용 경험
[수행업무] - OMICS 및 의생명정보/ 화합물 데이터를 활용한 인공지능 모델 개발 - 인공지능 모델을 이용한 약물의 잠재적인 타겟 혹은 바이오마커 분석 및 예측 - OMICS 및 의생명정보/ 화합물 데이터 분석 시스템 구축 및 관리 (수집/ 적재/ 처리)
[자격요건] - 학력 : 박사 선호(단, 학사/ 석사도 지원가능하며 관련 경력 보유 필수) - 전공 : 생물정보학, 시스템생물학, 컴퓨터 공학/ 전산학/ 인공지능 관련 전공자 - 경력 : 최소 5~10년 - 머신러닝/ 딥러닝(Tensorflow, Pytorch, Keras 등) 연구 경력 보유 및 관련 논문 이해/ 활용 가능자 - 프로그래밍 언어 (Python, R 등)를 활용한 OMICS 데이터 통계 분석 기술 보유 - 빅데이터 분석 경험, 유전체/ 의생명 데이터 외 다양한 DB 활용 경험
※ 해외거주 응시자에 대하여 2·3단계 비대면 전형 가능(단계별 합격자에 한하여 별도 안내)
※ 동채용 전형과 관련하여,해외거주자의 국내 입국에 대한 항공료 미지급
6.전형일정
구분
전형일자
합격자 발표
비고
공고 및 원서접수기간
【출연(연) 공동채용】
§2021.3.9.(화), 14:00 ~ 3.24.(수),18:00까지
- 온라인 채용시스템 접수
1단계 전형
§서류심사 : 2021.3.25.(목) ~4.8.(목)
§2021.4.9.(금)
인성검사 ID/PW 개별 통보
§인성검사 : 2021.4.10.(토) ~4.13.(화)
2단계 전형
§연구직(식품화학) 발표심사
: 2021.4.14.(수)
장소 : 한국식품연구원 대회의실
§2021.4.16.(금)
(발표자료 업로드)
- 2021.4.13.(화) 11:00까지
§연구직(식품연구데이터관리 및 분석), 기술직 발표 심사 :2021.4.15.(목)
장소 : 한국식품연구원 대회의실
3단계 전형
§연구직(식품화학) 심층면접심사
: 2021.4.21.(수)
장소 : 한국식품연구원 대회의실
§연구직(식품연구데이터관리 및 분석), 기술직 심층면접 심사 :2021.4.22.(목)
장소 : 한국식품연구원 대회의실
§2021.4.23.(금)
기타
§신원 및 결격사유 조회,신체검사
: 2021.4.26.(월) ∼ 5.14.(금)
§최종합격자발표
§2021.5.17.(월)
※ 상기 일정은 ‘한국시간’ 기준이며, 해당 일정 및 시험 장소는 연구원 사정에 의하여 변경될 수 있음
□ NCS기반 채용 직무기술서
1-2.연구직(식품연구데이터):식품연구데이터관리및분석
채용분야 (채용직종)
연구
분류 체계
모집분야
식품연구데이터
세부모집분야
식품연구데이터 관리 및 분석
연구원 주요사업
§식품 기능성 구명, 신소재·신공정 연구개발, 식품·저장·유통·안전성 기술 연구 개발, 전통 식품의 세계화 연구개발, 식품분석·정보·표준화 및 기반 조성 연구개발, 정부·민간·법인· 단체 등과 연구개발 협력 및 기술용역 수탁·위탁, 중소·중견기업 등 관련 산업계 협력·지원과 기술사업화, 주요 임무 분야의 전문인력 양성 및 관련 기술정책 수립지원
핵심업무
▪식품연구데이터표준화,가공․정제․분석및응용기술개발
▪데이터기반 R&D 방법론개발
직무내용
▪연구분야별연구데이터수집프로토콜개발및표준화
▪데이터 관리시스템 구축 및운영
▪인공지능기술을활용한데이터중심식품R&D방법론개발
▪데이터융합분석도구및시각화도구개발
전형방법
§1단계서류전형및인성검사➠2단계전공분야및연구계획발표➠3단계심층면접
➠ 임용
일반요건
연령
무관
성별
무관
교육요건
학력
석사 이상
전공
생물정보학,컴퓨터학,통계학,데이터과학,문헌정보학관련분야
필요지식
▪데이터 관리시스템 구축관련지식
▪데이터관리관련지식(데이터전처리,큐레이팅및저장기술)
▪데이터분석관련지식(기계학습및인공지능)
▪식품분야연구의이해와연구데이터관련지식
필요기술
▪식품연구데이터관리및분석시스템구축을위한시스템개발기술
▪데이터관리기술(표준화,교육,서비스도구제공)
▪대용량데이터를활용한기계학습기반모델링기술
직무태도
§창의적이고 도전적이며 책임감 있는 연구수행 자세와 프로젝트 목표를 명확히 파악하여 선택과 집중을 통해 연구 성과를 극대화하며 유연한 사고와 소통을 통하여 밝은 연구환 경을조성하고연구원업무규정을철저히준수
필요자격
§박사:최근3년간관련SCI(E)논문2편이상(주저자및교신저자)
§석사:최근3년간관련SCI(E)논문1편이상(주저자및교신저자)
우대자격
§식품또는컴퓨터사이언스전공자로AI유경험자
직업기초 능력
§의사소통능력, 수리능력, 문제해결능력, 자기개발능력, 자원관리능력, 의사소통 및 대인 관계 능력, 정보처리능력, 언어능력, 직업윤리
:GradCAM 기술을 사용하여 병리학적 상태를 예측하기 위해, 이미지의 중요한 영역을 강조하는 히트맵을 생성
: 먼저 작은 Training 셋을 로드하고, 앞서 AUC 측정값이 가장 높은 4개의 클래스를 살펴볼 것
df = pd.read_csv("drive/MyDrive/nih/train-small.csv")
IMAGE_DIR = "drive/MyDrive/nih/images-small/"
# only show the lables with top 4 AUC
labels_to_show = np.take(labels, np.argsort(auc_rocs)[::-1])[:4]
# Expected output
Loading original image
Generating gradcam for class Cardiomegaly
Generating gradcam for class Mass
Generating gradcam for class Pneumothorax
Generating gradcam for class Edema
plt.xticks(rotation=90)
plt.bar(x=labels, height=np.mean(train_generator.labels, axis=0))
plt.title("Frequency of Each Class")
plt.show()
: 위 그림에서 여러 병리에 따라 양성 사례의 유병률이크게 다르다는 것을 알 수 있음
→이러한 경향은 전체 데이터셋의 경향도 반영함
: 이상적으로는 균형 잡힌 데이터셋으로 모델을 훈련시켜, positive 및 negative 사례가 손실에 동등하게 기여하도록 함
Exercise 2 - Computing Class Frequencies
: 아래 함수를 통해, 각 데이터셋의 라벨에 대한 빈도를 계산
def compute_class_freqs(labels):
"""
Compute positive and negative frequences for each class.
Args:
labels (np.array): matrix of labels, size (num_examples, num_classes)
Returns:
positive_frequencies (np.array): array of positive frequences for each
class, size (num_classes)
negative_frequencies (np.array): array of negative frequences for each
class, size (num_classes)
"""
# total number of patients (rows)
N = labels.shape[0]
positive_frequencies = np.sum(labels, axis=0) / labels.shape[0]
negative_frequencies = 1 - positive_frequencies
return positive_frequencies, negative_frequencies
data = pd.DataFrame({"Class": labels, "Label": "Positive", "Value": pos_contribution})
data = data.append([{"Class": labels[l], "Label": "Negative", "Value": v}
for l,v in enumerate(neg_contribution)], ignore_index=True)
plt.xticks(rotation=90)
sns.barplot(x="Class", y="Value", hue="Label" ,data=data);
: 위 그림에서처럼 가중치를 적용되어, 각 클래스의 양수/음수 레이블이 손실 함수에 대해 동일한 기여도를 갖게됨
Exercise 3 - Weighted Loss
:아래 weighted_loss 함수를 작성하여 각 배치의 가중 손실을 계산하는 손실 함수를 반환
: 다중 클래스 손실의 경우 각 개별 클래스의 평균 손실을 합산
def get_weighted_loss(pos_weights, neg_weights, epsilon=1e-7):
"""
Return weighted loss function given negative weights and positive weights.
Args:
pos_weights (np.array): array of positive weights for each class, size (num_classes)
neg_weights (np.array): array of negative weights for each class, size (num_classes)
Returns:
weighted_loss (function): weighted loss function
"""
def weighted_loss(y_true, y_pred):
"""
Return weighted loss value.
Args:
y_true (Tensor): Tensor of true labels, size is (num_examples, num_classes)
y_pred (Tensor): Tensor of predicted labels, size is (num_examples, num_classes)
Returns:
loss (Tensor): overall scalar loss summed across all classes
"""
# initialize loss to zero
loss = 0.0
for i in range(len(pos_weights)):
# for each class, add average weighted loss for that class
loss += -(K.mean( pos_weights[i] * y_true[:,i] * K.log(y_pred[:,i] + epsilon) + \
neg_weights[i] * (1 - y_true[:,i]) * K.log(1 - y_pred[:,i] + epsilon), axis = 0))
return loss
return weighted_loss
: 예제 테스트
sess = K.get_session()
with sess.as_default() as sess:
print("Test example:\n")
y_true = K.constant(np.array(
[[1, 1, 1],
[1, 1, 0],
[0, 1, 0],
[1, 0, 1]]
))
print("y_true:\n")
print(y_true.eval())
w_p = np.array([0.25, 0.25, 0.5])
w_n = np.array([0.75, 0.75, 0.5])
print("\nw_p:\n")
print(w_p)
print("\nw_n:\n")
print(w_n)
y_pred_1 = K.constant(0.7*np.ones(y_true.shape))
print("\ny_pred_1:\n")
print(y_pred_1.eval())
y_pred_2 = K.constant(0.3*np.ones(y_true.shape))
print("\ny_pred_2:\n")
print(y_pred_2.eval())
# test with a large epsilon in order to catch errors
L = get_weighted_loss(w_p, w_n, epsilon=1)
print("\nIf we weighted them correctly, we expect the two losses to be the same.")
L1 = L(y_true, y_pred_1).eval()
L2 = L(y_true, y_pred_2).eval()
print(f"\nL(y_pred_1)= {L1:.4f}, L(y_pred_2)= {L2:.4f}")
print(f"Difference is L1 - L2 = {L1 - L2:.4f}")
# Expected output
Test example:
y_true:
[[1. 1. 1.]
[1. 1. 0.]
[0. 1. 0.]
[1. 0. 1.]]
w_p:
[0.25 0.25 0.5 ]
w_n:
[0.75 0.75 0.5 ]
y_pred_1:
[[0.7 0.7 0.7]
[0.7 0.7 0.7]
[0.7 0.7 0.7]
[0.7 0.7 0.7]]
y_pred_2:
[[0.3 0.3 0.3]
[0.3 0.3 0.3]
[0.3 0.3 0.3]
[0.3 0.3 0.3]]
If we weighted them correctly, we expect the two losses to be the same.
L(y_pred_1)= -0.4956, L(y_pred_2)= -0.4956
Difference is L1 - L2 = 0.0000
3.3 DenseNet121
:다음으로 Keras에서 로드한 후, 두 개의 레이어를 추가 할 수 있는 DenseNet121 모델을 사용
*GlobalAveragePooling2D - DenseNet121에서 마지막 convolution 레이어의 평균을 얻음
*Dense - 각 클래스에 대한 예측 logit을 얻기 위한 sigmoid 기능이 있는 layer
: compile 함수에서 loss 매개 변수를 지정하여, 모델에 대한 사용자 정의 손실 함수를 설정할 수 있음
# create the base pre-trained model
base_model = DenseNet121(weights='drive/MyDrive/nih/densenet.hdf5', include_top=False)
x = base_model.output
# add a global spatial average pooling layer
x = GlobalAveragePooling2D()(x)
# and a logistic layer
predictions = Dense(len(labels), activation="sigmoid")(x)
model = Model(inputs=base_model.input, outputs=predictions)
model.compile(optimizer='adam', loss=get_weighted_loss(pos_weights, neg_weights))