분류 전체보기 (340)

반응형
 

Single Gene 2 alleles Model의 결점


앞서 살펴본 것들은 Single Gene 2 alleles 모델이다. 이는 현실과는 다른데 그 이유로는 아래와 같은 것들을 들 수 있다.


1. Penetrance : 질병 유전자가 반드시 형질의 변화에 영향을 주지 않고 suceptability에 영향을 줌

2. 하나의 유전자가 아니라 많은 수의 유전자가 형질에 관여함

3. Epistatsis : 유전자들간의 상호작용

4. 한 유전자에 많은 allele이 있을 수 있음 (ex. 혈액형 - 3개의 alleles)

5. 형질에는 환경이 관여한다. : (선탠을 하면 피부가 탄다-environment effect, 어떤 사람은 선탠을 하면 피부가 더 잘탄다-genotype, environment interaction)


Mutation Rate


Mutation Rate는 mutation이 한 번의 generation에 얼마나 발생하는지를 나타내는 수치이다. muation rate는 mutation을 어떻게 정의하냐에 따라 달라지긴하지만 보통은 어떠한 하 나의 base가 다른 base로 변경되는 것을 mutation이라고 한다. C elegans를 대상으로 muation rate를 조사해봤을 때, 2.1*10^-8 / per base / per generation 이었다. 이를 인간에 적용해보면 3.1*10^9 * 2.1*10^-8 = 65개의 새로운 mutation이 평균적으로 매 generation 마다 생겨나는 것을 알 수 있다. 그리고 실제 인간을 대상으로 mutation rate를 연구를 한 논문에서도 63개 정도의 mutation이 generation마다 평균적으로 발생한다고 밝혀졌다. 그리고 새롭게 생기는 mutation의 수는 아버지의 나이와 관련 있다. 아버지의 나이가 많을 수록 더 많은 수의 mutation이 평균적으로 발생한다. 그 mutation들 중에서 평균적으로 1~2개의 mutation이 해롭다고 한다.




QTL


양적 형질에 관여하는 것으로 예상되는 loci를 QTL이라 한다. 실제로 그것의 정확한 위치는 알 수 없지만 마커와의 연관을 통해 근사적으로 추론한다. 특정 양적 형질에 영향을 미치는 많은 QTL이 많이 발견되었다.


genotype-phenotype의 관계를 추론하는데 사용하는 근본적인 방법은 phenotype에 영향을 미치는 gene 근처의 마커와 phenotype의 연관(association)을 보는 것이다. A라는 마커의 genotype을 AA, Aa, aa라고 하고, AA인 사람의 키의 평균이 180cm, Aa인 사람의 키의 평균이 175, aa인 사람의 키의 평균이 170cm였다면, A가 disease와 연관이 있다고 볼 수 있다. 그리고 실제 QTL은 A 마커와 연관이 되어 있다고 추론할 수 있다. A 마커와 실제 QTL에 recombination이 거의 없을수록 A 마커의 effect는 크게 나타날 것이다. 



이는 마치 누군가가 실종되었는데, 그 사람의 위치를 정확하게 말하지 않고 "노스캐롤라이나 주" 라고 말하는 것과 같다. 따라서 많은 마커를 통해 실제 QTL의 위치를 specific 하게 찾는 것이 중요하다.



Localizing QTL


이러한 LOD plot을 통해 QTL을 localization할 수 있다. 이 그림을 통해 토마토의 10번 염색체 위의 마커들이 ph와 연관 되었음을 확인할 수 있다. 단순형질과 다른 점은 이러한 연관된 region이 한 군데가 아니라 여러곳에 존재한다는 것이다.



하지만 위 그림을 보고 B, C 사이에 QTL이 존재할 것이라고 생각하는 건 위험할 수 있다.


바로 위와 같은 상황이 있을 수 있기 때문이다. B, C 사이에 T가 있고 T의 연관은 적을 수도 있다. 이 상황에서는 B, C 사이에 한 개의 QTL이 있는 게 아니라 B 근처에 한 개, C 근처에 한 개가 있다고 볼 수 있다.



출처 - 코세라 Duke University 유전학 강의


반응형

'Domains > Genetics' 카테고리의 다른 글

Genetics - Gene vs Environment  (0) 2017.11.14
Genetics - Genome-wide association study  (0) 2017.11.13
Genetics - Genetic Mapping2  (0) 2017.11.11
Genetics - Genetic Mapping1  (0) 2017.11.11
Genetics - Recombination  (0) 2017.11.11
반응형


Genetic Mapping2


