반응형

1.


논문링크 : https://arxiv.org/abs/1511.07122


Image Segmentation에 관한 논문이다.  Image Segmentation은 Object detection과 다른점이 여러개가 있는거 같다


Object detection은 boundary box내에 물체가 얼마큼의 확률로 그 물체인지를 구분해내는 문제라고 하면,

Image Segmentation은 픽셀픽셀마다 그 픽셀이 어느물체를 말하는지를 찾는 문제이기 때문이다.

(우리는 이 문제를 dense prediction 이라는 용어를 사용한다)


그래서 좀 더 어렵다(?) 라고 하긴하지만, 현재(2017년 8월)의 기술로는 꽤 성과가 좋다.


이번 시간에는 Multi-Scale Context Aggregation by dilated convolutions 이라는 논문을 통해서

Image Segmentation의 세계로 첫 발을 내딛어 보자






이미지에서 너무나 성능이 좋은 딥러닝 알고리즘. CNN.

그 CNN을 사용해서 여러가지 이미지 문제들을 풀려는 시도가 많았는데, Image Segmentation도 CNN으로 풀수가 있다.

그런데 CNN의 단점은 weight가 너무나 많아서 실제로 사용하기에 성능이 떨어지는 문제가 발생을 한다.

그래서 이 논문에서는 dilated convolution이라는 개념으로 그 문제를 해결을 하는데, 성능도 그만큼 좋다.




기존에 Image classfication 을 위해 디자인된 네트워크에다 segmentation을 하려는 시도가 있었는데, 꽤나 성공적이었다.

그래서 이 네트워크를 좀 더 dense prediction에 맞게 수정을 한다면 성능이 더 좋지 않을까라는 발상으로 이 논문이 시작이 되었다.


dense prediction은 최근에 multi-scale resoning과 full-resolution dense prediction 문제를 풀기 위한 방향으로 진행이 된다

이 논문은 해상도의 손실과 rescaled image를 분석하는 것 없이 multi-scale contextual information을 통합이 가능한 CNN 을 개발했다.

이것을 모듈로 사용이 가능하게 디자인이 되었는데, 입력사이즈와 출력사이즈가 동일하게 구성되어 어느 네트워크에다 붙여도 그것이 가능하게끔 구성을 했다.  이 모듈은 dilated convolution을 사용을 했는데, 이것이 이 논문의 핵심적인 아이디어니깐 제대로 집고 넘어가자


dilated convolutions 는 우리말로 번역을 하면 팽창하는 convolutons이라는 것이다. 기존의 CNN의 filter들이 커질때마다 필터갯수도 늘어나지만 dilated convolution은 파라미터의 갯수는 일정하고 filter의 크기가 늘어난다.

다음의 그림은 논문에 나와있는 그림1 이다.






사진을 보면 맨 왼쪽의 사진은 3x3 필터에다 파라미터가 9개가 존재한다. 그런데 (b)를 보면 파라미터는 9개로 동일하지만 필터의 크기는 7x7로 늘어났다. (c)도 마찬가지이다. 15x15로 필터사이즈는 커졌지만 알아야되는 파라미터는 9개로 동일하다. 늘어난 필터 사이사이는 0으로 채워줘서 크기를 유지해준다. 여기서 우리는 필터가 팽창한다는 느낌을 가질수가 있다. 이를 dilated convolution 이라고 한다. 이렇게 되면 dilated convolution을 사용하면

아무리 이미지가 커져도 학습해야되는 parameter가 같이 커지지를 않기때문에 부담이 사라지는 효과가 있다.



이렇게 dilated convolutions에 대해 알아보았으니

다음은 이 dilated convoltuon이 어떻게 사용이 되는지를 알아보자.


우리가 살펴보는 Multi-Scale Context Aggregation by dilated convolutions에서는 크게 두가지의 network module로 구성이 된다.

Image classification 네트워크를 수정해서 만든 , frond-end module과 그리고 context module이다.


먼저 간단한 front-end module을 살펴보면은 이 module은 VGG-16 network를 dense prediction에 맞게 수정한 것이다.

논문에 의하면 pooling layer를 없애고, 중간 레이어에 있는 padding을 하지 않았다고 나온다.

이 네트워크는 입력으로 컬러이미지를 받으면 아웃풋으로 C=21 인 feature map을 결과값으로 내보낸다.