유전자의 상대적 위치를 결정하고, 특정 질병과 관련있는 유전자를 특정하는 것 genetic mapping이라고 한다. Genetic mapping의 궁극적인 목표는 genotype과 phenotype의 association을 알아내는 것이다.


[genetic mapping의 개념]



Human Genom Project를 통해 인간 유전체 30억개 서열을 읽을 수 있게 되었고, 20000여개의 gene을 찾아내었다. 하지만 서열을 통해 gene이 무슨 역할을 하는지 어느정도 알 수있었지만, 어떤 변이가 disease-causing 인지는 "추측"할 수 밖에 없다.


수십년전부터 시작된 Gene Mapping은 disease-causing mutation이 어디인지 상대적으로 결정하는 것이다. gene mapping은 dna sequencing이 발달하기 이전의 최초 접근법이라고 볼 수 있다. 상대적으로 결정한다는 것은 genome 상에 어떤 reference point와의 상대적 위치를 결정한다는 것인데 이 reference point를 genetic marker라고 한다. genetic marker는 보통 SNP(single nucleotide polymorphism)을 사용한다.



다소 극단적인 예를 들어보자. A, B 라는 SNP marker가 있고, 위는 offspring의 genotype과 질병 여부를 나타낸 것이다. B marker의 genotype이 bb인 경우, 모두 질병에 걸렸으므로, B의 bb genotype이 질병과 연관(linked)이 있다는 것을 알 수 있다. 따라서 B marker가 실제 disease-causing mutation과 association이 있다고 추론해볼 수 있다.



Genetic Mapping Example


Gene Mapping을 하기 위해서는 parents와 offspring의 Marker의 genotype이 필요하다. 또 parents 중 한 명은 heterozygous여야한다. homozygous인 경우, recombination을 관찰할 수 없기 때문이다. 예를 들어서 genetic mapping을 실제로 하는 법을 살펴보자. 마커 AB에 대하여, AB/ab genotype과 ab/ab genotype인 부모의 자손을 조사했을 때 다음과 같은 genotype-phenotype 결과를 얻었다고 하자. Genetic Mapping의 목표는 disease-causing mutation의 A,B와 비교한 상대적인 위치를 알아내는 것이다.


위 경우에는 A marker가 disease와 연관이 있다는 것을 알 수 있다. C 유전자가 실제 disease-causing이라면, 이 C 유전자의 genotpe이 A와 같이 유전될 것이다.


그러면 C 유전자를 포함해 위와 같은 genotype-phenotype 관계를 알 수 있고, 이를 통해 gene map을 추론할 수 있다. 위 문제의 답은 A-C-B 이다. 가장 희귀한 case인 abC/abc, ABc/abc를 보면, A와 B 는 parental이고, C만 recombinant임을 알 수 있다. 빈도가 희귀한 것과, A-B는 parental인데, C만 recombinant 인 것을 보면 이는 A-C-B 에서 double recombination이 일어나, A-c-B, a-b-C가 되었음을 알 수 있다. 혹은 각각의 유전자들마다 recombination fraction을 구해서 gene map을 구할 수도 있다. 즉, A-B, B-C, A-C의 recombination fraction을 구한 후, 이를 통해 유전자의 상대적 위치를 알 수 있다. 예를 들어, A-B의 recombination fraction = 157/843+157 = 0.157


문제


AbC/aBc X abc/abc의 결과로 아래와 같은 빈도가 관찰되었다.


ABC/abc = 13

ABc/abc = 11

abC/abc =6

AbC/abc = 257

aBc/abc = 237

Abc/abc = 1

aBC/abc = 0

abc/abc = 8


A-C의 recombination fraction의 근사값은?


ABC/abc = 13 => parental

ABc/abc = 11 => recombinant

abC/abc =6=> recombinant

AbC/abc = 257=> parental

aBc/abc = 237 => parental

Abc/abc = 1=> recombinant

aBC/abc = 0 => recombinant

abc/abc = 8 => parental


11+6+1+0/13+11+6+257+237+1+0+8 = 0.033




Population Mapping


Genetic mapping은 앞서본것처럼 가족을 대상으로 할 수도 있지만, 인구 집단을 대상으로 할 수도 있다.



이 그림은 4개의 염색체가 시간이 오래지나서 뒤죽박죽 섞여 있는 모습을 나타낸 그림이다. (D=Disease Allele, M1=Marker1, M2=Marker2) 이 그림에서 중요한 사실은 아무리 많은 세대가 지나더라도 D와 M1사이의 연관은 그대로 남아있다는 것이다. 이렇게 연관이 그대로 남아있을 수 있는 이유중 하나로, Recombination이 완전히 임의로 일어나지 않는다는 사실을 들 수 있다. 염색체에서 Recombination이 자주 일어나는 부분을 Recombination hotspot이라 하는데(hot spot은 평균적으로 매 3000bp 마다 한 번씩 존재한다.) 이 부분을 제외한 나머지 부분은 recombination fraction이 거의 0에 가깝다. 따라서 hotspot과 hotspot 사이에 window가 형성되는데 이 window 내에서는 recombination이 거의 일어나지 않고 세대가 지나더라도 같이 유전된다. 이를 Linkage disequilibrium(LD)이라 한다. 어떠한 window 내에 disease gene이 있을 수 있고, 우리는 이러한 LD를 이용하여 disease gene을 찾을 수 있다. hot spot이 평균적으로 매 3000bp 마다 한 번씩 있으므로 30억/3000 = 100만개의 SNP을 마커로 사용한다면 disease gene을 찾을 수 있다.



이 그림은 window와 LD에 대해 이해하기 좋은 그림이다. 이를 통해 disease locus의 위치를 알아내기 위해 마커가 어떻게 쓰이는지를 이해할 수 있다. 예를 들어 SNP2=G일 때 Disease Allele인 A가 높은 비율로 존재한다. 따라서 SNP2은 Disease에 대해 연관이 있고 좋은 정보를 준다는 것을 알 수 있다. 하지만 윈도우 밖의 SNP5의 경우 disease와 아무런 연관이 없다.


위에서 말한 100만개의 SNP 마커를 (genotype) 알아내는 기술을 microarray라 한다. 많은 회사들이 이러한 SNP 마커를 이용해 disease suceptabilty를 알려주는 서비스를 제공한다.



Pedigree와 population으로 mapping하는 것의 차이는 위 그림에서 볼 수 있다. pedigree는 세대수가 적기 때문에 recombination이 된 부분이 적다. 따라서 같은 염색체 내에서 두 locus가 recombination이 되었을 확률이 적다. 하지만 Population의 경우 매우 많은 세대가 지난 것이기 때문에 같은 염색체 내에서라도 많은 recombination이 일어났을 것이다. 그러므로 recombination이 안일어났을 것이라고 보장되는 범위가 pedigree에서는 ~2백만bp이지만 population을 이용했을 때는 ~3000bp 정도이다. 또 Population을 대상으로하면 질병이 희귀한 경우 연구하기 힘들다. 엄청나게 많은 sample을 뽑아야하기 때문이다.





출처 - Coursera Duke Univ 유전학 강의


반응형

'Domains > Genetics' 카테고리의 다른 글

Genetics - Genome-wide association study  (0) 2017.11.13
Genetics - Genetic Mapping3  (0) 2017.11.12
Genetics - Genetic Mapping1  (0) 2017.11.11
Genetics - Recombination  (0) 2017.11.11
EM 알고리즘 haplotype frequency 추정  (0) 2017.10.08
반응형


Genetic Mapping


gene mapping은 human genone project가 완성되고, dna sequencing 기술이 발전되기 훨씬 이전부터 있던 개념이다. Gene Mapping의 기본 개념은 dna sequencing을 하지 않고도 염색체 안에서 gene의 순서를 결정하고 질병과의 연관성을 정립하는 것이다.



Recombintation Fraction 계산을 통한 Gene Mapping


앞서 포스팅한 http://3months.tistory.com/216 을 통해 Recombination Fraction을 구하는 방법을 알아보았다. 이번엔 3개의 linked라고 예상되어는 gene들에 대해 각각 서로의 recombination fraction을 구해본다. 부모의 phase가 ABC/abc * abc/abc 일 때를 예로 들어보자. 3개의 gene일 때 recombination fraction을 구하는 방법은 구하고자하는 유전자외의 나머지 유전자는 가리고 구하면된다. 즉, A-B를 구하려면 C를 가리고 AB에 대해서만 보면된다. 그러면 AB/ab, ab/ab만 parental이고 나머지는 recombinant이다. 따라서 recombinant의 숫자는 15+13+1+1 = 30 따라서 recombination fraction = 30/1000 = 0.03 이다. 이런식으로 나머지 유전자들에 대해서도 구하면, A-C간에는 0.046, B-C간에는 0.02가 나온다. 따라서 A-B-C 순서로 유전자가 염색체상에 존재하는 것을 알 수 있다. 이를 Gene Map 이라 한다.


Double Cross-over