( 구체적으로, 각각의 풀링 및 스트리딩 레이어는 제거되었고 모든 후속 계층의 변환은 제거된 각 풀 계층에 대해 2배의 계수로 확장되었다.
따라서 최종 계층을 따르는 최종 계층의 변환은 4배의 비율로 확장된다.
이를 통해 원래 분류 네트워크의 매개 변수를 초기화할 수 있지만 분해능이 높은 출력을 생성할 수 있습니다.

프런트 엔드 모듈은 입력된 이미지를 입력하고 분해능 64×64에서 형상 맵을 생성합니다.

반사 패딩을 사용합니다. 버퍼 영역은 각 에지에 대한 이미지를 반영하여 채워집니다.

우리의 프런트 엔드 모듈은 조밀한 예측을 위해 역효과를 내는 분류 네트워크의 흔적을 제거함으로써 얻어진다.

가장 중요한 것은 마지막 두개의 풀링 및 스트라이딩 레이어를 완전히 제거하는 것입니다. 그들과 Chen외에도 박리로 인해 교체되었으나 풀링 된 층을 유지했습니다.

우리는 풀링 계층을 제거함으로써 네트워크를 단순화하는 것이 더 정확하다는 것을 알아냈다.
또한 중간 형상 맵의 패딩을 제거한다.
중간 분류 네트워크는 원래 분류 네트워크에서 사용되었지만, 고밀도 예측에서는 필요하지도 않고 정당화되지도 않았다. )




이렇게 frond-end 네트워크를 구하고 나면, 그 담번에는 context module 이다.


context module의 목적은  다양한 크기의 contextual 정보를 모아서  dense prediction architecture의 성능을 향상시키기 위해서 만들어진것이다.

이 모듈은 C개의 feature map을 input값으로 받고, output을 C개의 feature map으로 생성하기 때문에, 이 모듈은 어느 dense prediction architecture에 사용을 해도 괜찮다.


논문에서는 기본적인 context module을 가지고 설명을 시작한다. 각각의 dilated factor가 다른 7개의 레이어(factor: 1,1,2,4,8,16,1) 와 3x3 convolution을 가진 형태로 시작한다.

그리고 기존의 cnn의 초기화 방법과는 다른방식으로 초기화를 진행을 한다. 왜냐하면 이것들이 생각보다 성능이 좋지 않았기 때문이었다.




a는 featuremap의 인덱스, outputmap의 인덱스는 b. 이 방법은 RNN방법에서 자주 쓰이는 방법이다.

일반적으로 이렇게 초기화를 하면 backpropagation이 잘 안된다고 하는데,

실제로 논문에서 해본바에 따르면 backpropagation이 잘되어서 featureMap의 정확도를 높여준다고 한다.

이렇게 해서 multi-scale Context aggregation을 위한 context module도 완성이 된다.


실제로도 꽤나 좋은 성능을 보이는데, 이 부분은 논문을 참고하면 좋을것 같다.



현재까지 dilated convolution, front-end module, context module 이렇게 해당 논문에서 중요하게 생각하는 것들에 대해

그 개념을 알아보았다. 그런데 명확히 와 닿는 부분이 부족해서

다음 시간에는 코드를 보면서 이에 대한 명확한 것들을 채워나가보자

반응형
반응형

텐서플로우가 업데이트가 되면서 많은것들이 바뀌었습니다.

기본 메서드들의 이름도 바뀌고, 다른 용법들도 많이 바뀌고 있습니다.

너무나 빠른 변화가 느껴집니다.


이번에는 학습 파라미터를 저장하고 그것을 불러오는 코드를 정리해보겠습니다.


1. 먼저 저장할 파라미터를 정합니다.

2. 그것들을 list 형식으로 만들어 줍니다.

3. tf.train.saver(list) 로 텐서플로우에게 이것이 저장할 변수라는 것을 알려줍니다.


>>코드 : 

#Create a saver

param_list = [W_h1, b_h1, W_h2, b_h2, W_o, b_o]

saver = tf.train.Saver(param_list)




4. 학습할때마다 저장을 하도록 합니다.


for i in range(1000):

    _,loss_, acc = sess.run([train,cost, accuracy],feed_dict = tensor_map)

    if i % 100 == 0:

        saver.save(sess,'./tensorflow_live.ckpt')

        print("step: ",i)

        print("loss_: ",loss_)

        print("accuracy: ", acc)

        print("============")



이렇게 해서 텐서플로우의 파라미터들을 저장해서 다음에 불러올 수 있습니다.



그러면 나중에 불러올때는 어떻게 해야될지 알아보겠습니다.


<Parameter restore>



1. 세션을 먼저 열어줍니다. tf.Session()

2. 변수들을 초기화 시켜줍니다. tf.global_variables_initializer()

3. 가져올 파일을 import를 시켜줍니다.  tf.train.import.meta_graph('/파일이름.meta')

   

   텐서플로우가 업데이트 되면서 파라미터들이 meta파일에 저장이 됩니다.

   그것을 불러주면 해결이 됩니다. 


4. 그리고 import한 파일을 restore시킵니다.  new_saver.restore(sess, tf.train.latest_checkpoint('./'))


sess = tf.Session()

sess.run(tf.global_variables_initializer())



new_saver = tf.train.import_meta_graph('tensorflow_live.ckpt.meta')

new_saver.restore(sess, tf.train.latest_checkpoint('./'))





이렇게 하면 파라미터들을 저장하고 다시 읽어 올수가 있습니다.

시간을 이렇게 아껴요!

반응형
반응형

이전에는 텐서플로우를 설치하기 위해서는 리눅스가 필수적이었는데,

이번에 업데이트가 되면서 윈도우에서도 돌아가게 되었습니다.