유전자의 순서가 A-B-C 순서라면 왜 거리가 4.6 vs 5 로 정확히 맞지 않을까? 한 가지 이유는 Double Cross-over 때문이다. 위 그림에서 빈도수가 1인 AbC/abc, aBc/abc는 Double cross-over가 일어났다. 그래서 A-C 사이의 recombination fraction을 계산할 때 parental 이 아니라 recombinant로 들어가야한다. (+4가 되어야함) 왜 이것이 double cross-over 인가? 우선 빈도수가 매우 낮기 때문이다. 위 그림에서 A-B에 recombination 될 확률이 1%, B-C에 될 확률이 1%라면 double로 될 확률은 0.01%이다. 또, A-B-C 순서로 gene이 위치한다면, 저런 조합이 나온 이유는 double recombination에 의한 것이다.




반응형

'Domains > Genetics' 카테고리의 다른 글

Genetics - Genetic Mapping3  (0) 2017.11.12
Genetics - Genetic Mapping2  (0) 2017.11.11
Genetics - Recombination  (0) 2017.11.11
EM 알고리즘 haplotype frequency 추정  (0) 2017.10.08
DNA 결합 단백질  (2) 2017.08.12
반응형

Recombination


Recombination=Crossing-over이 아니다. Crossing-over은 Recombination의 한 종류이다. Independant Assortment(독립유전)도 Recombination의 한 종류이다. 즉, Recombination의 두 가지 타입은


1. 독립 유전

- 주로 다른 염색체 간에 진행되는 과정. 독립유전에서는 독립적으로 유전이 이루어지므로 자손의 allele은 단순히 확률을 곱해서 구할 수 있다.


2. Crossing-over

- 이것이 Recombination과 동의어로써 쓰이기도 한다. 주로 같은 상동 염색체끼리 부위를 교환하는 과정이다. 아빠로부터 받은 염색체의 일부와 엄마로부터 받은 염색체의 일부가 감수분열 시 교환되는 현상


Crossing-over


감수분열 과정에서 crossing-over이 일어나지 않은 것이 NR이고, R은 crossing-over이 일어난 것. NR은 어머니로부터 받은 염색체가 그대로 생식세포로 전달되었고, R은 어머니와 아버지로부터 받은 염색체가 crossing-over이 되었다.


어떻게 Crossing-over이 일어난 것을 알 수 있나?


Genetic Marker을 통해 Crossing-over이 일어난 것을 알 수 있다. 위 그림을 보면, Allelse는 AaBb이다. 만약 recombination(crossing-over)이 일어나지 않았다면 생식세포의 alleles는 AB 또는 ab일 것이다. 왜냐하면 AB, ab는 같은 염색체에 있기 때문에 같이 다닐 것이기 때문이다. 하지만 recombination이 일어나면 같은 염색체 내의 Allele이 aB나 Ab가 될 수 있다.


가까운 variants(allele)은 연관이 되었을 경향이 크다


위 그림에는 AB는 linked 되어있다. 둘다 엄마로부터 받거나 둘다 아빠로부터 받는다. 가까운 위치에 있기 때문에 생식세포를 형성할 때 같이 다니기 때문이다. 반면 AC는 2/5의 확률로 염색체의 주인이다르다. 이 경우에는 독립유전의 법칙이 깨지게 된다.


이 그림에서 보듯이 Ab aB alleles를 갖고 있더라도(그림은 아버지로부터 받은 alleles(Ab)와 어머니루부터부 받은 alleles(aB)를 보여주는데 이렇게 allele이 누구로부터 왔는지, 같은 염색체 내에 있는지를 보여주는 것을 이를 Phase라고 한다.) 다른 염색체에 있거나, 멀리 떨어져서 recombination이 일어나지 않으면 생식세포가 Ab, aB 형태만 갖는 것이 아니라 AB, ab 형태도 갖을 수 있게 된다.


이 중에서 Recombinant 인 경우는? 답 : Aabb, aaBb (만약 Recombination 없다면 각각이 나올 확률을 1/4이다.)



Alleles Association


Point :  두 allele의 위치가 멀리 떨어져있다면, 그 두 allele이 같이 생식세포로 갈 확률은 50%이다. 두 allele이 가까운 위치에 있다면, 같이 생식세포로 갈 확률은 거의 0%이다.


Point : Recombintation Fractor은 gene의 거리를 반영한다. 두 유전자의 거리가 멀면 Recombination Fraction은 크고, 가까우면 Recombination Fraction은 작다. Recombination Fraction은 0~50% 사이의 값이다.


Recombination 계산

부모의 phase가 위와 같을 때, recombination이 아예 없다면, cn+vg, cnvg+만 나타날 것이다. 이것을 parental 이라고 한다. 그 외의 cn+vg+, cnvg는 상동염색체 끼리의 recombination이 일어나서 생겨난 것으로 recombinant라고 한다. recombination fraction은 전체 개체수중에 recombinant된 offspring의 비율이다. 따라서 9+11/(92+88+9+11) = 20/200 = 0.1이다. 이 recombination fraction은 두 gene사이의 거리에 관한 정보를 준다.



출처 - 코세라 Duke Univsersity 유전학 강의

반응형

'Domains > Genetics' 카테고리의 다른 글

Genetics - Genetic Mapping2  (0) 2017.11.11
Genetics - Genetic Mapping1  (0) 2017.11.11
EM 알고리즘 haplotype frequency 추정  (0) 2017.10.08
DNA 결합 단백질  (2) 2017.08.12
유전체학을 위한 신경망 모델  (0) 2017.08.12
반응형


R 랜덤포레스트 사용하기


머신러닝 분야에서 많이 쓰이는 예제 데이터셋 Pima Diabetes 자료를 통해 간단한 Random Forest를 사용하는 방법을 알아보겠습니다.


라이브러리 로드

library(MASS) library(randomForest) library(caret)

MASS : 예제 데이터셋이 있는 라이브러리

randomForest : randomForest 이용을 위한 라이브러리

caret : 성능 평가시 confusion matrix를 그리기 위한 라이브러리


데이터 불러오기

data("Pima.tr")
data("Pima.te")

R에서 데이터 불러오는 방법은 라이브러리가 로드된 상태에서 data("데이터이름")이라고 실행하면, 작업공간상에 데이터가 생성됩니다.


> head(Pima.tr)
  npreg glu bp skin  bmi   ped age type
1     5  86 68   28 30.2 0.364  24   No
2     7 195 70   33 25.1 0.163  55  Yes
3     5  77 82   41 35.8 0.156  35   No
4     0 165 76   43 47.9 0.259  26   No
5     0 107 60   25 26.4 0.133  23   No
6     5  97 76   27 35.6 0.378  52  Yes

RandomForest 모형 만들기

set.seed(10)
rf.fit = randomForest(type ~ npreg + glu + bp + skin + bmi + ped + age
                      , data=Pima.tr, mtry = floor(sqrt(7)), ntree = 500, importance = T)
rf.fit

randomForest 모형을 만드는 문법은 위와 같습니다. hyper parameter로 이 모형에서는 mtry와 ntree를 사용하였습니다. mtry는 각각의 tree마다 몇 개의 feature를 사용할 것인지를 정하는 것입니다. 골드스탠다다는 보통, regression의 경우 변수갯수/3, classification의 경우 sqrt(변수갯수)를 사용합니다. 이 데이터셋은 classification 문제이므로, sqrt를 사용하였습니다. ntree는 tree의 총 갯수를 의미합니다.


테스트 데이터 생성

test_x = Pima.te[c("npreg", "glu", "bp", "skin", "bmi", "ped", "age")]
test_y = Pima.te$type

test_y를 불러올 때는 $로 불러와야지 vector로 불러와지므로 아래 confusionMatrix가 잘 실행됩니다.


성능 평가

y_pred = predict(rf.fit, test_x)

confusionMatrix(y_pred, test_y)
Confusion Matrix and Statistics

          Reference
Prediction  No Yes
       No  192  46
       Yes  31  63
                                          
               Accuracy : 0.7681          
                 95% CI : (0.7189, 0.8124)
    No Information Rate : 0.6717          
    P-Value [Acc > NIR] : 7.678e-05       
                                          
                  Kappa : 0.455           
 Mcnemar's Test P-Value : 0.1106          
                                          
            Sensitivity : 0.8610          
            Specificity : 0.5780          
         Pos Pred Value : 0.8067          
         Neg Pred Value : 0.6702          
             Prevalence : 0.6717          
         Detection Rate : 0.5783          
   Detection Prevalence : 0.7169          
      Balanced Accuracy : 0.7195          
                                          
       'Positive' Class : No    


변수 중요도

> importance(rf.fit)
             No       Yes MeanDecreaseAccuracy MeanDecreaseGini
npreg  9.467923  1.762747             9.098049         9.308814
glu   14.543787 16.760373            20.263701        21.771324
bp     4.210273 -8.185459            -1.740227         7.920807
skin   1.370477  1.662921             2.029630         9.350372
bmi    3.431359  7.500978             7.200368        13.322145
ped    4.957824  4.666885             6.778956        13.479470
age   12.162707  6.341079            13.414806        14.528669

변수 중요도 플롯




17페이지에 random forest hyper-parameter 관련한 설명들이 나온다.

https://cran.r-project.org/web/packages/randomForest/randomForest.pdf