그래서 컴퓨터를 포멧을 하고, 설치를 다시한 것을 포스팅을 합니다.



1) 텐서플로우 홈페이지에 들어가서 download하는 방법이 적힌곳으로 페이지를 이동 합니다


링크:  https://www.tensorflow.org/get_started/os_setup




아래로 내려가다 보면 window설치를 하는곳이 있는데, 두가지 방법으로 설치가 가능하다고 나옵니다.


아나콘다를 통한 설치와 아나콘다가 없는 파이썬으로 설치입니다.

여기서 중요한것은 3.5버전이여야 된다는 것입니다.

저는 미리 3.6버전을 설치했는데, 지원이 안된다고 해서 다시 아나콘다 버전으로 설치를 하였습니다.



아나콘다 링크로 들어가서 해당 아나콘다를 다운받아 설치를 하였습니다.


그리고 나서 cmd 창에서 텐서플로우를 설치하기 시작합니다.


커맨드 창에 pip install ~~~ 로 시작한 부분을 적어줍니다.

복사 붙여넣기가 되니, 일일히 칠 필요가 없습니다.




그랬더니 왠걸 오류가 나면서 설치가 안되더라구요.


구글링을 해서 찾아보니, 텐서플로우 자체를 다운받아 놓은 상태로 설치를 하면 해결이 가능하다고 하여

직접 다운로드를 하였습니다.


http:ss/~~~~~~~.whl 부분을 인터넷창에 입력하고 엔터를 누르면 다운이 됩니다.


그리고 해당 경로로 이동하여


pip install tensorflow-0.12.1-cp35-cp35m-win_amd64.whl 


을 입력하면 깔끔하게 설치가 되었습니다.


설치가 제대로 되었는지 확인방법은 직접 코드를 입력하면 되겠죠?


cmd창에다 python 이라고 입력 후,


import tensorflow as tf 

라고 코드를 써서 제대로 import가 되는지 확인을 하였습니다






이상이 없는것을 확인을 하였다면 tensorflow가 잘 설치가 된것입니다.

이제 학습을 시키러 가보시죠?^^

반응형
반응형

http://go.ted.com/HJ0Ajw


강화학습에 관한 영상인데,

2007년도에 촬영이 된것이 놀랍다.


난 작년에야 강화학습에 대해 알게되었는데, 10년전부터 이러한 노력이 있었구나...

많이 부족하지만 부지런히 따라가야지.

반응형
반응형

#1. 텐서플로우의 자료형



텐서플로우는 연산을 그래프형태로 처리한다.

그래프가 돌아가는 뭉텅이를 텐서플로우에서 세션(session)이라고 한다.

이런 세션은 디바이스(device,=cpu)에 올라간다.

텐서플로우 자체에서 연산자체를 파이썬단에서 하지 못하게 해놨다.

연산 그래프를 디바이스에 올려서, 연산자체는 C에서 한다.

텐서플로우 API를 자세히 보도록 하자!!



텐서플로우의 데이터형은 총 3가지가 있다.

1) Placeholder

2) Variable

3) Constant



import tensorflow as tf


ph = tf.placeholder(dtype=tf.float32,shape=[3,3])

var = tf.variable([1,2,3,4,5],dtype=tf.float32)

const = tf.constant([10,20,30,40,50],dtype=tf.float32)

sess = tf.Session()

result = sess.run(const)



a = tf.constant([15])

b = tf.constant([10])

c = tf.constant([2])

d = a*b + c

print(d)

sess = tf.Session()

result=sess.run(d)

print(result)




Variable은 weight Parameter를 담아놓는 공간이기때문에, 초기화가 필요한 자료형이다. 초기화 함수가 따로 있다. => tf.initialize_all_variables()


var1 = tf.Variable([5],dtype=tf.float32)

var2 = tf.Variable([3],dtype=tf.float32)

var3 = tf.Variable([2],dtype=tf.float32)

var4 = var1*var2+var3

init= tf.initialize_all_variables()

result=sess.run(var4)

print(result)



-----

Placeholder는 텐서와 그래프를 맵핑시키는 역할을 한다

Placeholder는 인풋데이터를 입력할때 사용한다.


value1 = 5

value2 = 3

value3 = 2


ph1 = tf.placeholder(dtype=tf.float32)

ph2 = tf.placeholder(dtype=tf.float32)
ph3 = tf.placeholder(dtype=tf.float32)


feed_dict = {ph1: value1, ph2:value2, ph3:value3}


result_value = ph1 * ph2 + ph3

sess = tf.Session()

result = sess.run(result_value, feed_dict = feed_dict)

print(result)




------------


image = [1,2,3,4,5]

label = [10,20,30,40,50]

ph_image = tf.placeholder(dtype=tf.float32)

ph_label= tf.placeholder(dtype=tf.float32)

feed_dict = { ph_image:image , ph_label: label }

result_tensor = ph_image + ph_label

sess = tf.Session()

result =  tf.run(result_tensor,feed_dict=feed_dict)

print(result)



반응형

+ Recent posts