Random Forest 관련 튜토리얼

https://machinelearningmastery.com/tune-machine-learning-algorithms-in-r/

반응형
반응형

Segmentation


classification이 사진에서 어떠한 물체가 '존재하는지' 를 판단하는 것이라면 Segmentation은 이미지에서 픽셀단위로 해당 픽셀이 어떤 Class에 속하는지를 예측하는 태스크로 볼 수 있다.


Input


Output


예를 들어, 위 그림을 보자. 오토바이를 타고 있는 사람이 보인다. 이 데이터를 Input으로 주면 아래와 같은 Output을 주는 것이 Segmentation의 태스크이다. 이를 트레이닝하기 위해서는 픽셀레벨로 해당 픽셀이 어디에 속하는지 label을 달은 데이터가 필요하다. 이는 사람이 직접 label을 하는 경우가많다. 위 pascal challenge에서도 사람이 직접 label한 데이터를 제공하였다.


Object Segmentation과 Class Segmentation


pascal voc2011 challenge에서는 segmentation을 object segmentation과 class segmentation으로 나누었다. object segmentation은 이미지에서 '어떤 물체가 있다는 사실' 을 픽셀단위로 예측하는 것이고, class segmentation은 어떤 물체가 '어떤 클래스에 속하는 지'까지 예측하는 것이다. 예를 들어 아래 그림을 보면, object segmentation에서는 어떤 object별로 모두 다른 색깔로 표현하고 있지만, class segmentation에서는 object들 중에서 같은 class인 경우 같은 색깔로, 표시하고 있다. (예를 들어 같은 '화분' 이라는 class를 갖고 있는 object는 같은 색깔로 표시하였다.) 



Dilated Convolution


Dilated Convolution은 필터 내부에 zero padding을 추가해 강제로 receptive field를 늘리는 방법이다. 위 그림은 파란색이 인풋, 초록색이 아웃풋인데, 진한 파랑 부분에만 weight가 있고 나머지 부분은 0으로 채워진다. receptive field란 필터가 한 번의 보는 영영으로 볼 수 있는데, 결국 필터를 통해 어떤 사진의 전체적인 특징을 잡아내기 위해서는 receptive field는 높으면 높을 수록 좋다. 그렇다고 필터의 크기를 크게하면 연산의 양이 크게 늘어나고, 오버피팅의 우려가있다. 그래서 일반적인 CNN에서는 이를 conv-pooling의 결합으로 해결한다. pooling을 통해 dimension을 줄이고 다시 작은 크기의 filter로 conv를 하면, 전체적인 특징을 잡아낼 수 있다. 하지만 pooling을 수행하면 기존 정보의 손실이 일어난다. 이를 해결하기 위한것이 Dilated Convolution으로 Pooling을 수행하지 않고도 receptive field의 크기를 크게 가져갈 수 있기 때문에 spatial dimension의 손실이 적고, 대부분의 weight가 0이기 때문에 연산의 효율도 좋다. 공간적 특징을 유지하는 특성 때문에 Dilated Convolution은 특히 Segmentation에 많이 사용된다.


이 그림을 통해 pooling-conv후 upsampling을 하는 것과 dilated convolution(astrous convolution)을 하는 것의 차이를 볼 수 있다. 위 그림에서 볼 수 있듯 공간적 정보의 손실이 있는 것을 upsampling 하면 해상도가 떨어진다. 하지만 dilated convolution의 그림을 보면 receptive field를 크게 가져가면서 convolution을 하면 정보의 손실을 최대화하면서 해상도는 큰 output을 얻을 수 있다.



Dilated Convolution을 어떻게 Segmentation에 활용할까?


출처-http://blog.naver.com/sogangori/220952339643


첫번째 그림은 classification을 위한 CNN VGG-16의 아키텍쳐이다. conv-pooling을 반복적으로 수행한 후, 마지막으로 Fully Connected Layer에 통과하여 최종 classification 결과를 얻는 과정을 보여주고있다. 그 아래의 그림은 Dilated Convolution을 통하여 이미지를 segmentation하는 예를 보여주고 있다. 이 아키텍쳐의 아웃풋의 사이즈는 28x28xN 이며, (N은 segmentation 원하는 클래스의 수) 이를 다시 upsampling하여 원래의 크기로 복원한다. (이부분에서 공간적 정보의 손실이 있다.)


이 아키텍쳐와 classification 아키텍쳐의 다른점은 우선 다이아몬드 모양으로 표시한 dilated convolution으 통해 공간적 정보의 손실을 최소화하였다. 그리고 dilated convolution 2번을 적용한 뒤 나온 28x28x4096 에 대하여 1x1 convolution으로 channel의 dimension reduction을 수행한다. 최종적으로 28x28xN이 나오고 이를 8x upsampling하여 최종적인 segmention 결과를 output으로 내놓는다. 이 때 1x1 convolution 은 공간적인 정보를 잃지 않기 위해 사용되며, classifiction의 Fully Connected Layer(FC)와 비슷한 역할을 한다. 하지만 classification에서는 공간적인 정보는 중요하지 않기 때문에 Flatten하여 사용하는 것이다.


반응형
반응형


Keras 멀티 GPU 이용하기


keras 2.0.9 버전부터 멀티 GPU를 손쉽게 활용할 수 있게 업데이트되었습니다. 이번 포스팅은 기존 모델을 멀티 GPU를 사용하여 트레이닝하는 예제입니다.


1. keras 2.0.9 이상에서 지원하므로 2.0.9 이상으로 업데이트

pip install --upgrade keras

2. keras 모델 생성


일반적인 keras CNN을 예로 들어 설명하겠습니다. 대략 이런 cnn model이 있다고 합시다. (패키지 임포트문 생략)

def cnn_model(): # create model model = Sequential() model.add(Convolution2D(16, 3, 3, border_mode='same', activation='relu', input_shape=(256,256,1))) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Convolution2D(32, 3, 3, border_mode='same', activation='relu')) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Convolution2D(32, 3, 3, border_mode='same', activation='relu')) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Convolution2D(64, 3, 3, border_mode='same', activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Convolution2D(64, 3, 3, border_mode='same', activation='relu')) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(64, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(64, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(3, activation='softmax')) return model


2.0.9 버전 이후부터 제공하는 multi_gpu_model을 임포트

from keras.utils.training_utils import multi_gpu_model

모델을 만들고 multi_gpu_model을 통해서 multi gpu를 활용한다는 선언을 합니다. gpus 파라미터에 사용하고 싶은 gpu 수를 설정합니다. 모델을 compile하고 fit하면 트레이닝이 됩니다.

model = cnn_model()
model = multi_gpu_model(model, gpus=4)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(train_x, train_y, validation_data=(test_x, test_y), nb_epoch=20, batch_size=32, verbose=1)

트레이닝이 잘됩니다.

Train on 215 samples, validate on 107 samples
Epoch 1/20
215/215 [==============================] - 1s - loss: 2.0448 - acc: 0.4465 - val_loss: 1.0884 - val_acc: 0.2710
Epoch 2/20
215/215 [==============================] - 0s - loss: 1.5974 - acc: 0.4791 - val_loss: 1.1431 - val_acc: 0.1963
Epoch 3/20
215/215 [==============================] - 0s - loss: 1.2704 - acc: 0.5302 - val_loss: 1.2524 - val_acc: 0.4486
Epoch 4/20
215/215 [==============================] - 0s - loss: 1.1777 - acc: 0.4512 - val_loss: 1.3994 - val_acc: 0.5327
Epoch 5/20
215/215 [==============================] - 0s - loss: 1.0600 - acc: 0.5953 - val_loss: 1.4960 - val_acc: 0.5888
Epoch 6/20
215/215 [==============================] - 0s - loss: 1.0486 - acc: 0.6512 - val_loss: 1.5189 - val_acc: 0.5888
Epoch 7/20
215/215 [==============================] - 0s - loss: 0.9968 - acc: 0.6186 - val_loss: 1.5151 - val_acc: 0.5888
Epoch 8/20
215/215 [==============================] - 0s - loss: 1.0375 - acc: 0.6000 - val_loss: 1.4286 - val_acc: 0.5888
Epoch 9/20
215/215 [==============================] - 0s - loss: 0.9987 - acc: 0.6093 - val_loss: 1.3102 - val_acc: 0.5701
Epoch 10/20


서버에서 nvidia-smi를 쳐보면 이렇게 모든 gpu가 모두 활용되는 것을 볼 수 있습니다.




참고


https://www.pyimagesearch.com/2017/10/30/how-to-multi-gpu-training-with-keras-python-and-deep-learning/

반응형
반응형

우분투에 R과 Rstudio Server 설치



1. R 설치

sudo apt-get install r-base



2. R studio 설치


아래 링크에서 보고 따라하면 됨

https://www.rstudio.com/products/rstudio/download-server/


이건 1.1.383 version 기준


sudo apt-get install gdebi-core

wget https://download2.rstudio.org/rstudio-server-1.1.383-amd64.deb

sudo gdebi rstudio-server-1.1.383-amd64.deb



3. 웹브라우저 접속

http://<server-ip>:8787


위 처럼 접속해서 운영체제 아이디/패스워드를 통해 로그인

반응형
반응형


Deconvolution

CNN에서 convolution layer는 convolution을 통해서 feature map의 크기를 줄인다. 하지만 Deconvolution은 이와 반대로 feature map의 크기를 증가시키는 방식으로 동작한다.


Deconvolution은 아래와 같은 방식으로 동작한다.


1 각각의 픽셀 주위에 zero-padding을 추가한다. 

2. 이렇게 padding이된 것에 convolution 연산을 한다.


위 그림에서 아래쪽의 파란색 픽셀이 input 초록색이 output이다. 이 파란색 픽셀 주위로 흰색 zero-padding을 수행하고, 회색 filter를 통해 convolution 연산을 수행하여 초록색 output을 만들어낸다.


Deconvolution은 일반 cnn의 최종 결과물을 다시 반대로 되돌려 input과 같은 사이즈를 만들어내고 싶을 때 쓰인다. 주로 semantic segmentation등에 활용할 수 있다. Deconvolution은 Upsampling 등으로도 불린다.


반응형
반응형

Python - sklearn LabelEncoder, OnehotEncoder 사용


python에서 범주형 변수를 인코딩 하기 위하여 더미변수를 만들거나, one hot encoding을 합니다. 선형회귀 같은 기본적인 통계 모형에서는 더미변수를 많이 쓰지만, 일반적인 머신러닝/딥러닝 접근법에서는 one hot encoding을 많이합니다. one hot encoding을 하기위해서는 직접 함수를 만들어 할 수도 있지만 패키지를 사용하면 편합니다. 가장 편하다고 생각하는 방법이 바로 sklearn 패키지를 통한 one hot encoding 인데요. 예를 들어 아래와 같은 info라는 이름의 pandas dataframe 이 있을 때, class2를 예측변수 y라고 생각하여 one hot encoding 하는 방법을 알아보겠습니다.



id tissue class class2 x y r
0 mdb001 G CIRC B 535 425 197.0
1 mdb002 G CIRC B 522 280 69.0
2 mdb003 D NORM N NaN NaN NaN
3 mdb004 D NORM N NaN NaN NaN
4 mdb005 F CIRC B 477 133 30.0
5 mdb005 F CIRC B 500 168 26.0


Code

from sklearn import preprocessing label_encoder = preprocessing.LabelEncoder() onehot_encoder = preprocessing.OneHotEncoder() train_y = label_encoder.fit_transform(info['class2']) train_y = train_y.reshape(len(train_y), 1) train_y = onehot_encoder.fit_transform(train_y)

LabelEncoder 결과


[0 0 2 2 0 0 2 2 2 2 0 2 0 0 2 0 2 0 2 0 2 0 2 1 2 0 2 2 1 2 0 2 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 0 2 2 2 0 2 2 2 2 2 0 2 2 1 2 2 1 2 2 2 2 0 0 2 0 2 2 2 2 2


OnehotEncoder 결과 - 최종 train_y

(0, 0) 1.0 (1, 0) 1.0 (2, 2) 1.0 (3, 2) 1.0 (4, 0) 1.0 (5, 0) 1.0 (6, 2) 1.0 (7, 2) 1.0 (8, 2) 1.0 (9, 2) 1.0 (10, 0) 1.0 (11, 2) 1.0 (12, 0) 1.0 (13, 0) 1.0

몇 줄 되지 않는 코드로 이처럼 one hot encoding을 구현할 수 있습니다. one hot encoding을 하기 전에 label encoding을 하는 이유는 one hot encoder의 인풋으로 숫자형만 올 수 있기 때문입니다. label encoder의 결과로 문자형 변수가 숫자형 변수 범주형으로 변경되게 되고 이를 one hot encoder에 fit_transform 해주면, 이와 같이 one hot encoding된 결과를 얻을 수 있습니다. 이 때, train_y 변수는 sparse matrix가되어 프린트하면 위와같이 나타납니다. 이는 matrix의 인덱스와 그에 해당하는 value를 나타낸건데 매트릭스에 값을 대입해보면 labelencoder 결과에 onehot encoding이 적용된 것을 확인할 수 있습니다.





반응형

'Tools > Python' 카테고리의 다른 글

Python - SSL 에러 해결  (1) 2018.03.04
Python - Pandas isin 구문  (0) 2018.02.25
Python - 폴더 파일 리스트 가져오기  (4) 2017.10.31
Python - Pandas 변수 정렬하기  (0) 2017.10.24
Python - Pandas 그룹별 평균 구하기  (2) 2017.10.24