<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>terry_9996.log</title>
        <link>https://velog.io/</link>
        <description>행복을 찾아서(크리스 가드너)</description>
        <lastBuildDate>Mon, 18 Mar 2024 12:43:31 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>terry_9996.log</title>
            <url>https://images.velog.io/images/terry_9996/profile/778fc3bb-ce63-42d7-b831-417a3ad4c209/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. terry_9996.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/terry_9996" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[mecab]]></title>
            <link>https://velog.io/@terry_9996/mecab</link>
            <guid>https://velog.io/@terry_9996/mecab</guid>
            <pubDate>Mon, 18 Mar 2024 12:43:31 GMT</pubDate>
            <description><![CDATA[<p>mecab 사용하기</p>
<p>######################</p>
<pre><code>apt-get install --upgrade
apt install sudo
sudo apt-get update
sudo apt-get install g++
apt -y install gcc
sudo apt-get install make
pip install jamo
pip install koeda</code></pre><p>#############</p>
<ol>
<li><p>mecab-0.996-ko-0.9.2 폴더 만들기</p>
<pre><code>wget https://bitbucket.org/eunjeon/mecab-ko/downloads/mecab-0.996-ko-0.9.2.tar.gz
tar xvfz mecab-0.996-ko-0.9.2.tar.gz
cd mecab-0.996-ko-0.9.2
apt-get install openjdk-8-jdk python-dev python3-dev
./configure
make
make check
sudo make install</code></pre></li>
<li><p>mecab-0.996-ko-0.9.2.tar 폴더안에 / mecab-ko-dic-2.1.1-20180720 폴더 만들기</p>
</li>
</ol>
<pre><code>wget https://bitbucket.org/eunjeon/mecab-ko-dic/downloads/mecab-ko-dic-2.1.1-20180720.tar.gz
tar xvfz mecab-ko-dic-2.1.1-20180720.tar.gz
cd .mecab-0.996-ko-0.9.2/mecab-ko-dic-2.1.1-20180720/
./configure
make
sudo apt-get install g++ openjdk-8-jdk python3-dev python3-pip curl
6 # asia
69 # seoul
bash &lt;(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)
sudo make install
sudo pip3 install konlpy
pip install mecab-python
bash autogen.sh
make
sudo make install
bash tools/add-userdic.sh</code></pre><ol start="3">
<li>user-dic 경로 복사하기 </li>
</ol>
<pre><code># tmp 경로에 저장된 사용자 사전 명사에 새로운 단어 추가
pwd
/data/ephemeral/home/EDA/mecab-0.996-ko-0.9.2/mecab-ko-dic-2.1.1-20180720/user-dic/nnp.csv

with open(&#39;/data/ephemeral/home/EDA/mecab-0.996-ko-0.9.2/mecab-ko-dic-2.1.1-20180720/user-dic/nnp.csv&#39;, &quot;r&quot;, encoding=&#39;utf-8&#39;) as f:
  user_dict = f.readlines()</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Natural Language Processing Basic-1]]></title>
            <link>https://velog.io/@terry_9996/Natural-Language-Processing-Basic-1</link>
            <guid>https://velog.io/@terry_9996/Natural-Language-Processing-Basic-1</guid>
            <pubDate>Mon, 04 Mar 2024 04:25:49 GMT</pubDate>
            <description><![CDATA[<h1 id="텍스트-전처리">텍스트 전처리</h1>
<p>텍스트 전처리란 ?</p>
<ul>
<li>데이터 분석 단계
(데이터 - 목표데이터 - 전처리된 데이터 - 변환된 데이터 - 패턴 - 지식)
컴퓨터가 텍스트를 이해할 수 있도록 하는 방법.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/d0189318-ec90-488b-8068-bb42e2aa5340/image.png" alt=""></p>
<h1 id="데이터-전처리-방법">데이터 전처리 방법</h1>
<ul>
<li><p>HTML 태그, 특수문자, 이모티콘</p>
</li>
<li><p>정규표현식</p>
</li>
<li><p>불용어(Stopword)</p>
</li>
<li><p>어간추출(Stemming) 실질적의미만 남김.</p>
</li>
<li><p>표제어추출(Lemmatizing) 어원복원.</p>
</li>
<li><p>문서 -&gt; 토큰화 -&gt; 텍스트 전처리 -&gt; 단어주머니</p>
</li>
</ul>
<h2 id="토큰화">토큰화</h2>
<ul>
<li>주어진 데이터를 토큰단위로 나눈 작업</li>
<li>토큰의 기준(어절, 단어, 형태소(의미를 가진 가장 작은 단위), 음절, 자소 등등.)</li>
<li>Character-based, Word-based, Subword-based</li>
</ul>
<h3 id="고려사항">고려사항</h3>
<ul>
<li>구두점이나 특수문자를 단순 제외</li>
<li>줄임말(we&#39;re -&gt; we are)과 단어 내 띄어쓰기(rock n roll --한 단어임)</li>
<li>문장 토큰화 : 단순 마침표를 기준으로 자를 수 없음.
(서버에 들어가서 메일 결과 보내줘. 그러고나서 저녁먹자.) -&gt; 이어지는 문장임.</li>
</ul>
<h3 id="한국어-토큰화의-어려움----형태소-단위의-토큰화-필요">한국어 토큰화의 어려움 --&gt; 형태소 단위의 토큰화 필요</h3>
<ul>
<li>영어는 합성어(New york)이나 줄임말(He&#39;s)에 대한 예외처리만 하면 띄어쓰기의 토큰화가 잘 작동함.</li>
<li>하지만, 한국어는 조사가 존재하므로(그가, 그는, 그를, 그에게 등등.) 같은 단어임에도, 각기 다른 조사가 붙어 서로 다른 단어로 인식하게 됨.</li>
<li>추가로, 한국어는 띄어쓰기를 하지 않아도 의미가 전달이 됨.(ex, 이렇게해도한국어볼수있어요) </li>
<li>토큰화, morphs(형태소추출), pos(품사태깅), nouns(명사추출)
<img src="https://velog.velcdn.com/images/terry_9996/post/94e8957b-5649-4a32-9f2e-802aa283e974/image.png" alt=""></li>
</ul>
<p>각 모듈(okt, kkma, komoran)마다 형태소 토큰화가 서로 다르게 작동 -&gt; 성능 차이. </p>
<h1 id="텍스트-정제">텍스트 정제</h1>
<ul>
<li>의미가 없는 부분의 텍스트, 노이즈를 제거하는 작업</li>
<li>특수문자, 아무 의미없는 글자, 혹은 분석하고자 할 목적에 적합하지 않은 단어</li>
<li>정규표현식, 파이썬 내장함수로 제거</li>
<li>불용어, 특수문자, 대-소문자 통합, 중복 문구 제거, 다중 공백 통일</li>
</ul>
<h2 id="불용어">불용어</h2>
<ul>
<li>분석에 큰 의미가 없는 단어, 실질적 의미를 갖지 않는 용어</li>
<li>전처리 시 불용어로 취급할 대상을 정의하는 작업이 필요함. </li>
</ul>
<h2 id="정규화">정규화</h2>
<ul>
<li><p>Stemming(어간추출) 
실질적 의미의 단어만 추출하는 것. 단순하고, 빠르고
어형이 변형된 단어로부터 접사 등을 제거하여, 단어의 어간을 분리함.
포터 스태머 알고리즘
(formalize -&gt; formal / allowance -&gt; allow / ate, will eat -&gt; eat)</p>
<blockquote>
<ul>
<li>어간, 단어의 의미를 담고 있는 단어의 핵심부분</li>
<li>접사, 단어에 추가적인 의미를 주는 부분</li>
</ul>
</blockquote>
</li>
<li><p>Lemmatization(표제어추출)
어원의 복원이 이루어짐. 정확하고, 느리고
품사 정보가 보존된 형태의 기본형으로 변환
cats -&gt; cat(어간) + s(접사)
dies -&gt; die
has -&gt; have</p>
</li>
</ul>
<h2 id="편집거리-edit-distance">편집거리 (Edit Distance)</h2>
<h3 id="1-levenshtein-distance거리-낮을수록-유사-문자열">1. Levenshtein distance(거리 낮을수록 유사 문자열)</h3>
<ul>
<li>하나의 string s1을 s2로 변환하는 최소 횟수를 두 string간의 거리,</li>
<li>string변화하기 위한 3가지 분류 (delete, insert, substitution)<h4 id="delete">delete</h4>
</li>
<li>&lt;점심을 먹자&gt; -&gt; &lt;점심먹자&gt;로 바꾸기 위해선 &quot;을&quot; 제거.</li>
</ul>
<h4 id="insert">insert</h4>
<ul>
<li>&lt;점심먹자&gt; -&gt; &lt;점심을 먹자&gt;로 바뀌기 위해선 &quot;을&quot;삽입.</li>
</ul>
<h4 id="substitution">substitution</h4>
<ul>
<li>&lt;점심먹자&gt; -&gt; &lt;점심먹장&gt;로 바뀌기 위해선 &quot;장&quot;으로 치환.</li>
</ul>
<h2 id="정규표현식regex">정규표현식(Regex)</h2>
<ul>
<li>특정 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식언어.</li>
<li>원하는 규칙에 해당하는 문자(제거, 유지, 규칙에 맞는 문자열 반환)
<img src="https://velog.velcdn.com/images/terry_9996/post/a3ef18af-095b-4fd2-a701-25d867ee31c2/image.png" alt="">
<img src="https://velog.velcdn.com/images/terry_9996/post/16b862bb-6945-4335-9400-6d65ebe1048f/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Generation - 5(확산모델) DPM]]></title>
            <link>https://velog.io/@terry_9996/Generation-5%ED%99%95%EC%82%B0%EB%AA%A8%EB%8D%B8-DPM</link>
            <guid>https://velog.io/@terry_9996/Generation-5%ED%99%95%EC%82%B0%EB%AA%A8%EB%8D%B8-DPM</guid>
            <pubDate>Tue, 27 Feb 2024 09:36:00 GMT</pubDate>
            <description><![CDATA[<h1 id="확산확률모델">확산확률모델</h1>
<p>Diffusion Probabilistic Model</p>
<hr>
<p>확산 현상</p>
<ul>
<li>물질(픽셀값)이 섞이고 번져가다가 마지막에는 균일한 농도(노이즈)가 되는 현상임.</li>
</ul>
<p>확산현상을 시간에 따라 확률적 모델리으로, 마르코프 체인(미래는 과거가 아닌 현재에만 의존함)</p>
<h2 id="1-dpm의-구조">1. DPM의 구조</h2>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/b908d411-5646-4633-9743-b1f978825c52/image.png" alt=""></p>
<ul>
<li>정방향확산 : 데이터 -&gt; 노이즈 (고정)</li>
<li>역방향확산 : 데이터 &lt;- 노이즈 (학습)</li>
</ul>
<p>완전 노이즈는 정규분포를 따르게 됨. ($X_T$)
완전 노이즈로부터 역방향으로 물감을 빼주는 과정</p>
<h2 id="2-정방향-확산">2. 정방향 확산</h2>
<ul>
<li>이미지의 파괴 과정으로 T=1000 시점동안 노이즈를 점진적으로 계속 주입함. (정규분포를 따르도록)
시간에 따라 노이즈의 파라미터 $\beta$의 값을 0.0001 -&gt; 0.02로 증가하도록 정함. </li>
</ul>
<h2 id="3-역방향-확산">3. 역방향 확산</h2>
<ul>
<li><p>이미지의 생성 과정 = 노이즈를 제거하는 과정으로 계산이 불가함. (모든 데이터를 고려해야함)
여기서 만약 $\beta$ (노이즈) 작을때 정규분포로 근사 가능. (열 확산 연구로 도출되었음)</p>
</li>
<li><p>다시말해, 정규분포 근사를 통해서, 매 시점마다 정규분포 형태를 가지며 이는 정방향 확산과 유사함. </p>
</li>
</ul>
<h2 id="4-손실함수">4. 손실함수</h2>
<ul>
<li>VAE와 유사하게 log 가능도의 하한을 최대화 하는 것임.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/bf9cb82c-ac2e-4a12-b1c8-e0a3eb1169d4/image.png" alt=""></p>
<ul>
<li>정방향 확산이 이루어지는 가 ? </li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/bb303730-5877-423f-a78c-bdb4460fa67a/image.png" alt=""></p>
<p>위 수식에서 처럼 표준 정규분포를 따르기에 쿨백-라이블러의 계산이 이루어짐.</p>
<ul>
<li>역방향 확산, 재구성이 잘 되는 것인가 ?
<img src="https://velog.velcdn.com/images/terry_9996/post/41d9dcf4-5f9a-4321-9318-352470bbcbfe/image.png" alt=""></li>
</ul>
<p>노이즈가 있는 곳에서 다시 원본으로 돌아올 수 있는 지를 봄.</p>
<ul>
<li>t시점의 노이즈를 모델이 제대로 제거하였는 가?
<img src="https://velog.velcdn.com/images/terry_9996/post/f3b57703-1398-4379-bb83-d10d2066b5f8/image.png" alt=""></li>
</ul>
<p>수식으로 나타나게 되면, 2개의 정규분포에서의 계산은 분산은 동일하므로
<img src="https://velog.velcdn.com/images/terry_9996/post/0de0ab54-9b55-4458-a55b-7004e1aa3016/image.png" alt=""></p>
<p>다음과 같이 Mean의 값의 MSE로 표현되게 됨. </p>
<h2 id="5-vae와-차이점">5. VAE와 차이점</h2>
<ul>
<li><p>잠재변수의 차원이 모두 데이터의 차원과 동일하며, 여러 단계의 잠재변수(노이즈를 더하는 step에 따라 점진적($\beta$의 값)으로 달라짐)를 가짐. </p>
</li>
<li><p>디코더를 모든 시점에서 공유되며, 인코더는 학습되지 않음 </p>
</li>
</ul>
<hr>
<h1 id="디노이징-확산확률모델---ddpm">디노이징 확산확률모델 - DDPM</h1>
<h2 id="손실함수">손실함수</h2>
<ul>
<li><p>데이터를 예측하는 것보다 노이즈를 예측할 때, 더 좋은 성능을 보이는 점을 이용함. </p>
</li>
<li><p>손실함수를 간단한 형태로 정리함. 
<img src="https://velog.velcdn.com/images/terry_9996/post/6921820e-64c8-4dd9-acc9-703ed1941a01/image.png" alt=""></p>
</li>
<li><p>기존에는 특정 시점의 평균을 구하고, 쿨백-라이블러를 이용하였음. 
디노이징의 경우, $L_T$; 첫번째 항을 0이 되도록 $\beta_t$를 설정하였음. 
기존에는 다 더해서 표준정규분포가 되도록 하였지만, 랜덤하게 더하여도 표준정규분포가 되도록 하였음. </p>
</li>
<li><p>$L_{t-1}$에서 상수 제거함. 분산으로 나누는 것을 서로다른 가중치를 주는 것으로 대체하였음. </p>
</li>
</ul>
<h2 id="ddpm의-한계점">DDPM의 한계점</h2>
<ul>
<li>느린 생성 과정 </li>
<li>조건부 생성 불가, (품질 precision, 다양성 recall)</li>
</ul>
<p>생성 모델의 3요소 </p>
<ul>
<li>높은 품질 ---- GAN, DPM</li>
<li>빠른 샘플 --- GAN, VAE</li>
<li>다양한 샘플 --- VAE, DPM</li>
</ul>
<h1 id="ddim">DDIM</h1>
<ul>
<li>T = 1000보다 적은 시점을 거쳐서 데이터를 생성할 수 있을까 ?
마르코프 체인 가정을 없앴음. -&gt; 즉 1000번 다 되어야 알 수 있던 한계를 제거하기 위함임.</li>
</ul>
<p>기존
<img src="https://velog.velcdn.com/images/terry_9996/post/f1012d3f-24ea-4fdd-9276-370c16b85434/image.png" alt=""></p>
<p>샘플링 과정에서 마르코프 체인은 $x_{t-1}$의 상태는 노이즈가 덜 낀 상태임. </p>
<ul>
<li>따라서, 마르코프 체인을 가정하지 않고서, 학습딘 모델의 일부 시점만 거쳐 데이터 생성하여 생성 속도를 개선하려고 함. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/e6529c72-dc73-4c68-a5ea-6ee8fbe46742/image.png" alt=""></p>
<p>위의 수식으로 정리가 가능하며, x0는 첫번째항과 동치라 볼 수 있으며,
두번째 항은 x0에다가 노이즈를 추가한 것이다. </p>
<hr>
<h1 id="ddg">DDG</h1>
<ul>
<li>기존 DDPM의 핵심은 노이즈가 작을때는 정규분포로 근사 가능하다는 것이었는데 만약 노이즈가 크다면 시점이 0에 가까울수록 디노이징 분포가 정규분포보다 복잡해지게 되며
이를 해결하기 위해 적은 시점을 사용하기 위하여 조건부 GAN을 활용함. </li>
</ul>
<hr>
<h1 id="잠재확산-모델-ldpm-ldm">잠재확산 모델 (LDPM, LDM)</h1>
<ul>
<li>기존의 고해상도 이미지 생성 분야에서의 문제는 많은 양의 계산 자원을 필요하게 됨.</li>
</ul>
<h2 id="1-픽셀공간에서-잠재공간">1. 픽셀공간에서 잠재공간</h2>
<ul>
<li>기존의 확산 모델들은 고차원 이미지 공간에서 연산을 반복함.</li>
<li>이미지의 정보를 유지한채로, 차원을 축소한다면 계산 복잡도를 감소 시킬 수 있음.</li>
</ul>
<p>인지적 압축 </p>
<ul>
<li>과도한 세부 사항을 제거하여, 핵심적인 특징을 잠재표현으로 요약</li>
</ul>
<p>의미적 압축</p>
<ul>
<li>데이터의 의미적, 구조적 특징을 학습</li>
</ul>
<h3 id="1-방법">1. 방법</h3>
<ul>
<li>입력 이미지를 인코더를 통해 축소시키고, 모델을 학습한 뒤 다시 디코더로 재건함. </li>
<li>적대적 오토 인코더 활용함. </li>
</ul>
<p>Stable Diffusion - 과도한 세부 사항들을 제거한 것. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Generation - 4(GANs)]]></title>
            <link>https://velog.io/@terry_9996/Generation-4GANs</link>
            <guid>https://velog.io/@terry_9996/Generation-4GANs</guid>
            <pubDate>Tue, 27 Feb 2024 08:11:15 GMT</pubDate>
            <description><![CDATA[<h1 id="적대적-생성-신경망">적대적 생성 신경망</h1>
<p>VAE의 생성방식 : 입력 분포를 근사하는 과정에서 규제을 주며 데이터를 생성
GANs의 생성방식 : 생성된 데이터와 실제 데이터를 판별하고 속이는 과정을 거치며 생성 모델 개선</p>
<h2 id="1-gans-구조">1. GANs 구조</h2>
<ul>
<li>데이터를 생성하는 생성모델과 데이터의 진위를 구별하는 판별모델</li>
<li>생성모델 : 임의의 노이즈를 입력으로 받아 생성된 데이터를 출력함. </li>
<li>판별모델 : 생성된 데이터를 입력으로 받아 실제 데이터인지 생성된 데이터인지를 출력함.</li>
</ul>
<h2 id="2-학습-과정">2. 학습 과정</h2>
<ul>
<li>임의의 초기 분포로부터 생성 모델이 데이터를 생성</li>
<li>판별 모델이 분류; 판별 모델 갱신</li>
<li>갱신된 판별 모델을 고정; 생성 모델 갱신</li>
<li>반복 과정을 거쳐 생성 모델은 판별 모델이 구별할 수 없는 수준의 데이터를 생성함. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/9383cf2a-9c5b-4995-aa32-ebb472229cfa/image.png" alt=""></p>
<p>점차적으로 초록색 실선이 검정 점선으로 들어가게 되며, 파란색 점선이 top은 진짜로 bottom은 가짜로 판별 중이다. a - b - c - d로 가면서, 초록색 실선(생성자)의 방향은 파란색 점선(판별자)을 통해 학습하며 생성자는 초록색의 형태와 위치를 판별자에게서 1에 가깝게 판별하도록 학습하는 방식임. 생성자가 검정 점선에 일치하게 되면, 판별자는 더 판별되도록 학습하는 식임. </p>
<ul>
<li>검정색 점선 : 입력 데이터의 분포</li>
<li>파란색 점선 : 판별 모델의 예측</li>
<li>초록색 실선 : 생성 모델의 분포</li>
</ul>
<h2 id="3-목적함수">3. 목적함수</h2>
<h3 id="판별-모델">판별 모델</h3>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/fd8ca83d-fec0-405e-a82c-14a4a9592b29/image.png" alt=""></p>
<ul>
<li>판별 모델 : 실제 데이터와 생성된 데이터를 정확하게 구별해야 하므로, 목적함수를 최대화함.</li>
<li>0과 1사이로 하기 위해 시그모이드를 사용함. </li>
</ul>
<h3 id="생성-모델">생성 모델</h3>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/fe4b6b2b-11fb-4264-8804-65d5fc488fc2/image.png" alt=""></p>
<ul>
<li>생성 모델 : 실제와 유사한 데이터를 생성하여 판별자를 속이므로, 목적함수를 최소화함. </li>
</ul>
<h2 id="4-최적값">4. 최적값</h2>
<p>목적함수는 생성 데이터 분포와 실제 데이터 분포가 동일한 $p_g = p_data$에서 최적임.</p>
<ul>
<li><img src="https://velog.velcdn.com/images/terry_9996/post/de34a0a7-5d90-4cf7-9ccc-cc39e9df8a04/image.png" alt="">
이는 -log 4로 수렴하게 됨. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/ec58055d-c86c-4f0b-a9af-35db6eecf48b/image.png" alt="">
이는 기울기 학습을 의미함. </p>
<p>현재 이 목적함수는 실제로 잘 동작이 안되는 문제점이 있음 -&gt; 즉 기울기가 학습이 필요한 구간에서 더 평평한 기울기를 가지게 되어 backpropagation시에 더 약한 신호로 전달이 된다는 문제.
<img src="https://velog.velcdn.com/images/terry_9996/post/08e71efc-51c4-4a16-92e5-76f6f1ed5401/image.png" alt=""></p>
<p>이를 해결하기 위해</p>
<h3 id="1-최적값-해결">1. 최적값 해결</h3>
<ul>
<li>판별 모델의 기울기를 조정하면 학습이 잘 이루어질 것은 즉 평평한 기울기를 가파르게 만드는 것으로 
생성자 기준에서 
판별 모델이 정답을 맞출 가능성을 최소화하는 것 대신, 틀릴 가능성을 최대화함. </li>
</ul>
<p>기존 생성 모델의 기울기 하강 수식
<img src="https://velog.velcdn.com/images/terry_9996/post/5b878233-34cc-4490-ac43-eb000b97a1e4/image.png" alt=""></p>
<p>개선된 생성 모델의 기울기 상승
<img src="https://velog.velcdn.com/images/terry_9996/post/17c22036-9ee5-4b35-9467-2b7b4184f23e/image.png" alt=""></p>
<h3 id="2-문제점">2. 문제점</h3>
<ul>
<li>모드 붕괴 현상으로 판별 모델을 속일 수 있는 일부 데이터만을 계속해서 생성하는 현상</li>
<li>이러한 문제를 해결하기 위해 목적함수를 다양한 손실함수로 일반화한 것이 f-GANs 논문</li>
</ul>
<hr>
<h1 id="조건부-생성-모델">조건부 생성 모델</h1>
<ul>
<li><p>일반 생성 모델의 한계로 임의의 잠재 벡터로부터 데이터를 생성하기에 데이터를 잘 생성하지만, 그들의 의미는 제어할 수 없음.</p>
</li>
<li><p>따라서, 조건부 생성 모델의 필요로 생성 데이터의 의미 제어 방법을 통해 데이터 증강, 영상 편집등에 활용될 수 있으며, 특정 숫자만 생성 불가했던 기존 GANs에서 특정 숫자만 생성 가능하도록 할 수 있게 됨.</p>
</li>
</ul>
<h2 id="1-조건부-생성-모델">1. 조건부 생성 모델</h2>
<ul>
<li>임의의 잠재벡터 + 조건 정보를 추가하여 데이터를 생성함. 
<img src="https://velog.velcdn.com/images/terry_9996/post/855f5ba6-9b0b-41ca-bbd9-f6dd0a9f101d/image.png" alt="">
숫자 0을 생성하기 위한, 구체적인 조건부 벡터를 추가하여 데이터를 생성하는 식임. </li>
</ul>
<h2 id="2-목적-함수">2. 목적 함수</h2>
<ul>
<li>생성 모델에 입력되는 잠재벡터와 판별 모델에 입력되는 조건부 벡터가 추가된 형태임.</li>
<li>판별 모델이 입력받은 데이터가 실제 데이터와 유사하더라도 입력된 조건을 만족하지 않으면 0을 출력</li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/80422d8f-1711-4cc4-9b96-e498b39c223b/image.png" alt=""></p>
<hr>
<h1 id="조건부-생성-모델을-활용한-다양한-영상-조작">조건부 생성 모델을 활용한 다양한 영상 조작</h1>
<ul>
<li>이미지를 입력받아 원하는 이미지를 출력하는 것</li>
<li>조건부 생성 모델을 이용하여 원하는 이미지를 생성하는 방법들이 주로 이뤄짐.</li>
</ul>
<h2 id="이미지대-이미지-변환--전통적-접근">이미지대 이미지 변환 : 전통적 접근</h2>
<ul>
<li><p>색상변환, 낮과 밤의 변환, 스케치 채색등의 변환
조건부 GANs 이전에는 각 task별 모델과 손실함수를 각각 정의해야 함.</p>
</li>
<li><p>주어진 이미지를 회귀 모델을 통해 변환후, 타겟 이미지와 손실을 계산하여 개선하는 방식으로 L1손실 L2손실을 주로 활용함. 
이는 사실 변환된 이미지를 생성하는 것인 아닌, 회귀 모델로 픽셀값을 예측하는 것으로 흐릿한 이미지가 만들어진다는 단점(평균, median 값을 예측하는데 한계가)이 있음.</p>
</li>
</ul>
<h2 id="pix2pix">Pix2Pix</h2>
<ul>
<li>쌍이 있는 이미지 변환 기술</li>
<li>이미지 쌍이 있는 조건부 생성 모델 기반의 이미지 대 이미지 변환 프레임워크를 제안함.</li>
<li>이미지를 특성별로 회귀 모형을 만드는 것이 아니라, 생성 모델이 변환된 이미지를 생성하는 것으로 변경.</li>
</ul>
<h3 id="1-생성-모델">1. 생성 모델</h3>
<ul>
<li>Pix2Pix의 생성 모델은 U-Net 기반의 생성 모델을 활용함. (더 좋은 이미지를 생성하게 됨)</li>
<li>인코더-디코더 구조에 skip connection을 추가하여, 이미지대 이미지 변환에서는 영상 세부 사항을 잘 유지하도록 하였음. 
<img src="https://velog.velcdn.com/images/terry_9996/post/b6ea4d9d-3e02-48bb-a031-7f8d9f4fc677/image.png" alt=""></li>
</ul>
<h3 id="2-판별-모델">2. 판별 모델</h3>
<ul>
<li>저해상도 모델에 더 적합하므로, 고해상도를 위한 패치 기반의 판별 모델을 통해 PatchGANs의 판별 모델 구조를 활용함. </li>
</ul>
<h3 id="3-손실함수">3. 손실함수</h3>
<ul>
<li>조건부 GANs의 손실함수 + 원본 이미지와의 유사성을 위한 L1정규화 항(정규화를 통해 더 잘 생성됨)을 추가함. 
<img src="https://velog.velcdn.com/images/terry_9996/post/5d8c2eab-4c28-46c4-8131-537a09a46913/image.png" alt=""></li>
</ul>
<h3 id="4-한계점">4. 한계점</h3>
<ul>
<li>데이터가 반드시 쌍으로 존재해야함, 데이터 확보가 어려워, 같은 위치의 다른계절, 같은 위치와 같은 자세이어야 한다는 점. </li>
</ul>
<h2 id="cyclegan">CycleGAN</h2>
<ul>
<li>기존 데이터의 쌍이 없는 데이터 셋이 훨씬 많기에 쌍이 없는 이미지 변환 기술임. </li>
<li>상호 변환이 가능하다는 것; 한국어 -&gt; 영어 변환이 가능하다면, 영어 -&gt; 한국어 변환도 가능해야함. </li>
<li>즉, 입력 이미지로 복원 가능한 정도까지만 이미지를 변환하도록 하여 원본 손실을 최소화함. 
<img src="https://velog.velcdn.com/images/terry_9996/post/82c34dc9-4397-4097-9620-2712b62b5d95/image.png" alt=""></li>
</ul>
<h3 id="손실함수">손실함수</h3>
<ul>
<li>실제 이미지와 생성된 이미지의 도메인이 동일하게 하는 손실함수를 활용함. </li>
<li>2개의 GAN모델이 필요함 즉, 4개의 네트워크(생성자 2, 판별자 2)</li>
</ul>
<ol>
<li>얼룩말(x) -&gt; 말($\hat{x}$) ---&gt; G (생성자 1), $D_y$ (판별자 1)</li>
<li>말(y) -&gt; 얼룩말 ($\hat{y}$) ---&gt; F (생성자 2), $D_x$ (판별자 2)</li>
</ol>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/e7d8c7fd-38c0-4c23-9ad9-606323531489/image.png" alt=""></p>
<ul>
<li>위의 수식처럼 GAN손실함수는 적용할 수 있음. F(생성자 2)에 대한 minmax에서는 $log D_x(x)$로, 그 오른쪽 항은 $log(1-D_x(G(y)))$로 변환됨.</li>
</ul>
<p>추가로 Cycle Consistency를 위한 $L_1$ 정규화 기반의 손실함수를 추가해야 함.
<img src="https://velog.velcdn.com/images/terry_9996/post/da6acb0a-1cee-4b52-bb73-b2a873f70416/image.png" alt=""></p>
<ul>
<li>말 -&gt; 얼룩말 -&gt; 다시 말로 변환은 동일해야 함.
즉, y를 F를 통해 x로 만들고, 이를 다시 G($\hat{x}$)가 y가 되어야 함.  </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Generation - 3(오토인코더, VAE, VQVAE)]]></title>
            <link>https://velog.io/@terry_9996/Generation-3%EC%98%A4%ED%86%A0%EC%9D%B8%EC%BD%94%EB%8D%94</link>
            <guid>https://velog.io/@terry_9996/Generation-3%EC%98%A4%ED%86%A0%EC%9D%B8%EC%BD%94%EB%8D%94</guid>
            <pubDate>Tue, 27 Feb 2024 04:32:00 GMT</pubDate>
            <description><![CDATA[<h1 id="오토-인코더의-이해---잠재표현">오토 인코더의 이해 - 잠재표현</h1>
<ul>
<li><p>오토인코더는 새로운 데이터를 생성하기 보다는 비지도학습을 통한 특징추출을 하는 방법. </p>
</li>
<li><p>인코딩을 진행해준다. (용량 줄이기, 변환 해주기, 입력 데이터를 받아 N차원으로 데이터 변환후 입력 데이터와 동일한 차원으로 다시 복원하는 과정임.) N차원은 차원축소로 볼 수 있음. </p>
</li>
<li><p>N차원(low - 차원)을 잠재표현(= latent표현, = mapping)라 표현한다.</p>
</li>
</ul>
<h2 id="1-디노이징-오토인코더">1. 디노이징 오토인코더</h2>
<ul>
<li>입력 데이터에 랜덤한 노이즈를 주입, 혹은 Droput 레이러를 적용하여, 노이즈가 없는 원래 데이터로 재구성하는 것. </li>
<li>노이즈가 끼인 것을 깔끔한 이미지로 적용하도록 하는 것을 의미하게 된다. </li>
<li>안개 속에서 멀리 있는 물체를 구별하려면 -&gt; 데이터의 특성들을 더욱 정확한 학습함. </li>
<li>노이즈에 강건한 latent표현</li>
</ul>
<h2 id="2-오토-인코더의-활용">2. 오토 인코더의 활용</h2>
<ul>
<li>특성추출, 이상치 탐지</li>
</ul>
<h3 id="1-특성-추출기로의-활용">1. 특성 추출기로의 활용</h3>
<ul>
<li>학습한 오토 인코더의 인코더 부분을 특징 추출기로 활용.</li>
<li>latent표현으로 분류, 클러스터링 문제 해결.</li>
<li>레이블(클래스)없이도 분류가 가능하다는 점의 장점.</li>
</ul>
<h3 id="2-이상치-탐지">2. 이상치 탐지</h3>
<ul>
<li>이상치는 재구성시, 평균제곱오차가 크게 나올 것으로 특정 임계치(Threshold)를 넘으면 이상치로 판단함. </li>
</ul>
<hr>
<h1 id="변분-오토-인코더의-이해---잠재변수">변분 오토 인코더의 이해 - 잠재변수</h1>
<ul>
<li>오토 인코더와 마찬가지로 인코더와 디코더를 가지는 생성 모델</li>
<li>데이터는 저차원의 잠재변수로부터 생성되며, 이때 잠재변수(z)가 표준정규분포를 따른다고 가정을 가지게 됨. </li>
<li>오토 인코더와 변분 오토 인코더의 차이는 잠재표현과 잠재변수의 차이가 발생한다. 잠재변수는 잠재표현의 고정된 것이 아니라 특정 확률 분포를 가진다는 차이가 발생한다.</li>
<li>이는 우리가 인코더 x로부터 나온 z(잠재변수)인 정규분포(mean 0,0으로부터 분산 1)로부터 디코더를 통해서 아웃풋 x&#39;의 분포를 &quot;원하는&quot;분포로 변환할 수 있다는 것이다. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/4775495c-8a4a-4987-9a51-b93dfaba63d7/image.png" alt=""></p>
<ul>
<li>이처럼 우리는 잠재표현이 표준정규분포를 따르는 가우시안 분포를 따르게 된다는 점에 차이가 발생한다. </li>
</ul>
<h2 id="변분-오토-인코더의-학습">변분 오토 인코더의 학습</h2>
<ul>
<li>ELBO</li>
<li>미분계산이 가능하도록 해주는 재매개변수</li>
</ul>
<p>입력을 표준정규분포를 따르도록 잠재변수로 만드는데, 이는 강제적으로 각 특징(잠재표현)을 특정 확률 분포로 만드는 것을 의미한다. 이는 평균과 분산을 알고 있으며, 가우시안을 따르도록 만들게
된다. <strong>데이터의 평균은 고정된 상태에서, 분산에 따라 데이터를 샘플링을 진행하게 된다면 분산에 따른 데이터를 생성하게 된다는 것</strong></p>
<h3 id="1-elboevidence-of-lower-bound">1. ELBO(Evidence of Lower BOund)</h3>
<ul>
<li><p>현재 우리가 알고싶은것은 p(x)으로 데이터 분포 자체는 알고 싶지만, 직접 계산하는 것이 불가능하다. 따라서 주어진 데이터를 기준으로 우리가 알아내고 싶은 p(x)는 &quot;현재 데이터를 잘 설명하는 분포&quot;를 의미함. </p>
</li>
<li><p>예시) 동전 앞면이 나올 확률을 알아내고 싶다면, 앞7 뒤3 --&gt; 현재 우리가 가진 데이터(관측)에 따라 동전의 앞면이 나올 확률 $\theta$는 현재 모델이 우리가 가진 현상을 얼마나 잘 설명하는 가능도(Likelihood)를 통해 직접 계산은 어려우니, 간접적인 계산으로 최대화 하는 것이다. </p>
</li>
<li><p>수식 1
<img src="https://velog.velcdn.com/images/terry_9996/post/b9100ff8-e61d-42fb-b91a-795114191ac6/image.png" alt=""></p>
</li>
<li><p>수식 1에서 p(x)에 log를 하여 3개의 항으로 표현할 수 있다. 여기서 마지막 항은 쿨백-라이블러 발산 $\geq$ 0, 발산은 0보다 크거나 같아야 함으로 계산이 불가함(사후 분포로, 이는 실제 데이터 분포가 주어졌을때, 그것이 정규분포로 표현되었는 지까진 알수가 없음.)</p>
</li>
<li><p>수식 2
<img src="https://velog.velcdn.com/images/terry_9996/post/e130d185-20df-4904-9d86-539c3a0c09c5/image.png" alt=""></p>
</li>
<li><p>수식 2처럼 마지막 항을 제거하여 ELBO로 표현함. 여기서 lower bound라 표현한 이유는 가장 최대 확률이 나올 것의 하한이 수식 2이기 때문이다. 하한을 보장하게 됨. </p>
</li>
<li><p>수식 3 복원오차
<img src="https://velog.velcdn.com/images/terry_9996/post/4d8e98b8-4563-4aec-8201-0660adab3c9a/image.png" alt=""></p>
</li>
<li><p>수식 3은 첫번째 항으로 이는, 잠재변수 z가 주어졌을 때, x의 분포를 알고 싶은것임. 
즉, 인코더를 통한 잠재변수를 다시 디코더에 넣어 복원했을때, 원본 입력x와 동일하도록 하는 것.</p>
</li>
<li><p>수식 4 정규화 항
<img src="https://velog.velcdn.com/images/terry_9996/post/a0904a2c-55c1-49b0-8382-954cbd7b20ed/image.png" alt=""></p>
</li>
<li><p>수식 4는 2개의 분포를 가지고, 쿨백-라이블러의 발산을 계산하는 것으로, 표준정규분포를 가정하고 있기에 계산이 가능해진다. 평균과 분산을 통해 계산이 가능해짐. </p>
</li>
</ul>
<h4 id="vae의-손실함수">VAE의 손실함수</h4>
<ul>
<li>MLE(최대가능도)대신에 ELBO의 합을 최대화 해야함. &quot;-(ELBO의 합을 최소화)&quot;를 의미함.</li>
<li>손실 함수 계산 시 샘플링이 필요하다는 것 -&gt; 미분 불가능함. </li>
</ul>
<h3 id="2-재매개변수화-방법">2. 재매개변수화 방법</h3>
<ul>
<li>정규 분포의 특성에서, 표준편차를 곱하고 평균을 더한 분포는 정규분포가 같다는 특성을 이용한다.</li>
</ul>
<hr>
<h2 id="변분-오토-인코더의-활용">변분 오토 인코더의 활용</h2>
<p>VAE는 생성과정은</p>
<ul>
<li>잠재벡터(z)를 표준정규분포에서 샘플링.</li>
<li>디코더의 분포 p(x|z)로부터 새로운 데이터를 생성함.</li>
</ul>
<p>이미지는 뿌옇지만, 데이터의 특징은 잘 잡고서 생성이 가능하다. </p>
<h3 id="1-b-vae">1. B-VAE</h3>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/82b15309-9d78-4e65-803d-a1b02ef1c519/image.png" alt=""></p>
<ul>
<li>잠재벡터에 강한 정규화로 각 차원 별로 독립적인 정보를 가지도록 학습하여, 의미가 있는 잠재표현을 학습할 수 있으므로, 데이터의 특징을 잘 담게 된다는 특성이 있다. </li>
</ul>
<h3 id="2-vae-장점">2. VAE 장점</h3>
<ul>
<li>데이터를 요약하는 유용한 잠재 표현을 찾을 수 있다. </li>
</ul>
<h3 id="3-vae-단점">3. VAE 단점</h3>
<ul>
<li>가능도가 아닌 가능도의 하한을 최대화 한다는 것.</li>
<li>흐릿한 이미지를 생성한다는 점. </li>
</ul>
<hr>
<h1 id="vqvae---벡터양자화-변분-오토인코더">VQVAE - 벡터양자화 변분 오토인코더</h1>
<ul>
<li><p>잠재벡터가 이산(Discrete)인 벡터 양자화 VAE</p>
</li>
<li><p>실제 이미지나 텍스트는 유한한 특성으로 표현할 수 있음. </p>
</li>
<li><p>기존의 표준정규분포인 z(잠재벡터)에서 K개(특성의 강도를 나타내는 K개)의 D차원 임베딩 벡터로 매핑(mapping)함.</p>
</li>
<li><p>예시)
<img src="https://velog.velcdn.com/images/terry_9996/post/7cfbae4b-e8c5-416b-a221-95b288df5c46/image.png" alt=""></p>
</li>
</ul>
<h2 id="1-복원-오차첫번째-항">1. 복원 오차(첫번째 항)</h2>
<ul>
<li><img src="https://velog.velcdn.com/images/terry_9996/post/3b0bc089-6351-4964-987c-a42eae50bd7b/image.png" alt="">
기존 VAE와 마찬가지로 입력/출력이 동일해야 함. </li>
</ul>
<h2 id="2-규제화">2. 규제화</h2>
<ul>
<li><p>앞서 기존은 z가 정규분포를 따른다고 하였지만, K(특성의 강도를 표현함)개를 Uniform 벡터(특성을 고정된 수의 Uniform 벡터)로 표현된다면 사전 분포 p(z) = 1 / K </p>
</li>
<li><p><img src="https://velog.velcdn.com/images/terry_9996/post/ccdf5369-8856-4e0e-a1a2-4337333dc8f0/image.png" alt="">
위 처럼 변경된 것을 볼 수 있음. 기존의 정규화가 log (K)가 되므로 상수로 되어, 두번째 항은 제거할 수 있게 됨. </p>
</li>
</ul>
<h2 id="3-vqvae의-학습">3. VQVAE의 학습</h2>
<ul>
<li>K개의 임베딩 벡터로 학습하게 함.</li>
<li>손실함수 (하나의 데이터로의 표현으로, sum, batch표현은 생략)</li>
</ul>
<h3 id="1-k개의-임베딩">1. K개의 임베딩</h3>
<p>수식 1
<img src="https://velog.velcdn.com/images/terry_9996/post/cabc62ab-7bc9-4ba7-addd-1820f76f6cf8/image.png" alt=""></p>
<p>인코더의 출력 벡터가 입력의 특징을 추출한 정보를 담은 것으로 파란 박스를 의미한다. 
하지만, 박스 부분을 통한 학습만 이루어질 경우, 인코더는 무한한 임베딩 공간으로 mapping을 진행기에 임베딩 공간에 입력이 흩뿌려질 수 있다는 단점을 가지고 있음.  </p>
<p>수식 2
<img src="https://velog.velcdn.com/images/terry_9996/post/01cc4740-061d-4929-ac40-4e6d7b698274/image.png" alt="">
따라서, 약속 손실로 기존 인코더의 출력이 너무 커지지 않도록 임베딩 벡터 근처로 가까워지게 loss를 가하게 됨. </p>
<ul>
<li>sg = stop gradient - backpropagation시 입력에 대한 기울기를 0으로 계산함.</li>
<li>$\beta$ &gt; 0으로 하이퍼 파라미터</li>
</ul>
<h3 id="2-미분-불가능">2. 미분 불가능</h3>
<ul>
<li>잠개변수 $z_q$(x) = $e_k$ 디코더의 입력은 인코더 출력($z_e$(x))에 대해 미분 불가능함.</li>
<li>이를 잠재 변수에 대한 기울기를 인코더 출력에 전달하여(인코더의 출력을 디코더의 기울기에 복사해서 학습함) 미분 가능하도록 전환하였음. </li>
</ul>
<h2 id="4-생성과정">4. 생성과정</h2>
<ul>
<li>잠재변수 4x4개, 임베딩 벡터 512개 </li>
<li>가능한 잠재 변수의 가짓수 : $512^{4x4}$ 엄청 커지게 됨.</li>
<li>관측치 개수 만큼의 잠재 변수의 조합만 확인가능하도록 하여 단순 사전 분포에서 샘플링은 의미가 없음. </li>
</ul>
<p>즉 새로운 샘플을 생성하기 위해서 랜덤한 uniform 벡터를 가져와 디코딩을 진행함. 여기서의 문제가 실제에서의 분포가 랜덤한 uniform분포가 아니라는 점에 있다. 즉 의미가 없는 분포를 가져와서 디코딩에 넣게 된다는 점에 있다. 이를 해결하기 위해 잠재변수의 조합을 PixelCNN으로 학습하여 샘플링하는 방법을 도입하게 됨. </p>
<h3 id="41-pixelcnn">4.1 PixelCNN</h3>
<ul>
<li>PixelCNN
이미지 픽셀 값(0~255)들의 결합 분포를 Masked 합성곱 신경망으로 모델링 한 것.
좌상단에서부터 순차적으로 이미지의 픽셀값을 생성함. 순서 : &lt;왼-&gt;오른쪽 // R - G - B &gt;</li>
</ul>
<hr>
<h1 id="vqvae-2">VQVAE-2</h1>
<ul>
<li>고해상도 이미지를 다루기 위한 계측 구조를 사용한 VQVAE임. </li>
<li>계층 구조
위(Top level) : 전역적인 Global 특징 - 배경, 거친 배경
아래(Bottom level) : 국소적인 Local 특징 - 아직 세부적인 디테일 까지는 아니지만, 부리, 털의 모양, 날개의 깃털</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Generation - 2]]></title>
            <link>https://velog.io/@terry_9996/Generation-2</link>
            <guid>https://velog.io/@terry_9996/Generation-2</guid>
            <pubDate>Wed, 21 Feb 2024 08:53:44 GMT</pubDate>
            <description><![CDATA[<h1 id="생성-모델-평가-지표의-필요성">생성 모델 평가 지표의 필요성</h1>
<ul>
<li>판별 모델의 종류</li>
<li>정답(GT)가 존재하므로, 모델의 출력을 정답과 비교하기 용이</li>
<li>범주형 데이터를 사용하는 경우 분류문제와 연속형 데이터는 회귀문제</li>
</ul>
<h2 id="평가지표">평가지표</h2>
<h3 id="범주형-데이터">범주형 데이터</h3>
<h4 id="정확도">정확도</h4>
<ul>
<li>각 클레스별 데이터의 정확도 accuracy를 평가함. </li>
</ul>
<h4 id="f-1-score">f-1 score</h4>
<ul>
<li>각 클래스별 데이터가 불균형한 경우엔, 정확도만으로 평가하지 않고 정밀도, 재현율, f-1score(정밀도와 재현율의 조화평균)를 이용함. </li>
</ul>
<h3 id="연속형-데이터">연속형 데이터</h3>
<h4 id="mse유클라디안거리-mae맨하튼-거리">MSE(유클라디안거리), MAE(맨하튼 거리)</h4>
<ul>
<li>회귀 분석에서는 실제 값과 모델이 예측한 값의 차이를 기반으로 평가함. </li>
</ul>
<h4 id="결정계수r-squared-상관계수corrlelation">결정계수(R-squared), 상관계수(corrlelation)</h4>
<ul>
<li>주어진 데이터의 값의 범위가 다른 경우, MSE와 MAE만으로 평가할 수 없음. 
<img src="https://velog.velcdn.com/images/terry_9996/post/0c087f93-f861-4512-8528-eee3b16ac52f/image.png" alt=""></li>
</ul>
<p>위와 같이 데이터의 1000개의 중에 100개, 100개 중에 10개를 틀린다면, 둘다 0.1프로만큼의 차이가 발생한다는 점을 MSE, MAE만으로는 평가하기 어려움. </p>
<h2 id="생성-모델-평가의-어려움">생성 모델 평가의 어려움</h2>
<ul>
<li><p>판별 모델과 달리 비교할 정답이 존재하지 않아, 결과를 직접적으로 비교할 대상이 없음.</p>
</li>
<li><p>학습 데이터를 정답으로 사용할 경우, 학습 데이터를 그대로 복제하는 현상이 발생함. 
<img src="https://velog.velcdn.com/images/terry_9996/post/736d53f3-c654-4d21-bc27-00c33f07cedc/image.png" alt="">
위와 같이 학습데이터에만 학습할 경우 손실이 차이가 안나게 되면, 그냥 학습데이터의 복제가 이루어지므로, 생성 모델은 윗사진이 더 잘 만들었다고 볼 수 있음. </p>
</li>
<li><p>사람을 활용한 생성 모델 평가 방식(사람이라는 인건비, 시간 등등의 비용이 많이 들음)</p>
</li>
</ul>
<h3 id="생성-모델의-평가-품질과-다양성-2가지-관점">생성 모델의 평가 (품질과 다양성 2가지 관점)</h3>
<ul>
<li>품질(충실도 Fidelity 이미지의 품질)</li>
<li>다양성(Diversity 이미지의 다양성)</li>
</ul>
<hr>
<h2 id="생성-모델-평가-지표---6가지">생성 모델 평가 지표 - 6가지</h2>
<ul>
<li>단순한 방법 : 학습에 사용한 원보 데이터와 생성된 결과물을 비교 </li>
<li><ul>
<li>픽셀 거리 (생성 모델에 동작이 잘 안되는 경향이 있음)</li>
</ul>
</li>
<li><ul>
<li>특징 거리 (IS)</li>
</ul>
</li>
</ul>
<h3 id="inception-scoreis">Inception Score(IS)</h3>
<ul>
<li>Inception v3 모델을 분류기로 이용하여, GAN을 평가하기 위해 고안된 지표 </li>
<li>예리함(Sharpness)과 다양성(Diversity) 두가지를 고려함. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/80e25d83-f600-461b-983d-96f91078ad83/image.png" alt="">
예리함이 적으면 블러리(흐려짐), 높으면 선명함</p>
<h4 id="무질서도entropy">무질서도(Entropy)</h4>
<ul>
<li>예리함과 다양성 지표는 무질서도(엔트로피)로 해석 가능함.</li>
<li>무질서도가 높다면, 임의의 변수 x에 대해 예측되는 y의 값이 많다. (예측이 어려움), 확신이 없음</li>
<li>무질서도가 낮다면, 임의의 변수 x에 대해 예측되는 y의 값이 적다. (예측 가능함), 확신이 있음</li>
</ul>
<p>주사위의 무질서도가 더 높음. (동전의 앞뒤를 예측보다 주사위 숫자 예측을 맞추는 것이 더 확률이 낮다) 
동전 : 앞뒤 나올 확률 1/2 :: log 2 ( -1/2 log 1/2 - 1/2 log 1/2 = -1 log 1/2) -&gt; 2번곱셈
주사위 : 각 숫자 확률 1/6 :: log 6 ( -1/6 log 1/6 ...... = -1 log 1/6) -&gt; 6번곱셈</p>
<ul>
<li><p>예리함</p>
</li>
<li><p>특정 숫자를 생성했을때, 숫자 분류기가 제대로 인식한다면 좋은 예리함을 가진 데이터를 생성한 것.</p>
</li>
<li><p>어느 클래스인지, 확신을 못가지고 있을때, 선명하게 된 이미지를 잘 분류가 가능하므로 모델 예측의 엔트로피가 낮게 나오는 것이 더 선명하고 높은 품질의 영상이라 볼 수 있음. </p>
</li>
<li><p>다양성</p>
</li>
<li><p>좋은 품질의 데이터를 생성하는 것만큼 다양한 데이터를 생성하는 것. </p>
</li>
<li><p>다양성이 높은 모델은 maginal에 엔트로피가 높게나옴(=무질서도가 높음), 분포가 uniform 분포에 가까워질수록 무질서도가 높아지게 됨. 즉 분포가 uniform하게 된다면, label(타겟, class)를 무엇이라고 나올지 예측이 어려워지므로, 엔트로피가 높아짐. </p>
</li>
<li><p>IS의 계산 
<img src="https://velog.velcdn.com/images/terry_9996/post/e0463155-9ec4-4991-b56b-2cf1bfebd589/image.png" alt=""></p>
</li>
<li><p>정보 엔트로피를 계산하는 것은 확률에 의존하게 되므로, 이는 확률을 나타내는 지표로 이미지넷 classifier를 사용하게 된 것임. 입력에 대해 특정 class에 속한 확률을 의미함. </p>
</li>
<li><p>IS의 곱으로 이루어져 있으므로, 이는 두 확률 분포의 KL-Divergence를 계산하는 것과 동일하게 됨. (선명하면 특정 class로 분류될 확률이 높음), (다양하면 모든 class로 고르게 분포가 됨을 활용함. </p>
</li>
</ul>
<p>한계점</p>
<ul>
<li><p>학습 데이터셋과 다른 데이터를 생성하는 경우 제대로 평가하기 어려워짐. 
예시 (얼굴사진으로 class로 분류될 확률이 아닌 것들의 데이터 셋이라면 평가가 불가능해짐.)
사람의 얼굴을 만들경우, 모두다 그냥 사람으로만 분류하게 됨. </p>
</li>
<li><p>IS가 높은 데이터를 생성하면 계속 같은 데이터를 생성함. (오로지 생성된 데이터만을 이용하여 계산됨.) - 품질이 높은 데이터로 계속 만들어도 좋은 점수를 반환하는 한계점. 혹은 각 class별로 이미지를 1장씩만 똑같이 많이 만들어도 다양성을 굉장히 높게 평가하는 한계가 있음.</p>
</li>
<li><p>이외에도 기울기 기반 공격, 리플레이 공격을 통해 점수 조작이 가능함. (노이즈가 많아 객체(class)라고 볼 수 없음에도, IS점수가 높게 나옴)</p>
</li>
</ul>
<h3 id="frechet-inception-distancefid">Frechet Inception Distance(FID)</h3>
<ul>
<li>생성된 데이터의 특징 벡터를 이용하여 학습 데이터와의 거리를 계산함. (낮을 수록 더 좋음) </li>
<li>IS와는 다르게, 분류기를 활용하지 않고, 특징 추출기로만 사용함. </li>
<li>IS의 문제점, 데이터의 확률 벡터가 아닌 특징 벡터만을 활용하게 됨. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/37a40ab3-87be-4f3e-909d-6d0fd298086d/image.png" alt=""></p>
<ul>
<li>학습 데이터와 생성 데이터 모두 활용함. (IS는 생성 데이터만 활용함) </li>
<li>특징들의 Mean과 Variance(분산)을 측정하여, FID 거리를 계산한다. </li>
<li>먼저 Mean값 간의 L2 거리(유클라디안) 측정 + 분산을 활용해서 Tr를 계산함. </li>
</ul>
<p>한계점</p>
<ul>
<li>FID점수는 품질(충실도 : Fidelity)와 다양성(Diversity)를 각각 평가할 수 없음. (즉, 품질이 좋은 것인지, 다양성이 강조된 모델인지, 모두다 균형잡힌 것인지 모름)</li>
</ul>
<hr>
<h3 id="개선된-정밀도-재현율">개선된 정밀도, 재현율</h3>
<ul>
<li>정밀도 : 모델이 positive라 예측 했을때, 실제로도 True인거 
생성된 데이터 기준에서, 실제 데이터 분포에 가까운 데이터 (얼마나 품질이 좋은가)</li>
<li>재현율 : 실제 True일때, 모델도 positive인거 
실제 데이터 중에서, 생성된 데이터 분포에 가까운 데이터 (얼마나 다양성 좋은가) </li>
</ul>
<h4 id="분포의-겹친-부분을-계산하는-방법">분포의 겹친 부분을 계산하는 방법</h4>
<ul>
<li>Close to (근방)
반지름 r인 범위 내에 존재하면 근방에 속하는 데이터로 간주함. 있으면 1, 없으면 0</li>
</ul>
<h4 id="개선된-정밀도-계산">개선된 정밀도 계산</h4>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/30ce3736-ef4b-4de5-a9a7-384fcb575030/image.png" alt=""></p>
<ul>
<li>판별모델에서 정밀도 = (TP) / (TP + FP)</li>
<li>생성모델에서 개선된 정밀도 = 실제 데이터 분포 내의 생성된 데이터 / 생성된 데이터 
(생성된 데이터) 중에서 (실제 데이터 분포에 속하는 생성된 데이터)의 비율 
그림에서는 실제 데이터셋 근방에 들어간 데이터 1 / 생성된 데이터 3 = 1/3 (0.3333)</li>
</ul>
<h4 id="개선된-재현율-계산">개선된 재현율 계산</h4>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/648f7657-4d9d-42c9-b071-ed5867c91391/image.png" alt=""></p>
<ul>
<li>판별모델에서 재현율 = (TP) / (TP + FN)</li>
<li>생성모델에서 개선된 재현율 = 생성된 데이터 분포 내의 실제 데이터 / 실제 데이터 
(실제 데이터) 중에서 (생성된 데이터 분포에 속하는 실제 데이터)의 비율 
그림에서는 생성된 데이터 분포에 실제 데이터 3 / 실제 데이터 4 = 3/4 (0.75)</li>
</ul>
<p>한계점</p>
<ul>
<li><p>이상치에 민감함 (일부 데이터만 임베딩 위치가 변해도 값이 크게 변함) </p>
</li>
<li><p>평가지표로는 불안정함. 
개선된 정밀도
<img src="https://velog.velcdn.com/images/terry_9996/post/e2fcc900-1fa1-4f94-b699-70aa40f31114/image.png" alt="">
개선된 재현율
<img src="https://velog.velcdn.com/images/terry_9996/post/45334390-a5b7-4f50-8343-751ea700eb06/image.png" alt=""></p>
</li>
<li><p>또한, 실제 데이터와 생성된 데이터의 분포가 동일하더라도 샘플링에 따라 점수가 낮을 수 있음.</p>
</li>
</ul>
<h3 id="조건부-정확도">조건부 정확도</h3>
<h3 id="lpipslearned-perceptual-image-patch-similarity">LPIPS(Learned Perceptual Image Patch Similarity)</h3>
<h3 id="clip-score">CLIP-Score</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[[업스테이지] AI심화학습(Generation)]]></title>
            <link>https://velog.io/@terry_9996/%EC%97%85%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80-AI%EC%8B%AC%ED%99%94%ED%95%99%EC%8A%B5Generation</link>
            <guid>https://velog.io/@terry_9996/%EC%97%85%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80-AI%EC%8B%AC%ED%99%94%ED%95%99%EC%8A%B5Generation</guid>
            <pubDate>Wed, 21 Feb 2024 07:20:04 GMT</pubDate>
            <description><![CDATA[<h1 id="생성모델">생성모델</h1>
<hr>
<h2 id="1-고전-생성모델">1. 고전 생성모델</h2>
<ul>
<li>데이터는 저차원의 <strong>필수적인 정보로부터 생성 가능하다</strong>는 가정하에 분포를 학습. </li>
<li>확률 분포 추정(가우시안 혼합, 볼츠만, 심층, 자기회귀망)</li>
</ul>
<h3 id="1-가우시안-혼합모델">1. 가우시안 혼합모델</h3>
<ul>
<li>여러개의 가우시안 분포를 바꾸면, 주어진 데이터에 fitting 되도록 함. </li>
</ul>
<h3 id="2-볼츠만">2. 볼츠만</h3>
<ul>
<li>신경망의 형태로, 특징추출과 비슷하며, 에너지가 낮을 수록 확률 밀도 함수의 값이 커짐. </li>
</ul>
<h3 id="3-심층">3. 심층</h3>
<ul>
<li>볼츠만 머신을 쌓은 것임. 입력-아웃풋-입력-아웃풋의 형태를 이루어짐. </li>
</ul>
<h3 id="4-자기회귀">4. 자기회귀</h3>
<ul>
<li>현재 픽셀값을 이전의 픽셀값에 의거하여 데이터를 추정하게 됨. </li>
<li>마르코프 체인의 영향을 받아, 현재 픽셀은 이전 픽셀의 영향을 갖는다. </li>
</ul>
<hr>
<h2 id="2014년-딥러닝-기반의-생성모델의-등장과-발전">2014년 딥러닝 기반의 생성모델의 등장과 발전</h2>
<h3 id="vae">VAE</h3>
<ul>
<li>선명하기 보다 흐린 영상을 가지게 된다는 단점. </li>
</ul>
<h3 id="pixelrcnn">PixelR/CNN</h3>
<h3 id="gan">GAN</h3>
<ul>
<li>적대적 생성 신경망(안경 사진 latent vector + 성별 여자 latent vector)의 산술계산으로 여자 선글라스 사진을 얻어낼 수 있었다. </li>
</ul>
<hr>
<h1 id="2-판별-모델과-생성모델">2. 판별 모델과 생성모델</h1>
<h2 id="1-판별모델">1. 판별모델</h2>
<ul>
<li><p>데이터 x(이미지)가 주어졌을때, 타겟Y(Class)가 나타날 조건부 확률을 직접적으로 반환하는 모델 </p>
</li>
<li><p>학습중에 데이터 사이의 경계를 예측할 수 있음 </p>
</li>
<li><p>로지스틱 회귀분석(판별 모델)
두 그룹의 경계를 곡선으로 판별함. </p>
</li>
</ul>
<h3 id="판별-모델의-활용">판별 모델의 활용</h3>
<ul>
<li>서로 다른 클래스를 분류 </li>
<li>이상치 감지하는 문제 </li>
</ul>
<h2 id="2-생성모델">2. 생성모델</h2>
<ul>
<li>데이터x와 특성 y의 결합 분포, 주어진 y가 없는 경우 데이터의 주변분포 p(x)를 추정함</li>
<li>주어진 데이터를 통해 데이터 분포를 학습함. </li>
<li>1은 일직선, 0은 곡선으로 이루어진다는 특성으로 분포가 이루어짐. </li>
</ul>
<h3 id="생성모델의-예시">생성모델의 예시</h3>
<ul>
<li>가우시안 혼합 모델 
<img src="https://velog.velcdn.com/images/terry_9996/post/db66c545-e17f-4268-8499-bc9ef28a7be7/image.png" alt="">
위와 같이 2개의 정규분포로 오른쪽의 weight=0.3를 주어 y를 맞출 수 있음</li>
</ul>
<h3 id="어려움">어려움</h3>
<ul>
<li>복잡한 모든 특성의 분포를 알아야함.(어른 + 안경 + 남성 + 검은 머리 등등의 특성이 필요함) </li>
<li>평가지표(강아지 판별은 정확도가 나오지만, 사람과 얼굴 생성시 잘 생성된 것은 어떻게 얘기해야 하는 지, 사람마다 객관적인 지표가 필요함)</li>
</ul>
<h3 id="생성모델의-활용">생성모델의 활용</h3>
<ul>
<li>이미지의 품질 개선 (안경 추가, 헤어 변경)</li>
<li>맥락에 맞게 이미지 빈 공간 자동완성</li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/6e08d554-f81e-4053-a765-4c1b52e4dbc0/image.png" alt=""></p>
<hr>
<h1 id="3-생성모델의-실생활-응용-활용사례">3. 생성모델의 실생활 응용 활용사례</h1>
<h2 id="화질-개선">화질 개선</h2>
<ul>
<li>저화질 영상의 화질을 개선함. (눈, 머리카락의 선명도, 노이즈)</li>
<li>오래된 사진 복구.(다양한 잡음이 낀 영상을 깔끔한 이미지로 복원가능)</li>
<li>AI 프로필(10~20장 기반의 프로필 생성)</li>
<li>webtoon ai painter(만화 케릭터의 채색을 자동으로 채색하는 툴, 스케치)</li>
<li>상품 사진 생성(전문가급 상품 사진으로 변환해주는 제품)</li>
<li>가상 옷 피팅(주어진 옷을 사람과 합성하는 기술) </li>
</ul>
<hr>
<h1 id="4-생성모델과-최대가능도-추정법">4. 생성모델과 최대가능도 추정법</h1>
<h2 id="1-생성모델">1. 생성모델</h2>
<ul>
<li>주어진 데이터를 통해 데이터 분포를 학습하는 모델. p(x|y)</li>
</ul>
<h2 id="2-가능도">2. 가능도</h2>
<p>동전 던지기로 최대 가능도. 10번 던지면 앞7, 뒤3 이라면, 관측의 의거하여 앞은 70% 뒤는 30%로 볼 수 있다. 특정 분포를 따르는 관측들을 토대로, 현상을 설명하는 모델이 얼마나 잘 설명하는가의 지표를 최대가능도라 할 수 있다. </p>
<p>보통 log 최대가능도를 사용하는데, 기존 최대가능도는 곱셈연산이므로 log를 통해 합연산으로 변환하여 사용한다. - 미분 계산이 쉬움(해석쉬움) </p>
<h3 id="1-최대가능도추정법mle">1. 최대가능도추정법(MLE)</h3>
<ul>
<li>가능도를 최대화하는 파라미터 $\theta$를 찾는 방법임. </li>
<li>가능도 함수의 미분을 통해 계산함. </li>
</ul>
<h4 id="1-동전-던지기-예시">1. 동전 던지기 예시</h4>
<p>동전 앞 7, 뒤 3 
파라미터 $\theta$ : 동전을 던질 때 앞면이 나올 확률 
확률 질량함수 : p(앞;$\theta$) = $\theta$, p(뒤;$\theta$) = 1-$\theta$
가능도 최대화 = 어떤 $\theta$에 대해 앞면 7번, 뒷면 3번이 나올 확률이 가장 큰가?</p>
<p>가능도 : L($\theta$) = $\theta^7(1-\theta)^3$
앞면이 60% = 0.001279
앞면이 70% = 0.002223 -- 가장 큼! 
앞면이 80% - 0.001677</p>
<p>앞면이 나올 확률의 추정값 = 0.7 </p>
<h2 id="3-생성-모델의-학습">3. 생성 모델의 학습</h2>
<ul>
<li>데이터의 분포 $p_{data}$를 어떻게 모델링할 것인가 ?  --&gt; 이를 다시보면 모델 $p_\theta$를 어떻게 학습? <ul>
<li>해결방법 : 데이터의 분포 $p_{data}$와 모델 $p_\theta$를 가깝게 하자. </li>
</ul>
</li>
</ul>
<h3 id="1-kl-divergence쿨백-라이블러-발산-최소화">1. KL-Divergence(쿨백-라이블러 발산) 최소화</h3>
<ul>
<li><p>두 분포 (데이터의 분포 $p_{data}$와 모델 $p_\theta$)사이의 거리 -&gt; kullback-leibler Divergence)
<img src="https://velog.velcdn.com/images/terry_9996/post/85d83889-0a05-450a-9198-c6d50e3a5fbc/image.png" alt=""></p>
</li>
<li><p>분포간의 차이로 볼 수 있음. KL-Divergence(쿨백-라이블러 발산) 최소화 == 로그가능도 최대화로 해석함. </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/dc503e27-6580-414f-935b-d02c70bd00b6/image.png" alt=""></p>
<ul>
<li>앞의 식은 $\theta$에 영향이 없으므로, 제거하여 해석가능함. </li>
</ul>
<h3 id="2-어려움">2. 어려움</h3>
<ul>
<li>우리는 데이터의 분포 $p_{data}$를 모르고 관측된 x1, x2, xn만 관측함. </li>
</ul>
<h1 id="5-정리">5. 정리</h1>
<ul>
<li>생성 모델의 학습은 최대 가능도를 최적화하며 진행할 수 있음.</li>
<li>쿨백-라이블러 발산은 최대 가능도 최적화에 활용가능한 기준이 됨.</li>
<li>데이터의 정확한 분포를 알 수 없기에, 바로 적용하기에는 어려움이 존재함. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Document Type Classification 문서 타입 분류]]></title>
            <link>https://velog.io/@terry_9996/Document-Type-Classification-%EB%AC%B8%EC%84%9C-%ED%83%80%EC%9E%85-%EB%B6%84%EB%A5%98</link>
            <guid>https://velog.io/@terry_9996/Document-Type-Classification-%EB%AC%B8%EC%84%9C-%ED%83%80%EC%9E%85-%EB%B6%84%EB%A5%98</guid>
            <pubDate>Tue, 20 Feb 2024 01:33:36 GMT</pubDate>
            <description><![CDATA[<h2 id="1-abstract">1. Abstract</h2>
<ul>
<li><p><strong>Goal of the Competition</strong></p>
<ul>
<li>Classification Problem
분류문제로, 17종의 문서타입을 분류하는 Task수행.
<img src="https://velog.velcdn.com/images/terry_9996/post/23db3dac-91d9-4646-99f7-732a4eb64745/image.png" alt=""></li>
</ul>
</li>
<li><p><strong>Timeline</strong></p>
<ul>
<li>January 10, 2024 - Start Date</li>
<li>February 20, 2024 - Final submission deadline</li>
</ul>
</li>
<li><p><strong>Metric</strong></p>
<ul>
<li>f1-score를 사용하였습니다. </li>
<li>모델이 예측한 것이 실제로 얼마큼 맞는지 정밀도(precision)</li>
<li>모델이 예측한 것중에 실제 틀린것이 얼만큼 맞는지 재현율(recall)</li>
</ul>
</li>
</ul>
<pre><code>![](https://velog.velcdn.com/images/terry_9996/post/b5324a8e-189c-4c9c-a265-3f50715f3a68/image.png)</code></pre><h2 id="2-process--competition-model">2. Process : Competition Model</h2>
<ul>
<li><strong>5가지의 timm pretrained.</strong><ul>
<li>vgg16, vit, resnet, yolov8, efficientNet
<img src="https://velog.velcdn.com/images/terry_9996/post/606116d1-02d4-4eb5-bb06-e4c5f4d01c0c/image.png" alt=""></li>
</ul>
</li>
</ul>
<h2 id="3-process--data-describe">3. Process : Data Describe</h2>
<ul>
<li><p><strong>Describe the data EDA that your team faced during the project.</strong></p>
<ul>
<li><img src="https://velog.velcdn.com/images/terry_9996/post/c433883d-c1b9-44b3-a92b-fe0e482e09b0/image.png" alt=""></li>
</ul>
<p>학습데이터는 1570개의 데이터를 가지고 있고, class는 총 17개의 문서타입을 가지고 있다. 평가데이터는 3140개의 데이터를 분류하는 것이다. </p>
</li>
<li><p><strong>전체적인 흐름(floww chart)</strong>
문서 데이터들은 각 문서끼리의 차이가 크게 나는 것도 있고, 문서의 특징이 구별되지 않는 경우(노이즈)의 영향이 있다. 따라서 모델의 학습간에 validation을 계속 확인하면서, Augmentation전략을 지속적으로 수정하며 성적향상을 이루었다. 
<img src="https://velog.velcdn.com/images/terry_9996/post/0106b463-894b-4ffa-8962-489bdb84a812/image.png" alt=""></p>
</li>
<li><p><strong>데이터 기초통계</strong>
학습 이미지를 정규화하기 전의 최소값이 (-2.11 ~ -1.80) 평균값이 대략 (0.388 ~ 0.807)로 정규화 전의 이미지가 차이가 있음을 보였다. 
그리고, 17개의 클래스가 1번, 13번, 14번 클래스에서 데이터 불균형이 있음을 확인 가능함.
<img src="https://velog.velcdn.com/images/terry_9996/post/5a106084-9cb3-4121-8633-6c74ed41b8b8/image.png" alt=""></p>
</li>
<li><p><strong>데이터의 정규화</strong>
이미지 데이터의 정규화(0.5, 0.5)로 실험해본 결과, 다음과 같이 설적 향상이 이루어진 것을 볼 수 있다. 정규화가 성적향상에서는 기울기의 업데이트가 일정 수 만큼 지속적으로 이루어지는것으로 global 최소에 일정비율만큼 작아짐.
<img src="https://velog.velcdn.com/images/terry_9996/post/504c9cee-fd28-4828-953d-3fe571d07c5f/image.png" alt=""></p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/78f8b050-10b0-45f2-8c9f-46c3dfb9c0c3/image.png" alt=""> </p>
<h2 id="4-eda">4. EDA</h2>
<ul>
<li><p><strong>Describe your role with task in your team.</strong></p>
<ul>
<li>학습 데이터간에 이미지 형태가 그림자가 있는 이미지나, 색이 다른 이미지가 존재하는 경향이 있음.</li>
<li><img src="https://velog.velcdn.com/images/terry_9996/post/429b03b8-98ce-4230-82b4-4682a9ba4233/image.png" alt=""></li>
<li>또한, 학습 데이터의 label(class)가 잘못 오분류 되어진 경향을 확인함. 
<img src="https://velog.velcdn.com/images/terry_9996/post/a8a1c974-a364-4903-97f0-cb2467def906/image.png" alt=""></li>
</ul>
</li>
<li><p><strong>conv level image</strong></p>
<ul>
<li><p>Feature Engineering. 학습된 이미지의 conv level을 보면 이미지의 대략적인 코너, 선, 박스, 검은부분들을 학습하는 것을 확인가능함. </p>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/ac29df3b-9b73-4f9e-b2eb-fee09eeccabc/image.png" alt=""></p>
<ul>
<li>또한, 4개의 데이터에서 모델이 학습시에 입퇴원확인서, 진단서, 의료 납입 확인서, 소견서 데이터의 영향이 발생함. 
<img src="https://velog.velcdn.com/images/terry_9996/post/3d8663db-1bce-48b6-979f-325d811dea21/image.png" alt=""></li>
</ul>
</li>
</ul>
<ul>
<li><p>다음으로, 하이퍼 파라미터를 튜닝하기 위해 5가지로 진행함. 
<img src="https://velog.velcdn.com/images/terry_9996/post/6823410e-c585-4db8-9fe6-ad6fa5eacb40/image.png" alt=""></p>
</li>
<li><p>그리고, 불균형 데이터를 focal loss로 해결하기 위하여 진행하였고, weight를 직접 주어서 class를 잘 맞히도록 loss에 영향을 주었다.
<img src="https://velog.velcdn.com/images/terry_9996/post/5644c2e1-57b3-4ca1-88af-29c254389e34/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<h2 id="5-results">5. Results</h2>
<ul>
<li><p><strong>Write the main result of Competition</strong></p>
<ul>
<li>1등을 하였지만, 위 결과에서는 휴먼 분류한 것으로 나왔다. 
<img src="https://velog.velcdn.com/images/terry_9996/post/c23b74b0-25c6-463b-ade4-6d3765361423/image.png" alt=""></li>
</ul>
</li>
<li><p><strong>Final standings of the Leaderboard</strong></p>
<ul>
<li><img src="https://velog.velcdn.com/images/terry_9996/post/b0d50060-4832-472e-b28a-66ac6a9e78f7/image.png" alt=""></li>
</ul>
</li>
</ul>
<h2 id="6-conclusion">6. Conclusion</h2>
<ul>
<li><strong>Describe your running code with its own advantages and disadvantages, in relation to other groups in the course.</strong><ul>
<li>딥러닝 중 Computer Vision 에 대해 배우고 경험하는 시간을 가질 수 있다.</li>
<li>여러 문서 이미지를 문서 타입 별로 이미지 분류 하는 방법에 대해 배우고 경험할 수 있다.</li>
<li>Albumentation 모듈을 활용하여 data augmentation 및 noise 추가 방법에 대해 알 수 있었다.</li>
<li>image data 에서 train-valid split, Oversampling하는 방법을 적용 해 볼 수 있었다.</li>
</ul>
</li>
</ul>
<ul>
<li><strong>Sum up your project and suggest future extensions and improvements.</strong><ul>
<li>기존 학습되어진 모델들의 high level  layer 부분과 low level layer부분을 나눠서 각각 실험을 해보는 것.</li>
<li>테스트셋을 하나하나 구현가능한 데이터 EDA 요구해보임.</li>
<li>문서간에 특이점을 다양하게 찾을 수 있도록, 서로 다른 모델이 학습한 image를 conv레이어를 통해 train 데이터로 만들어 재학습.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[GAN - tips for training]]></title>
            <link>https://velog.io/@terry_9996/GAN-tips-for-training</link>
            <guid>https://velog.io/@terry_9996/GAN-tips-for-training</guid>
            <pubDate>Sun, 11 Feb 2024 11:03:52 GMT</pubDate>
            <description><![CDATA[<p>오늘은 GAN 학습시의 tips들을 요약해보는 시간입니다. </p>
<hr>
<h3 id="1-normalize-inputs">1. Normalize inputs</h3>
<ul>
<li>이미지의 경우 픽셀의 값이 0 ~ 255의 값이므로, -1과 1사이의 normalize가 좋은 성능을 나타내고 있다. 보통 하이퍼볼릭 탄젠트</li>
</ul>
<h3 id="2-modified-loss-function">2. Modified loss function</h3>
<ul>
<li>loss func을 $(생성자의 loss) = (1 - 판별자의 loss)$이라면, 기울기 소실의 문제가 발생하기에, real과 fake의 class값들을 대칭하게 만들어두고, 생성자의 loss가 min이 되도록 하는 것이 더 효과가 좋음.</li>
</ul>
<h3 id="3-spherical-z-사용">3. Spherical Z 사용</h3>
<ul>
<li>uniform한 분포는 sperical 하지 않으므로, 잠재백터(데이터)를 sampling하기 보다 가우시안 분포와 같이 spherical하게 된 곳에서 sampling하는 것이 더 효과가 좋음.</li>
</ul>
<h3 id="4-batch-normalization">4. Batch normalization</h3>
<ul>
<li>실제 이미지는 실제 이미지끼리 batch norm, 가짜 이미지는 가짜 이미지끼리 batch norm를 사용하는 것이 더 성능이 향상될 수 있음.</li>
</ul>
<h3 id="5-sparse-gradients인-reru-maxpool를-피하자">5. sparse gradients인 reru, maxpool를 피하자</h3>
<ul>
<li>sparse한 기울기를 가지게 되는 ReLU에서 대신에 LeakyReLU를 사용. </li>
<li>downSampling시에는 maxpool대시엔 Average Pool, conv2D + stride사용.</li>
<li>upSamplig시에는 PixelShuffle, convTranspose2D + stride를 사용.</li>
</ul>
<h3 id="6-use-soft-and-noisy-label">6. use soft and noisy label</h3>
<ul>
<li><p>soft label이란
real = 1, fake = 0 이런식의 hard한 label이 아닌, random한 숫자로 0.7 ~ 1.2사이의 값으로 real이미지의 label를 가지고, 0.0 ~ 0.3을 fake이미지의 label를 갖게 하는 것이 더 효과가 좋음. </p>
</li>
<li><p>noisy label이란
real과 fake이미지의 label를 바꾸면 학습에 도움이 되기도 한다.</p>
</li>
</ul>
<h3 id="7-rl">7. RL</h3>
<ul>
<li>강화학습
강화학습에서의 적용방법을 GAN에서도 적용가능하기에 도움이 된다. </li>
</ul>
<h3 id="8-track-실패를-일찍-확인">8. Track 실패를 일찍 확인</h3>
<ul>
<li>판별자의 loss가 0으로 빠르게 된다면 모델은 오래 걸리게 되므로 실패될 수 있음.</li>
<li>기울기의 이동을 확인한다.
높거나, 극단적인 값들을 확인</li>
<li>D loss는 점차적으로 낮아지며, 만약 분산과 spiking이 크다면 문제가 있을 수 있다. </li>
</ul>
<h3 id="9">9.</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[Other Types of Generative Models]]></title>
            <link>https://velog.io/@terry_9996/Other-Types-of-Generative-Models</link>
            <guid>https://velog.io/@terry_9996/Other-Types-of-Generative-Models</guid>
            <pubDate>Sun, 04 Feb 2024 11:30:44 GMT</pubDate>
            <description><![CDATA[<p>ch11. Comparison to Other Types of Generative Models</p>
<p>VAE variational lower bound를 구하여 학습하는 방식 
<img src="https://velog.velcdn.com/images/terry_9996/post/e5d94e62-5660-462e-ad32-e9d6698608a8/image.png" alt=""></p>
<hr>
<h1 id="1-autoregressive-models">1. Autoregressive models</h1>
<ul>
<li><p>단점
: 계산적인 측면에서 시퀀시라서, 여러 데이터들을 샘플링시에 한계가 있음.</p>
</li>
<li><p>장점
: 시계열(time - series)에서 사용됨, 이전 데이터로 현재 데이터 예측함.
: p(x) likelihood를 분명하게 계산가능함
: 학습도 단순함</p>
</li>
</ul>
<p>FVBN (fully visible belief network)</p>
<ul>
<li>데이터의 가능성을 명확하게 구할 수 있는 장점 </li>
<li>이전 픽셀로 현재 픽셀의 product of 1d distribution의 chain rule로 likelihood를 표현하게 됨. 이전의 픽셀들의 값이 픽셀 값에 대한 복잡한 분포이므로 이를 Neural network로 표현하게 됨.</li>
</ul>
<h2 id="1-pixelrnn---다루기-쉬운-density-function사용">1. PixelRNN - 다루기 쉬운 density function사용</h2>
<ul>
<li>RNN에서의 Autoregressive(이전데이터로 현재 데이터를 예측하고자함) </li>
<li>처음에는 랜덤으로 정해지고, 점차적으로, 오른쪽과 아래의 값을 예측하고, 예측된 값을 기반으로 추가적으로 오른쪽과 아래의 값을 지속적으로 하여 픽셀들의 값을 예측하는 것이 PixelRNN임 
<img src="https://velog.velcdn.com/images/terry_9996/post/bc45d5df-393c-43d6-97c0-dc28167d4fbf/image.png" alt=""></li>
</ul>
<h2 id="2-pixelcnn---다루기-쉬운-density-function사용">2. PixelCNN - 다루기 쉬운 density function사용</h2>
<ul>
<li>시작은 좌상단에서부터 우하단까지 생성하게 됨. </li>
<li>cnn의 장점은 학습이 빠르게 진행됨 -&gt; rnn보다 연산이 parallelize됨</li>
<li>그래도 32x32이미지의 생성 경우에도 network가 1024번을 통과해야함</li>
</ul>
<hr>
<h1 id="2-vaevariational-autoencoders">2. VAE(variational autoencoders)</h1>
<ul>
<li><p>목표 
: 정규화된 latent vertor인 z의 값으로 조건을 만족하는 이미지 x를 맞추는 것임</p>
</li>
<li><p>장점 
: 다루기 어려운 density function사용
: 모든 픽셀을 한번에 예측하게 된다는 점
: 해석가능한 잠재벡터
: 규칙으로 접근한 생성모델
: 추론을 허락하지만, 다른 task에서 특징 표현들에 유용함</p>
</li>
<li><p>단점
: 근산화된 값을 이용하므로, 오차가 발생할 수 있음. 
: 성능이 좋지 않음, blurring 혹은 lower한 qulity임.</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/3f9941bf-b7e8-4ef5-8d16-544617cc44dd/image.png" alt=""></p>
<ul>
<li>보통 p(z)는 심플한 가우시안 분포 등이 있음. </li>
<li>p(x|z)의 경우는 complex한 분포(이미지 생성으로)로 이를 Neural network로 표현함.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/b5045759-e529-4513-8035-e92072d9bfe5/image.png" alt=""></p>
<ul>
<li>그림처럼 거의 무한대에 가까운 다루기 어려운 분포들임. </li>
<li>이를 위해, 몬테카를로 추정을 통하지만, 이는 높은 분산이 생기게 됨. </li>
</ul>
<h3 id="1-해결책">1. 해결책</h3>
<ul>
<li><p>사후 density인 $p_{\theta}$(x|z)를 근접하게 하는 인코더 네트워크인 $q_{\phi}(z|x)$로 학습하는 것을 의미한다. </p>
</li>
<li><p>KL-divergence (항상 0보다 크다), 2개의 확률분포 a, b중에 어느 한 분포에 얼만큼 다른지를 수치로 봄.</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/13b6109a-8ebe-4eed-a49c-6421d6cc8423/image.png" alt=""></p>
<ul>
<li>인풋이미지 x라고 했을때, 사후 density를 근접하게 하는 인코더 네트워크인 $q_{\phi}(z|x)$로 학습시키면, 다음과 같이 평균분포과 시그마분포를 구함</li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/04e7c65e-3528-4b05-aa64-d211bc0867b9/image.png" alt=""></p>
<ul>
<li>다음에서 우리는 KL-divergence로 평균분포와 시그마분포를 (0~1)로 정규화 후에 다른지를 계산함.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/d9a9be93-76ed-437a-a9f8-baeed5ada8c8/image.png" alt=""></p>
<ul>
<li><p>이제 z를 샘플링하게 되는데, 일반적인 샘플링은 계산그래프를 생성할 수 없으므로, 이는 기울기 신호들이 인코더 네트워크까지 도달하지 않는다. 이를 위해 우리는 샘플링을 계산 그래프를 구할 수 있도록 한다.
<img src="https://velog.velcdn.com/images/terry_9996/post/89701a50-b99d-4687-b171-91558f37c840/image.png" alt=""></p>
</li>
<li><p>이제 우리는 z를 decoder에 넣어주고, 
<img src="https://velog.velcdn.com/images/terry_9996/post/626a8ea8-e1ba-4c4c-bf87-ca9f137a89f0/image.png" alt=""></p>
</li>
<li><p><img src="https://velog.velcdn.com/images/terry_9996/post/34f15e14-8ff1-46a3-92bf-0b6ba125b9b8/image.png" alt=""></p>
</li>
<li><p>이렇게 구해진  $\bar{x}$를 통해서 최대화하는 likelihood를 reconloss를 통해서 구함. 
<img src="https://velog.velcdn.com/images/terry_9996/post/36f1f429-654b-49cc-acb5-b05786240488/image.png" alt=""></p>
</li>
<li><p>위의 과정을 minibatch만큼 계속해서 학습하는 것임.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[upStage_CV_CNN]]></title>
            <link>https://velog.io/@terry_9996/upStageCVCNN</link>
            <guid>https://velog.io/@terry_9996/upStageCVCNN</guid>
            <pubDate>Tue, 30 Jan 2024 07:25:07 GMT</pubDate>
            <description><![CDATA[<h1 id="backbone-이해하기-cnn">Backbone 이해하기: CNN</h1>
<h1 id="cnn-기본-개념-다지기">CNN 기본 개념 다지기</h1>
<p>컨볼루션 레이어 : 컴퓨터 비전 task를 수행하는데 유용한 특징들을 학습
Activation Func : 네트워크에 비선형성을 가해주는 역할
Pooling layer : feat map에 spatial agg를 시켜준다.</p>
<h2 id="1-컨볼루션-layer">1. 컨볼루션 layer</h2>
<ul>
<li>네트워크가 유용한 feature들을 학습할 수 있도록함. </li>
</ul>
<hr>
<h3 id="filterkernel">filter(=kernel)</h3>
<ul>
<li>인풋 이미지를 특정 크기의 필터를 이용하여, 컨볼루션 연산을 시행하여 필터 영역에 대한 특징을 추축함. - 예시로는 output이 2x2가 나옴 
<img src="https://velog.velcdn.com/images/terry_9996/post/a96031fe-39a8-4b6f-91d5-cfe8ef4b42a1/image.png" alt=""></li>
</ul>
<h4 id="1-strides--filter를-얼마만큼의-간격으로-움직일-것인가">1. stride(S) : filter를 얼마만큼의 간격으로 움직일 것인가?</h4>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/8f4428e2-ff3f-4d0d-9c89-b9be9585ba2d/image.png" alt=""></p>
<ul>
<li>위와 같이 output의 size를 $(\frac{N-F}{S} + 1)$로정의할 수 잇음. </li>
<li>입력이미지가 작아지게 된다는 것(컨볼루션 레이어를 거치면 작아지는 것을 의미한다.)</li>
</ul>
<h4 id="2-paddingp--feature-map의-크기를-일정-수준으로-유지">2. Padding(P) : feature map의 크기를 일정 수준으로 유지</h4>
<ul>
<li>zero padding : 0으로 채운 pixel을 주변에 채워넣어주는 것임</li>
<li>output size : $(\frac{N-F + 2P}{S} + 1)$로 변하게 됩니다. </li>
</ul>
<hr>
<h3 id="activation-func">Activation Func</h3>
<ul>
<li>모델이 비선형성을 가질 수 있도록 만듦.</li>
<li>비선형성이란, 데이터의 분포로부터 선형성만으로는 분류 못하는 것을 가능하게 비선형함수를 이용하여 구할 수 있게됨. </li>
<li>컨볼루션 레이어만으로는 선형성을 판별할 수 있음 - 이를 activation func을 이용하여 비선형성을 가질 수 있도록 함. </li>
</ul>
<hr>
<h3 id="pooling-layer">Pooling Layer</h3>
<ul>
<li><p>feature map에 spatial aggregation을 시킴. </p>
</li>
<li><p>down sampling이 됨. 
224x224 --&gt; 112x112 (output size)
4x4 --&gt; 2x2 (output size)
<img src="https://velog.velcdn.com/images/terry_9996/post/f6c239ff-9621-4f7b-bf8f-135ac8dd7be7/image.png" alt=""></p>
</li>
<li><p>max pool이라면 : 가장 큰 값들만 가져오게 됨.</p>
</li>
<li><p>avg pool이라면 : 값들의 평균을 가져옴.</p>
</li>
<li><p>장점 :
모델의 파라미터 수가 줄어듬.
receptive field가 달라지게 됨. </p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[upstage_CV_모델구성]]></title>
            <link>https://velog.io/@terry_9996/upstageCV%EB%AA%A8%EB%8D%B8%EA%B5%AC%EC%84%B1</link>
            <guid>https://velog.io/@terry_9996/upstageCV%EB%AA%A8%EB%8D%B8%EA%B5%AC%EC%84%B1</guid>
            <pubDate>Mon, 29 Jan 2024 06:52:03 GMT</pubDate>
            <description><![CDATA[<h1 id="컴퓨터-비전-모델-구조-이해하기">컴퓨터 비전 모델 구조 이해하기</h1>
<p>visual feature란?</p>
<ul>
<li>시각적 특징들로 눈으로 감지한 것으로 판단된 feature들</li>
<li>컴퓨터 비전의 task를 해결할 때 필요한 이미지의 특성을 담고 있는 정보들을 지칭함.</li>
</ul>
<p>예시) 코끼리의 특징: </p>
<ul>
<li>긴 코, 큰 귀, 회색빛 피부 </li>
</ul>
<h2 id="backbone의-역할">Backbone의 역할</h2>
<ul>
<li>이미지에서 중요한 특징을 추출함</li>
<li>주어진 비전 task를 수행할 수 있는 압축된 visual feature를 산출함</li>
</ul>
<h3 id="1-구조">1. 구조</h3>
<ul>
<li>layer가 길어질수록 -ex 3layer)
하위(맨처음 layer)들은 low-level(픽셀의 선) - 1layer
중간(중간 layer)들은 mid-level(사람의 눈, 귀, 코) - 2layer
상위(마지막 layer)들은 high-level(사람 얼굴의 윤곽전체) - 3layer
<img src="https://velog.velcdn.com/images/terry_9996/post/e5eec550-6a4f-4da1-852b-ec3256d77a00/image.png" alt=""></li>
</ul>
<hr>
<h1 id="모델-구성">모델 구성</h1>
<h2 id="decoder의-역할">Decoder의 역할</h2>
<ul>
<li><p>모델의 쓰임새에 따라 다양한 task들을 decoder를 통해서 task의 출력 형태를 만드는 과정임</p>
</li>
<li><p>이미지에 있는 물체는 무엇인지?(분류), 위치를 표시하기 위한(탐지), 특정 물체의 픽셀을 따로 색칠하기(segmentation)</p>
</li>
</ul>
<h2 id="encoder의-역할">Encoder의 역할</h2>
<ul>
<li>Encoder는 backbone에서 나온것을 다시 가공하여 decoder에 들어감. </li>
</ul>
<hr>
<h1 id="decoder의-역할-1">Decoder의 역할</h1>
<p>image - backbone - decoder </p>
<h2 id="1-모델의-전체-구조">1. 모델의 전체 구조</h2>
<h2 id="2-task에-따른-decoder-결과">2. Task에 따른 decoder 결과</h2>
<h3 id="분류">분류</h3>
<p>decoder에서 각 클래스의 어떤 클래스가 가장 높은지를 나타내면됨. </p>
<ul>
<li><p>fc + softmax 로 이루어짐</p>
</li>
<li><p>B = batch size
CxWxH 만큼의 벡터가 있는 것임 </p>
</li>
<li><p>FC = (BxC) (BxC) (Bx # of class) -&gt; Softmax</p>
</li>
</ul>
<h3 id="탐지">탐지</h3>
<p>강아지의 위츠를 박스로, 클래스별로 확률을 출력해주는 역할</p>
<ul>
<li>x1,y1,x2,y2, #of class을 출력해주면 됨. </li>
</ul>
<h3 id="segmentation">Segmentation</h3>
<p>강아지 혹은 고양이에 해당하는 영역을 픽셀 단위로 출력해주는 역할임.</p>
<hr>
<h1 id="최종">최종</h1>
<p>Backbone은 입력 이미지에서 유의미한 feature를 추출한 뒤 압축하는 역할임. 태스크 종류가 다르더라도 동일한 backbone을 사용할 수 있음</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[upstage_CV_고전]]></title>
            <link>https://velog.io/@terry_9996/upstageCV%EA%B3%A0%EC%A0%84</link>
            <guid>https://velog.io/@terry_9996/upstageCV%EA%B3%A0%EC%A0%84</guid>
            <pubDate>Mon, 29 Jan 2024 05:01:53 GMT</pubDate>
            <description><![CDATA[<h1 id="preliminary---고전-컴퓨터-비전">Preliminary - 고전 컴퓨터 비전</h1>
<p>규칙 기반의 이미지 처리 알고리즘 (OpenCV)</p>
<ul>
<li>Rule-based</li>
<li>딥러닝 모델로 해결하기 어려운 문제 (로보틱스, 가상현실)</li>
<li>딥러닝 모델 결과의 후처리</li>
<li>Morphological Transform</li>
<li>Edge &amp; Contour Detection</li>
</ul>
<h1 id="기초-이론">기초 이론</h1>
<h2 id="1-morphological-transform">1. Morphological Transform</h2>
<ul>
<li>이미지에 기반한 연산이며, 흑백 이미지에서 수행함.</li>
<li>입력 : 이미지</li>
</ul>
<h3 id="중요성">중요성</h3>
<ul>
<li>이미지의 노이즈를 제거하는데 사용가능함. </li>
</ul>
<img src="https://velog.velcdn.com/images/terry_9996/post/4b9c9455-5544-451f-b80b-7300d7e8329f/image.png" width="30%" height="30">

<hr>
<h3 id="erosion">Erosion</h3>
<ul>
<li><p>물체의 경계를 침식함.</p>
</li>
<li><p>이미지의 특징을 축소할때 사용가능함. </p>
<img src="https://velog.velcdn.com/images/terry_9996/post/2309e2e0-afc8-4632-9b51-b2f3c4507d88/image.png" width="40%" height="40">
</li>
<li><p>커널 아래 모든 픽셀이 1이면 1, 아니면 0이됨</p>
</li>
<li><p>경계 근처의 픽셀을 축소함.</p>
</li>
<li><p>동작 방법 : 3x3 커널내에 모든 픽셀이미지에 1의 값이 있다면, Erosion의 연산값은 1이 됨, 하나라도 1이 아닌 값이 있다면, Erosion의 연산값은 0.</p>
</li>
</ul>
<h3 id="dilation">Dilation</h3>
<ul>
<li><p>사물의 크기를 팽창할 때 사용함.</p>
<img src="https://velog.velcdn.com/images/terry_9996/post/7bc47e43-64dc-42d5-9422-6d6d1e851a7e/image.png" width="40%" height="40">
</li>
<li><p>경계 근처의 픽셀을 팽창함.</p>
</li>
</ul>
<h3 id="opening">Opening</h3>
<ul>
<li>노이즈를 제거하는데 사용함.</li>
<li>D -&gt; E --- Closing 방법이 됨. </li>
</ul>
<h1 id="심화-예제">심화 예제</h1>
<h2 id="1-contour-detection">1. Contour Detection</h2>
<ul>
<li>같은 색깔 및 intensity를 가지는 연속적인 경계점들로 이루어진 curve</li>
<li>raw image에서 객체의 contour를 탐지</li>
</ul>
<h3 id="중요성-1">중요성</h3>
<ul>
<li>딥러닝 모델을 사용하지 않음 : 딥러닝 모델은 데이터 가공에 따라 성능이 영향감. </li>
</ul>
<h3 id="과정">과정</h3>
<ul>
<li>Edge 탐지 - Dilation(옵션임) - Contour 탐지
<img src="https://velog.velcdn.com/images/terry_9996/post/ea69d208-82ac-44ed-9f88-0094aab6469f/image.png" alt=""></li>
</ul>
<h3 id="1-edge-detector">1. Edge Detector</h3>
<ul>
<li>Canny Edge 
1986년 TPAMI 발표된 논문</li>
</ul>
<ol>
<li><p>노이즈 제거
가우시안 필터(중앙부에 큰값, 외곽에 갈수록 0에 가까운 작은값) 이용함</p>
</li>
<li><p>이미지 내의 높은 미분값 찾기
Sobel 커널(행 또는 열의 변화율을 계산하여 높은 기울기 추출)로 기울기 추출
수평방향의 Gx, 수직방향의 Gy
edge_gradient = $\sqrt{Gx^2+Gy^2}$
Angle = $tan^{-1}(\frac{Gy}{Gx})$
특정 방향으로 기울기가 크다면, 급격한 픽셀값의 변화로 Edge로 검출함.</p>
</li>
<li><p>최대값이 아닌 픽셀 값 0으로 치환
기울기 방향의 최대값을 가진 픽셀만 남김
많은 기울기가 2번단계에서 검출되어 대표적인 것만 남김.</p>
</li>
<li><p>threshold 조정을 통한 세밀한 엣지 검출
변화량이 큰 값들중 대표 픽셀이 남아 있기에, 
threshold를 통해 최소-최대를 선택한 픽셀을 엣지로 선택함. </p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[upstage_CV_정의_기술_활용사례]]></title>
            <link>https://velog.io/@terry_9996/upstageCV%EC%A0%95%EC%9D%98%EA%B8%B0%EC%88%A0%ED%99%9C%EC%9A%A9%EC%82%AC%EB%A1%80</link>
            <guid>https://velog.io/@terry_9996/upstageCV%EC%A0%95%EC%9D%98%EA%B8%B0%EC%88%A0%ED%99%9C%EC%9A%A9%EC%82%AC%EB%A1%80</guid>
            <pubDate>Mon, 29 Jan 2024 04:53:37 GMT</pubDate>
            <description><![CDATA[<h1 id="컴퓨터-vision">컴퓨터 Vision</h1>
<ul>
<li><p>비전 : 시각적인 정보들의 집합
시각으로 보이는 것을 숫자로 데이터화 하여 저장한 모든 것.</p>
</li>
<li><p>시각정보 : 빨강R, 초록G, 파랑B
(256, 0, 0), (0, 256, 0), (0, 0, 256)</p>
</li>
<li><p>vision 데이터들에서 의미 있는 정보를 추출하고 이를 이해하는 것을 바탕으로 여러가지 작업을 수행하는 것</p>
</li>
</ul>
<h1 id="컴퓨터-graphics">컴퓨터 Graphics</h1>
<ul>
<li>컴퓨터 모델을 활용하여 이미지를 렌더링하는 과정 </li>
</ul>
<hr>
<h2 id="컴퓨터-vision-1">컴퓨터 Vision</h2>
<h3 id="low---level">Low - level</h3>
<ul>
<li>이미지 내에 픽셀에 따른 영역</li>
</ul>
<p>이미지 처리</p>
<ul>
<li>해상도</li>
<li>color jitter</li>
</ul>
<p>Feature Extraction(추출)</p>
<ul>
<li>Edge 탐지</li>
<li>Segmentation (feat. watershed)</li>
</ul>
<h3 id="mid---level">Mid - level</h3>
<ul>
<li>이미지 내 일정 부분</li>
<li>파라노마 기술</li>
<li>multi-view stereo</li>
<li>depth estimation </li>
<li>lidar 센서 레이저로 자율주행 관련 영상 생성 등에 활용됨.</li>
</ul>
<h3 id="high---level">High - level</h3>
<ul>
<li>전체 이미지에서의 한 부분</li>
<li>이미지 분류 </li>
<li>Semantics object detection</li>
<li>segmentation</li>
</ul>
<hr>
<h1 id="컴퓨터-비전-활용사례">컴퓨터 비전 활용사례</h1>
<ul>
<li><p>pose estimation
action recognition : 동영상내에 행동을 인식하는 활용
Re-identification - 특정한 사람을 놓치지 않고서 활용할 수 있음.</p>
</li>
<li><p>OCR, 비정형 이미지에서 정형으로 검출
문서 내 텍스트에서 비용절감과 서비스의 질 향상을 수요함. </p>
</li>
<li><p>Medical image Analysis
Mass, Effusion, Pneumonia 등의 예측</p>
</li>
<li><p>Generative Mdoels
GAN : 이미지 생성
Virtual-Try-on (VITON) : 사지 않아도 실제 착용한 이미지를 가상으로 봄. 
Text to image : 문장을 입력으로 이미지를 생성할 수 있음. 
Image to Video : 이미지에서 영상으로 생성함. 
Modify videos with Texts : 문장와 이미지로 video 생성
NeRF : 3D 렌더링을 만들 수 있음.
Brain Signals : 이미지를 본 사람의 뇌를 통한 뇌파신호(EGG)로 이미지 생성</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[upStage_ML_project]]></title>
            <link>https://velog.io/@terry_9996/upStageMLproject</link>
            <guid>https://velog.io/@terry_9996/upStageMLproject</guid>
            <pubDate>Fri, 26 Jan 2024 06:01:32 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/terry_9996/post/d5c2286a-e398-4b49-bff1-85ecd9113d70/image.png" alt=""></p>
<h1 id="아파트-실거래-예측ml">아파트 실거래 예측(ML)</h1>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/4625c771-92fe-4c20-aacf-d5cb10cabc8c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/be19dcaf-ef01-4cbd-aea4-dbd43611fd03/image.png" alt=""></p>
<h2 id="1-평가지표">1. 평가지표</h2>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/beae7ca9-1aeb-451a-a547-46b1bc57b3ef/image.png" alt=""></p>
<h2 id="2-학습데이터">2. 학습데이터</h2>
<ul>
<li><p>학습 데이터의 기간은 2007년 1월 1일부터 2023년 6월 30일까지 1,118,822(약 120만개)</p>
</li>
<li><p>평가 데이터는 학습 데이터기간 이후 3개월인 2023년 7월 1일부터 2023년 9월 26일까지의 정보로 구성 (9272개)</p>
</li>
</ul>
<h2 id="3-model-select">3. Model Select</h2>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/2afb5cb3-25e9-4967-b1b1-be5cee866c3d/image.png" alt=""></p>
<ul>
<li>focus : 이상치 탐지와 보간법(결측치 데이터의 후처리), 특정 컬럼을 활용하는 것을 생각했었습니다. </li>
</ul>
<hr>
<h3 id="파생변수-1">파생변수 1</h3>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/3dcd695e-ee32-4a2d-857c-06e26a4165ca/image.png" alt=""></p>
<ul>
<li>추가로, 파생변수를 생성하기 위해서, 각 아파트의 브랜드명에 따라 달라진다고 생각이 들었고, 최고층에 따라서도 평균 가격을 활용할 수 있다고 판단됩니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/4cfe77f2-0b25-4851-af17-1d916a7d3acb/image.png" alt=""></p>
<ul>
<li>보시면, RF모델에선 사용된 feature들의 중요도를 0.1이상만 가지고 이용한다고 했을때와의 차이를 보면서 진행하였고, public score는 다음과 같이 0.1이상의 중요도와 2020년 이후의 데이터를 사용했을때 좋은 결과를 보였습니다.</li>
</ul>
<hr>
<h3 id="파생변수-2">파생변수 2</h3>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/d1ff8b4b-39ff-42c5-8ef7-0d05c8ee2fba/image.png" alt=""></p>
<ul>
<li>또 다른, 파생변수로는 apt_counts: 같은 아파트 이름을 갖는 수와 상위 10개에 해당하는 시공사에 대한 변수를 생성하였음.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/89f310c8-d3d4-48e9-b7b8-e523ae7d08b0/image.png" alt=""></p>
<ul>
<li>위의 분포에서 왼쪽으로 치우친 모습이라, log 변환을 이용하여 정규화 모양으로 만들어서 사용하였음. 위 결과 feature중요도가 top2에 해당하는 점에 도달할 수 있었습니다. </li>
</ul>
<hr>
<h3 id="model">Model</h3>
<ul>
<li>기존의 모델은 lightGBM등 tree 모델을 사용하여 보았지만, 다양한 모델을 함께 보기 위하여 pycaret를 이용하여 모델별 비교를 진행했습니다. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/8aa3bdbc-7a84-467d-990b-75a65918ad0c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/b8178660-2567-4c3c-8d8e-d0f56db65af8/image.png" alt=""></p>
<ul>
<li>Tree모델과 linear(예측을 하는데, 이상치가 크면 부족할 수 있음)모델을 비교해보았다면, 각각의 모델을 보면 아무래도 Tree모델에서 성능이 비교적 좋게 나오는 것을 확인할 수 있음.</li>
</ul>
<hr>
<h3 id="model-2">Model 2</h3>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/99b71546-25f2-495f-9b43-acb242f9eeb7/image.png" alt=""></p>
<ul>
<li>다음으로, 강남 여부의 지리적 위치를 추가하기 위해, 아파트 상위 거래 금액별로 강남구, 서초구, 용산구, 송파구을 하나의 &#39;0&#39; 라벨링을 진행하였고, 이 외 성동구와 마포구는 &quot;1&quot; 라벨링을 진행하고, 나머지 지역구들은 &quot;2&quot;라벨링을 진행하였다. </li>
</ul>
<h3 id="파생변수-3">파생변수 3</h3>
<ul>
<li><p>다음, 월별 금리데이터를 이용하였다. 
<img src="https://velog.velcdn.com/images/terry_9996/post/fa65e983-d248-493d-b653-1163dbf69f83/image.png" alt=""></p>
</li>
<li><p>e-나라지표를 통해서, 기준금리를 이용하였으며, 한국은행의 기준 금리을 보고서 결측된 기준금리 데이터들은 채워넣었다.</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/6a769a54-e5bc-4a3a-8a01-ee837d129527/image.png" alt=""></p>
<ul>
<li>그리고, 모델별 날짜 데이터을 범주형 데이터 -&gt; 연속형 데이터로 변경</li>
<li>&quot;지역별 동&quot;의 데이터를 다시 재레이블을 진행하였고</li>
<li>Test데이터셋이 2023년을 예측하다보니, 2018년 이후의 데이터만으로 최신 데이터만 이용한 모델도 진행해본 결과, 모델의 성능은 2018년 이후의 데이터를 이용할 경우, 오히려 성능이 떨어진 것을 보았습니다. </li>
</ul>
<hr>
<h2 id="4-피드백">4. 피드백</h2>
<p>질문사항: 2가지</p>
<ol>
<li>이상치탐지 관련해서, 25%, 75%에 해당하는 이상치를 제거 중인데, 이를 더 효과적으로 탐지해서, 제거하거나 대체하는 방식이 있을까요?</li>
</ol>
<p>답변: 예측 모델을 넣어주자. 하지만, 정의가 필요 - 이상치가 나쁜건가? 
효과가 크지(크리티컬)않을 듯 보임.</p>
<ol start="2">
<li>데이터 특징을 추가로 추천해주실 특징이 있을까요?
답변 : base code내에서 특징 중요도를 모두 반영할 수 있도록 컬럼이 많은 것이 좋음
2000년도 데이터로만 진행해보는 것도 가능함.
건설사 데이터(결측데이터)로 특징을 가질 수 있을 것이라 판단됨.</li>
</ol>
<p>&lt;추가사항&gt;</p>
<ul>
<li><p>테스트 데이터셋이 7월 9월를 맞추는 것임. —&gt; train_test split (랜덤 state)가 시계열 데이터에서 반영이 더디게 모델이 될 수 있음</p>
</li>
<li><p>과적합 판단됨(Tree 모델의 depth의 max를 줄이는 방안, k-fold)</p>
</li>
<li><p>규제 요소가 필요해보임</p>
</li>
<li><p>columns가 부족해보임. ---&gt; 학습 데이터 100만개에 해당하기에, 컬럼 추가.</p>
</li>
<li><p>서로 다른 2개의 Tree모델이 예측한 것의 가중치(pred1 &lt;0.8&gt;, pred2 &lt;0.2&gt;) 이용하여 예측 모델 만들어보기. (앙상블 효과 발생가능함)</p>
</li>
</ul>
<hr>
<h2 id="5-최종순위">5. 최종순위</h2>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/d5c2286a-e398-4b49-bff1-85ecd9113d70/image.png" alt=""></p>
<p>3위를 달성하였습니다. </p>
<hr>
<h2 id="6-추가적-사항">6. 추가적 사항</h2>
<ul>
<li>고가 아파트를 예측하는  모델 따로 만들어보기</li>
<li>단위기간별, 왜도, 첨도, 분산을 각 단위별로 쪼개서 사용해보기</li>
<li>테스트 데이터에 이상한 데이터가 있는지 확인하기(RMSE가 10만이상 차이가 난다?, 제곱,루트)</li>
<li>Time series별 k-fold을 적용해보기</li>
</ul>
<hr>
<h2 id="7-1등코드리뷰">7. 1등코드리뷰</h2>
<pre><code># &#39;아파트명&#39;이 &#39;힐스테이트 서초 젠트리스&#39;인 행의 &#39;번지&#39;, &#39;본번&#39;, &#39;부번&#39; 업데이트
concat.loc[concat[&#39;아파트명&#39;] == &#39;힐스테이트 서초 젠트리스&#39;, &#39;번지&#39;] = &#39;557&#39;
concat.loc[concat[&#39;아파트명&#39;] == &#39;힐스테이트 서초 젠트리스&#39;, &#39;본번&#39;] = 557
concat.loc[concat[&#39;아파트명&#39;] == &#39;힐스테이트 서초 젠트리스&#39;, &#39;부번&#39;] = 0

# &#39;아파트명&#39;이 &#39;서초포레스타2단지&#39;인 행의 &#39;번지&#39;, &#39;본번&#39;, &#39;부번&#39; 업데이트
concat.loc[concat[&#39;아파트명&#39;] == &#39;서초포레스타2단지&#39;, &#39;번지&#39;] = &#39;384&#39;
concat.loc[concat[&#39;아파트명&#39;] == &#39;서초포레스타2단지&#39;, &#39;본번&#39;] = 384
concat.loc[concat[&#39;아파트명&#39;] == &#39;서초포레스타2단지&#39;, &#39;부번&#39;] = 0

# 도로명을 기준으로 그룹화하고, 각 그룹 내에서 &#39;아파트명&#39;의 결측치를 채웁니다.
concat[&#39;아파트명&#39;] = concat.groupby(&#39;도로명&#39;)[&#39;아파트명&#39;].transform(lambda x: x.fillna(method=&#39;ffill&#39;).fillna(method=&#39;bfill&#39;))

# 각 행별로 &#39;도로명&#39;에 &#39;구로동로&#39;가 포함 된다면 &#39;아파트명&#39;의 결측치를 해당 행의 도로명으로 대체(아파트명이 실제로 없기에 도로명으로 대체)
concat[&#39;아파트명&#39;] = concat.apply(lambda row: row[&#39;도로명&#39;] if (row[&#39;시군구&#39;] == &#39;서울특별시 구로구 구로동&#39; and pd.isna(row[&#39;아파트명&#39;]) and (&#39;구로동로&#39; in row[&#39;도로명&#39;] or &#39;도림로&#39; in row[&#39;도로명&#39;] or &#39;디지털로&#39; in row[&#39;도로명&#39;])) else row[&#39;아파트명&#39;], axis=1)

# 아파트명 직접 대체
concat.loc[concat[&#39;도로명&#39;] == &#39;천호대로77다길 11-6&#39;, &#39;아파트명&#39;] = &#39;해오름아파트&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;동호로11마길 20-8&#39;, &#39;아파트명&#39;] = &#39;성민아트&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;여의대방로62길 24&#39;, &#39;아파트명&#39;] = &#39;효성아파트&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;국사봉1길 18&#39;, &#39;아파트명&#39;] = &#39;상진빌딩&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;동호로11바길 30-8&#39;, &#39;아파트명&#39;] = &#39;석종아파트&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;신수로 89&#39;, &#39;아파트명&#39;] = &#39;신수동 자이언트 아파트&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;양재대로71길 2-11&#39;, &#39;아파트명&#39;] = &#39;올림픽아트빌&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;청계천로 295&#39;, &#39;아파트명&#39;] = &#39;동대문신발상가&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;대학로7길 15-4&#39;, &#39;아파트명&#39;] = &#39;연건동아파트&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;강남대로27길 7-14&#39;, &#39;아파트명&#39;] = &#39;한일인텔빌라&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;명륜2길 9-14&#39;, &#39;아파트명&#39;] = &#39;명륜2길 9-14&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;동호로5길 12&#39;, &#39;아파트명&#39;] = &#39;다다유크레스&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;증산로23길 8-8&#39;, &#39;아파트명&#39;] = &#39;우일아파트&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;낙산성곽동길 35-1&#39;, &#39;아파트명&#39;] = &#39;낙산성곽동길 35-1&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;서리풀길 14&#39;, &#39;아파트명&#39;] = &#39;callia vill&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;효령로 200&#39;, &#39;아파트명&#39;] = &#39;효령로 200&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;화곡로 176-5&#39;, &#39;아파트명&#39;] = &#39;화곡로 176-5&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;광나루로12길 5&#39;, &#39;아파트명&#39;] = &#39;광나루로12길 5&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;개운사길 83-15&#39;, &#39;아파트명&#39;] = &#39;개운사길 83-15&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;도곡로93길 23&#39;, &#39;아파트명&#39;] = &#39;대치 르엘&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;까치산로14길 26-13&#39;, &#39;아파트명&#39;] = &#39;힐탑아파트&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;양천로 677&#39;, &#39;아파트명&#39;] = &#39;염창하이츠빌딩&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;천호대로118길 10&#39;, &#39;아파트명&#39;] = &#39;천호대로118길 10&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;난계로15길 36-6&#39;, &#39;아파트명&#39;] = &#39;난계로15길 36-6&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;난계로15길 36-8&#39;, &#39;아파트명&#39;] = &#39;난계로15길 36-8&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;이문로35아길 16&#39;, &#39;도로명&#39;] = &#39;이문로16길 35&#39; # 잘못된 도로명 주소 수정
concat.loc[concat[&#39;도로명&#39;] == &#39;이문로16길 35&#39;, &#39;아파트명&#39;] = &#39;이문로16길 35&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;마조로1길 45&#39;, &#39;아파트명&#39;] = &#39;아파트&#39;
concat.loc[concat[&#39;도로명&#39;] == &#39;성지3길 7&#39;, &#39;아파트명&#39;] = &#39;성지3길 7&#39;</code></pre><p>감사합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ML-300제]]></title>
            <link>https://velog.io/@terry_9996/ML-300%EC%A0%9C</link>
            <guid>https://velog.io/@terry_9996/ML-300%EC%A0%9C</guid>
            <pubDate>Mon, 08 Jan 2024 08:39:57 GMT</pubDate>
            <description><![CDATA[<p>오늘은 300제 문제 풀면서 
회귀 관련 문제들을 정리하겠습니다. </p>
<hr>
<h1 id="목표">목표</h1>
<ul>
<li>스크래핑 된 dirty 데이터 클리닝</li>
<li>다양한 종류의 데이터 정규화 </li>
<li>사이킷런 기반의 모델 학습 방법 습득</li>
<li>XGBoost, LightGBM 모델 학습 </li>
<li>모델 평가 및 시각화 </li>
</ul>
<h1 id="중고-자동차-데이터-분석하기">중고 자동차 데이터 분석하기</h1>
<h2 id="1-데이터-확인">1. 데이터 확인</h2>
<ul>
<li>26개의 컬럼(head, info, describe)<pre><code>df.isna().sum() # null 개수
df.columns # 26개 
df.drop([필요없는 것들 제외], axis=1, inplace=True)</code></pre></li>
</ul>
<h3 id="1-year-바꾸기">1. year 바꾸기</h3>
<pre><code>df[&#39;age&#39;] = 2021 - df[&#39;year&#39;]
df.drop(&#39;year&#39;, axis=1, inplace=True)</code></pre><h3 id="2-범주형-데이터-확인">2. 범주형 데이터 확인</h3>
<pre><code>df.columns # 26개

# 제조사 43개 
df[&#39;manufacturer&#39;].value_counts() 
fig  = plt.figure(figsize=(8,12))
sns.countplot(x=&#39;manufacturer&#39;, data=df.fillna(&#39;n/a), order = df.fillna(&#39;n/a&#39;)[&#39;manufacturer&#39;].value_counts().index)

# 차량 모델 31520
df[&#39;model&#39;].value_counts() 
fig  = plt.figure(figsize=(8,12))
sns.countplot(x=&#39;model&#39;, data=df.fillna(&#39;n/a), order = df.fillna(&#39;n/a&#39;)[&#39;model].value_counts().index)

# codition
df[&#39;codition&#39;].value_counts() 
fig  = plt.figure(figsize=(8,12))
sns.countplot(x=&#39;codition&#39;, data=df.fillna(&#39;n/a), order = df.fillna(&#39;n/a&#39;)[&#39;codition].value_counts().index)

# cynlinders
df[&#39;cynlinders&#39;].value_counts() 
fig  = plt.figure(figsize=(8,12))
sns.countplot(x=&#39;cynlinders&#39;, data=df.fillna(&#39;n/a), order = df.fillna(&#39;n/a&#39;)[&#39;cynlinders].value_counts().index)

# transmission
df[&#39;transmission&#39;].value_counts() 
fig  = plt.figure(figsize=(8,12))
sns.countplot(x=&#39;transmission&#39;, data=df.fillna(&#39;n/a), order = df.fillna(&#39;n/a&#39;)[&#39;transmission].value_counts().index)</code></pre><h3 id="3-수치형-데이터-확인">3. 수치형 데이터 확인</h3>
<pre><code># price
sns.histplot(x=&#39;price&#39;, data=df)
sns.bosplot(x=&#39;price&#39;, data=df)
sns.rugplot(x=&#39;price&#39;, data=df, height=1)

# odometer
sns.histplot(x=&#39;odometer&#39;, data=df)

# age
sns.histplot(x=&#39;age&#39;, data=df)
sns.histplot(x=&#39;age&#39;, data=df, bins=18, kde=True)</code></pre><h2 id="2-데이터-cleaning">2. 데이터 cleaning</h2>
<h3 id="1-범주형-데이터-시각화">1. 범주형 데이터 시각화</h3>
<pre><code># 현재 불가능
sns.boxplot(x=&#39;manufaturer&#39;, y=&#39;price&#39;, data=df.fillna(&#39;n/a&#39;))</code></pre><h3 id="2-범주형-데이터-클리닝">2. 범주형 데이터 클리닝</h3>
<ul>
<li>결측 데이터 제거</li>
<li>결측 데이터를 others</li>
<li>클래스가 적은 데이터들을 others</li>
<li>분류모델로 학습해서, 결측 데이터 예측하여 넣음<pre><code>df[&#39;manufacturer&#39;].fillna(&#39;others&#39;).value_counts()</code></pre><pre><code>col = &#39;manufacturer&#39;
counts = df[col].fillna(&#39;others&#39;).value_counts()
plt.grid()
plt.plot(range(len(counts)), counts)</code></pre><pre><code>n_categorical = 10
counts_index = counts.index[n_categorical:] 
df[col] = df[col].apply(lambda s:s if str(s) not in counts_index else &#39;others&#39;)
df[col].fillna(&#39;others&#39;, inplace=True)
df.loc[df[col] == &#39;other&#39;, col] = &#39;others&#39;</code></pre></li>
</ul>
<h3 id="3-수치형-데이터-시각화">3. 수치형 데이터 시각화</h3>
<pre><code>fig = plt.figure(figsize=(8,12))
sns.rugplot(x=&#39;price&#39;, data=df, height=1)</code></pre><h3 id="4-수치형-데이터-클리닝">4. 수치형 데이터 클리닝</h3>
<pre><code>price_1 = df[&#39;price&#39;].quantile(0.99) # 상위 1% 
price_2 = df[&#39;price&#39;].quantile(0.1) # 하위 10% 

df = df[(price_1 &gt; dr[&#39;price&#39;] &amp; (df[&#39;price&#39;] &gt; price_2)]
df.describe()</code></pre><h3 id="5-boxplot-범주형-데이터-시각화">5. boxplot 범주형 데이터 시각화</h3>
<pre><code>fig = plt.figure(figsize=(14,5))
sns.boxplot(x=&#39;manufaturer&#39;, y=&#39;price&#39;, data=df)</code></pre><h3 id="6-correlation-heatmap-시각화">6. Correlation Heatmap 시각화</h3>
<pre><code># 절대값으로 확인 
sns.heatmap(df.corr(), annot=True, cmap=&#39;YlOrRd&#39;)</code></pre><h2 id="3-데이터-전처리">3. 데이터 전처리</h2>
<pre><code>x_num = df[[&#39;odometer&#39;, &#39;age&#39;]]
scaler = StandardScaler()
scaler.fit(x_num)
x_scaled = scaler.transform(x_num)
x_scaled = pd.DataFrame(x_scaled, index=x_num.index, columns=x_num.columns)

# one-hot vec
x_cat = pd.drop([&#39;price&#39;, &#39;odometer&#39;, &#39;age&#39;], axis=1)
x_cat = pd.get_dummies(x_cat)

x = pd.concat([x_scaled, x_cat], axis=1)
y = pd[&#39;price&#39;]

x.head()
x.shape()
x.isna().sum() # x.fillna(0.0, inplace=True) # x[&#39;age&#39;].mean()</code></pre><h2 id="4-모델-xgboost-회귀">4. 모델 XGBoost 회귀</h2>
<pre><code>mdoel = XGBRegressor()
model.fit(x_train, y_train)</code></pre><h2 id="5-모델평가">5. 모델평가</h2>
<pre><code>pred = model.predict(x_test)
print(mean_absolute_error(y_test, pred))
print(sqrt(mean_absolute_error(y_test, pred)))</code></pre><h2 id="6-학습된-모델-평가-심화">6. 학습된 모델 평가 심화</h2>
<pre><code>plt.scatter(x=y_test, y=pred, alpha=0.005)
plt.plot([0, 60000], [0, 60000], &#39;r-&#39;)

plt.histplot(x=y_test, y=pred)
plt.plot([0, 60000], [0, 60000], &#39;r-&#39;)</code></pre><pre><code>err = (pred - y_test) / y_test * 100
plt.hist(err[err &lt; 600], bins=12)
plt.xlabel(&#39;error (%)&#39;)
plt.xlim(-100, 100)
plt.grid()</code></pre><pre><code>err = (pred - y_test) / y_test 
plt.hist(err, bins=12)
plt.xlabel(&#39;error ($)&#39;)
plt.grid()</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[생성모델]]></title>
            <link>https://velog.io/@terry_9996/%EC%83%9D%EC%84%B1%EB%AA%A8%EB%8D%B8</link>
            <guid>https://velog.io/@terry_9996/%EC%83%9D%EC%84%B1%EB%AA%A8%EB%8D%B8</guid>
            <pubDate>Sun, 07 Jan 2024 12:06:34 GMT</pubDate>
            <description><![CDATA[<p> Generative Adversairal Network의 대한 이야기</p>
<hr>
<p> 생성자와 구별자</p>
<ul>
<li>생성자는 구별자를 더 잘 속이도록 학습되어, 실제 데이터와 유사한 가짜 데이터를 생성함. </li>
<li>구별자는 가짜 데이터로부터 실제 데이터를 더 잘 구별하도록 설계한다. </li>
</ul>
<hr>
<h2 id="objective-function-of-gans">Objective Function of GANs</h2>
<h3 id="1-discriminatord의-loss-func">1. Discriminator(D)의 loss func</h3>
<p> <img src="https://velog.velcdn.com/images/terry_9996/post/5c4331aa-8b01-4a11-933a-e9d46fc89e14/image.png" alt=""></p>
<ul>
<li><p>파란식 : 실제 데이터에 대한 것</p>
</li>
<li><p>빨간식 : 가짜 데이터에 대한 것</p>
<p>p_data : 실제 데이터의 분포
p_z : lantent vector의 분포 : 가우시안 혹은 uniform한 분포 </p>
<hr>
<ul>
<li>극단적 예시 : 
D(판별자)가 잘 구별하는 모델이라면, 최대값 0을 가지게 됨. 
파란식 0 -----------&gt; (D(x) =0)
빨간식 0 -----------&gt; (D(G(Z)) = 0)</li>
</ul>
</li>
</ul>
<h3 id="2-generatiorg의-loss-func">2. Generatior(G)의 loss func</h3>
<p> <img src="https://velog.velcdn.com/images/terry_9996/post/52c0bd38-ed53-4244-a724-e53e805d093d/image.png" alt=""></p>
<ul>
<li>Discriminator(D)의 loss func에다가 음수값으로 표현함. </li>
<li>생성자는 실제 데이터와 유사하게 만들어서, 실제 데이터로 속게끔하여 1를 반환하도록 하는 것임. 이를 통해 앞서 빨간식의 뒷 부분이 1이 되게하여 log 0가 되고, 이는 음수값을 가지게 되므로, 판별자의 loss가 최소가 되고, 생성자 G의 loss는 최대가 됨. </li>
</ul>
<hr>
<p>학습은 결국 min max의 value func를 풀게 됨. </p>
<h2 id="gan-training-process">GAN Training Process</h2>
<ul>
<li>먼저 구별자 모델을 m개의 미니배치에서 샘플링해서, k번 업데이트 진행한 후, 생성자의 모델이 업데이트 됨 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/2a1c43ec-013b-4f33-b6e6-12f666938df9/image.png" alt=""></p>
<ul>
<li><p>생성자는 tanh()</p>
</li>
<li><p>판별자는 sigmoid()</p>
<hr>
</li>
</ul>
<pre><code>이미지 
- -1에서 1사이로 스케일링</code></pre><pre><code>생성자 학습 
초기 생성자는 
- uniform(-1, 1)사이의 값으로 LATENT_DIM만큼 torch.zeros로 생성

생성자 모델
- 초기 생성자의 값을 생성자 모델에 집어넣음. fake데이터

판별자 모델
- 초기 생성자 값을 넣어, pred(0과 1 둘 중에 하나의 값으로 예측함)를 가져오고서, binary_cross_entropy를 계산하는데, 판별자가 잘 판별하게 된다면 1로 예측하게 되고, 잘 못하게 되면 0이 된다. 

생성자의 loss
- 판별자가 binary_cross_entropy의 값을 이용하여, 역전파를 진행함.</code></pre><pre><code>판별자 학습
- 실제 이미지의 값(-1과 1사이의 uniform된 값)을 판별자 모델에 넣음.
- 판별자 모델에 넣은 실제 이미지들로 pred한 것을 binary_cross_entropy을통해서 real_loss를 계산.
- 다시 생성자 모델에 넣었던 fake데이터를 판별자 모델에 넣고서, binary_cross_entropy을통해서 fake_loss를 계산.

- real_loss와 fake_loss를 sum후에 1/2한다.
- discr_loss를 이제 역전파하여 학습</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[ML_프로젝트_2조]]></title>
            <link>https://velog.io/@terry_9996/ML%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B82%EC%A1%B0</link>
            <guid>https://velog.io/@terry_9996/ML%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B82%EC%A1%B0</guid>
            <pubDate>Sun, 24 Dec 2023 11:13:24 GMT</pubDate>
            <description><![CDATA[<p>오늘은 ML 프로젝트 2조
<img src="https://velog.velcdn.com/images/terry_9996/post/862016ab-19c7-43df-9284-e0fed321473d/image.png" alt=""></p>
<p>링크 - <a href="https://dacon.io/competitions/official/236193/overview/description">대구 교통사고 피해, 인명피해 심각도 예측</a> </p>
<p>데이콘 대회에서, 상위 23% 결과를 공유 드립니다. </p>
<hr>
<h3 id="1-데이터-설명">1. 데이터 설명</h3>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/4daea7bb-cd4f-456e-a10b-a9cc495a6e63/image.png" alt=""></p>
<ul>
<li><p>다음과 같이, train데이터는 3만9천여개, test데이터는 1만9백개의 데이터로 이루어져 있고, 각각 열은 22, 7개를 가지고 있습니다. </p>
</li>
<li><p>이 대회에서는 train데이터의 있는 ECLO, 즉 심각도 예측을 잘하는 것이 목표입니다. </p>
</li>
<li><p>또한, 평가 metric같은 경우는 RMSLE로, 로그 스케일로 이루어져 실제값과 예측값의 절대적인 차이의 크기를 줄인다는 특징이 있습니다. 즉, 심각도 예측의 값이 실제값과 차이가 적어야 하므로 가장 좋은 성능은 낮을때 좋은 값이다. </p>
</li>
</ul>
<h3 id="2-데이터의-이해">2. 데이터의 이해</h3>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/eedbd8f2-2bc7-4333-8360-4f0fba012fc1/image.png" alt=""></p>
<ul>
<li>주어진 데이터를 이해하기 위해서, 먼저 EDA를 진행해보았습니다. </li>
<li>데이터는 주말에 비교적 큰 사고가 많이 발생하며, 대부분의 교통사고가 맑은날에 주로 발생하고, 또한 안개날에 비교적 높은 사고(ECLO)가 큰 경향이 보임을 확인할 수 있습니다. 
<img src="https://velog.velcdn.com/images/terry_9996/post/ba14edb6-1e45-47d1-8310-18ac306cac14/image.png" alt=""></li>
<li>또한, 단일로와 교차로 모두 사고가 많이 발생하며, 터널에서의 사고는 ECLO가 높다는 특징을 가지고 있습니다. 반대로 주차장의 경우는 경미한 수준으로 보입니다. 
<img src="https://velog.velcdn.com/images/terry_9996/post/c3f787fc-ab98-4242-90c2-247ab0f71f11/image.png" alt=""></li>
<li>날씨의 영향을 보기위해, 도로가 건조할 때, 대부분의 사고가 발생하고, 침수의 발생건수는 적지만 심각도는 높다는 특징을 보임.
<img src="https://velog.velcdn.com/images/terry_9996/post/c06b4086-020a-41e2-84b5-8ee8a487a75e/image.png" alt=""></li>
<li>도로외 이탈-추락, 전도전복-전도의 사고발생 건수는 적지만, ECLO가 높으며, 측면충돌과 추돌사고가 사고 발생건수의 대부분을 차지하고 있습니다. 추가로 정면 추돌사고도 발생횟수에 비해 위험도는 추돌사고 비슷한 경향을 보입니다. 
<img src="https://velog.velcdn.com/images/terry_9996/post/e6d5dac4-454b-48ec-8fd8-99f5f70ea481/image.png" alt=""></li>
<li>또한, 안전운전 불이행으로 인한 사고가 많이 이뤄지며, 신호위반과 중앙선 침범의 사고는 ECLO(심각도)가 높다. 그리고 과속의 원인으로 ECLO가 높음을 알 수 있습니다. </li>
</ul>
<h3 id="3-데이터-이해-정리">3. 데이터 이해 정리</h3>
<ul>
<li>주로 <u>주말에 큰 사고</u>가 많이 발생함.</li>
<li><u>안개</u>로 앞이 안 보이는 날에 큰 사고가 발생하며, <u>비나 눈이 오는 날에는 큰 피해가 적다</u>.</li>
<li><u>단일로와 교차로에서 사고 발생</u>이 많고, 터널에서는 큰 사고가 발생함. 반대로 주차장에서 일어난 사고들은 경미함.</li>
<li>대부분의 사고가 <u>도로가 건조할 때 발생</u>하며, 침수시에는 사고위험도(ECLO)가 높음.</li>
<li><u>측면충돌, 추돌 사고가 사고 발생의 대부분</u>을 차지하고, 발생 건수는 적지만 <u>도로외 이탈-추락, 전도전복-전도 사고, 정면충돌 사고는 사고위험도(ECLO)가 높음</u>.</li>
<li>대부분이 <u>안전운전 불이행 사고로 발생</u>, 사고 위험도는 <u>신호위반, 중앙선 침범, 과속의 원인</u>이 주로 있었음.</li>
</ul>
<hr>
<h3 id="4-외부-데이터의-이해">4. 외부 데이터의 이해</h3>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/cbab51a2-d7bc-424b-9cda-ba4e1055238e/image.png" alt=""></p>
<ul>
<li>외부 데이터는, CCTV, 보안등, 어린이보호, 주차장 등의 데이터가 있으며, 이때 총 columns들 중에 사용되어진 columns는 색칠되어진 곳을 사용하였다. </li>
</ul>
<hr>
<h3 id="5-사용한-모델----xgboost-lightgbm-catboost-mlp">5. 사용한 모델 -  XGBoost, LightGBM, CatBoost, MLP</h3>
<ul>
<li><p>train데이터를 기준으로, Base모델은 Random Forest(RF)의 결과로 Public점수 기준으로 0.4399를 기록한다. 
<img src="https://velog.velcdn.com/images/terry_9996/post/285d5168-68e2-46a5-932a-cc6f34c2d05e/image.png" alt=""></p>
</li>
<li><p>먼저 데이터별, 모델의 결과들을 정리한 표를 보면, train데이터 + 4개의 외부데이터(CCTV, 보안등, 어린이보호, 주차장)의 결과가 Public기준 0.4284이다. 이는 2조의 가장 Best 점수이다.</p>
</li>
<li><p>사용된 데이터별 결과들에서 모델별 영향이 큰 영향을 미치지 못하는 것을 파악하고, XGBoost의 값이 가장 좋은 성능을 야기했다. </p>
</li>
</ul>
<hr>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/e0329ebf-6552-490b-8860-f38607d93ec5/image.png" alt=""></p>
<ul>
<li>혹시나, 사망자, 중상자, 경상자, 부상자별 XGBoost의 결과와 RF 모델을 이용한 값으로 측정해보았지만, Train에서는 잘 학습되었지만, Public점수는 0.6803으로 과적합된 것을 확인할 수 있었다. </li>
</ul>
<h4 id="51-전처리-데이터의-이용">5.1 전처리 데이터의 이용</h4>
<ul>
<li>모델학습시에 전처리된 데이터들을 각각 학습하여 어떤 결과를 미치지는 지 확인하기 위해 여러 실험을 돌려 결과를 확인한다.
<img src="https://velog.velcdn.com/images/terry_9996/post/3d641b32-0260-4e2d-b519-284df0e7436e/image.png" alt="">
<img src="https://velog.velcdn.com/images/terry_9996/post/3e080708-bd86-4a52-aa50-b608a16919df/image.png" alt=""></li>
<li>위의 결과처럼, 모델 학습시에 사용된 9가지의 아이디어로도 Public 점수의 영향이 뚜렷하게 나오는 값을 확인할 수 없었다. </li>
</ul>
<hr>
<h4 id="52-클러스터링의-활용">5.2 클러스터링의 활용</h4>
<ul>
<li>K-Means, DBSCAN, Hierarchical Cluster Analysis, HDBSCAN을 수행 후 가장 적합해 보이는 클러스터링을 설정</li>
<li>개별 클러스터마다 전용 예측 모델을 학습.</li>
<li>개별 예측 모델로 예측한 결과를 모아서 최종적으로 테스트 데이터에 대해서 예측</li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/64790b70-b0a2-419d-9eb2-ab52bbb5cad8/image.png" alt=""></p>
<ul>
<li>DBSCAN의 경우, Train데이터에서 특정원(빨간) 클러스터에 집중되어져 있기에, 사용할 수 없었으며, </li>
<li>HCA의 경우, 클러스터의 개수가 2개의 값으로 데이터을 잘 구분할 수 없었다. </li>
<li>HDBSCAN의 경우는, 빨간 화살표에 있는 타원의 원이 하나의 클러스터를 의미하는데, 이 경우에도 클러스터가 잘 구분되어져 있지 않았다. 
<img src="https://velog.velcdn.com/images/terry_9996/post/dedd290e-c6f4-4c2b-be61-348cf2f74657/image.png" alt=""></li>
<li>마지막, K-Means(K=7)의 경우에서 실루엣 스코어와 ELBOW를 계산하여 가장 차이가 많이 나는 지점을 설정하여, 시각화 결과에서는 데이터를 잘 구분하기에, 클러스터링은 K-means를 이용하였다. 그 결과 RMSLE의 값이 0.4392로 기존과 뚜렷한 차이를 볼 수 없었다는 점을 확인할 수 있었다. </li>
</ul>
<hr>
<h3 id="6-결론">6. 결론</h3>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/bfa55c3b-61b5-4108-9873-b299d449921e/image.png" alt=""></p>
<ul>
<li>시간적 한계로(7일)간의 데이콘 대회를 마무리 하였다. 또한 진행하면서, MAE의 metric으로 변경하여, ECLO를 예측시에 가장 두드러진 변화를 확인하는 것이 필요하였고, 진행사항을 중간에 정리하는 것이 요구되었다. </li>
<li>하지만, 우리는 전처리 과정에서 서로 통일성을 유지하도록 하고, 아이디어를 도출하기 위한 시간을 각자 주어지고, 모르는 부분은 서로 번갈아 확인하였다.
<img src="https://velog.velcdn.com/images/terry_9996/post/b2737bc2-12f1-476e-9fbb-8e68bc47933b/image.png" alt=""></li>
<li>상위1위, 2위의 모델에서는 보통 공공 데이터의 추가나, 학습에 영향받는 Columns를 추가하여 학습하는 것이 좋은 결과를 보여졌다. 이를 기반으로 다음 대회에서 반영할 수 있도록 하겠다. </li>
</ul>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/2b53845b-2b2d-43b5-8323-48801643c875/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[스터디모임2]]></title>
            <link>https://velog.io/@terry_9996/%EC%8A%A4%ED%84%B0%EB%94%94%EB%AA%A8%EC%9E%842</link>
            <guid>https://velog.io/@terry_9996/%EC%8A%A4%ED%84%B0%EB%94%94%EB%AA%A8%EC%9E%842</guid>
            <pubDate>Sun, 17 Dec 2023 12:53:05 GMT</pubDate>
            <description><![CDATA[<p>보라 - 인코더
노랑 - 디코더 </p>
<p>피라미드 -&gt; concat 진행하여 (채널) 
linear layer -&gt; channel 수 맞춰서 진행 </p>
<p>i = set of pixel image (대문자 I) 
k = 1x1 conv -&gt; BN -&gt; Relu
K = class K 
g = 1x1 conv -&gt; BN -&gt; Relu
p = 1x1 conv -&gt; BN -&gt; Relu
omega  = 1x1 conv -&gt; BN -&gt; Relu
m틸다 = softmax 취한 soft object regions  </p>
<hr>
<p>swin transformer
쪼개진 window 9개를 가지고 cyclic shift로 
shift window self-attention로 인하여 위치를 변경하며
attention영향을 받도록 해준다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Swin transformer V2]]></title>
            <link>https://velog.io/@terry_9996/Swin-transformer-V2</link>
            <guid>https://velog.io/@terry_9996/Swin-transformer-V2</guid>
            <pubDate>Sun, 17 Dec 2023 07:23:21 GMT</pubDate>
            <description><![CDATA[<p>vit의 업그레이드 버전으로 생각하자. </p>
<hr>
<h2 id="vit">vit</h2>
<ul>
<li>연산량이 image 크기의 제곱에 비례함. (high resolution task를 수행하지 못함)</li>
<li>계측정 구조가 아님 (Object Detection 못함, 백본의 역할(내부)어려움)</li>
</ul>
<hr>
<h2 id="swin-transformer">swin transformer</h2>
<ul>
<li>연산량이 window 수에 선형적인 증가임. (high resolutuon 수행함)</li>
<li>계측적 representation 수행함.(Object Detection, 백본의 역할 모두 가능)
<img src="https://velog.velcdn.com/images/terry_9996/post/ed3e0d82-7a87-4d53-8460-5aaf5fefa511/image.png" alt=""></li>
</ul>
<h4 id="1-patch-분할-선형-embedding">1. patch 분할, 선형 embedding</h4>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/326f7a04-a0b5-453f-93fa-ebee2c614ef3/image.png" alt=""></p>
<p>인풋 이미지가 16x16x3이 들어왔다고 가정하면, 하나의 patch크기를 4x4라고 하자.
지금 사진의 왼쪽처럼 16개의 patch가 존재하게 되고, 16개의 patch들을 fatten을 이용하며, 현재 빨강 patch1개을 1-d로 표현하게 되면, input이미지는 가운데 사진처럼 4x4x48의 벡터로 표현되게 된다.(이때 48은 RGB 각 16+16+16)</p>
<p>다음으로 서현 embedding으로 사영하여 4x4xC(채널)로 표현하게 된다. 현재 swin-transformer의 base에서 96을 이용하고 있다. 즉 linear embedding을 거치고 나온 4x4x96으로 되어진 결과이다. </p>
<hr>
<h4 id="2-patch-merging">2. patch Merging</h4>
<p>다음으로, swin transformer에서는 2번, 3번, 4번 구조에서 patch merging을 진행한다. </p>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/80d1dbf9-d6c4-484b-a975-0c1dfa8d2527/image.png" alt=""></p>
<p>일단 입력으로, 방금 liner embedding으로 인한 4x4x96(C)의 벡터들을, 2x2 patch를 이용하여 merge(concat 4C == C + C + C + C)를 진행하게 된다. 즉 1,2,5,6에 해당하는 4x4xC의 값들을 merge 하게 되어 2x2x4C가 되는 것이다. </p>
<p>다음으로 다시 linear embedding을 사영하여서 4C -&gt; 2C로 한다. 
최종적으로는 2x2x2C가 되는 벡터로(Resolutuon 1/2배, 차원은 2배) 이 뜻은, CNN에서 feature map에서 2배 늘리면, channel수를 2배로 늘리게 된 것으로 유사하다고 이해한다. </p>
<hr>
<h2 id="transformer-block">Transformer Block</h2>
<p>Window-transformer block이라고 얘기함. 
2개의 연속된 transformer로 구성되어져 있음. Two swin transformer</p>
<h3 id="1-앞쪽왼쪽은-인코더-부분의-w-msa는-self-attention">1. 앞쪽(왼쪽)은 인코더 부분의 W-MSA는 self-attention</h3>
<ul>
<li><p>patch내에 해당하는 image들을 여러개의 window(개별적)으로 나눠서 window안에서만 self-attention을 진행하는 것임. 
<img src="https://velog.velcdn.com/images/terry_9996/post/f0d89dba-298c-4b12-b82c-083222c09e44/image.png" alt=""></p>
</li>
<li><p>local window의 개수만큼 self-attention이 증가한다고 볼 수 있음.</p>
</li>
<li><ul>
<li>추가로, 같은 window 즉 같은 위치에만 self-attention으로 다른 곳에는 영향을 주는 것인지는 확인할 수 없음. (이를 해결하기 위해 SW-MSA)
<img src="https://velog.velcdn.com/images/terry_9996/post/6c0432ce-bf4b-4747-aab4-6b94d9278d3f/image.png" alt=""></li>
</ul>
</li>
<li><p>4개의 window에서 4개의 self 어탠션이 독립적으로 head만큼 계산이된다. </p>
</li>
<li><p>어탠션 계산은 버전 1에서는 기존과 같지만, 버전 2에서는 다르다. --&gt; 설명 밑에서 진행.</p>
</li>
</ul>
<h3 id="2-뒤쪽오른쪽은-sw-msa-shift-window-self-attention">2. 뒤쪽(오른쪽)은 SW-MSA, shift window self-attention</h3>
<ul>
<li><p>기존의 W-MSA의 같은 window에만 self-attention의 영향이 가기에, 다른 window간에도 영향이 갈 수 있도록 보완해준다. </p>
</li>
<li><p>SW-MSA실행시에 Window 개수는 : 증가함( (($N_h / M$)+1) * (($N_W / M$) + 1))
<img src="https://velog.velcdn.com/images/terry_9996/post/07eede9b-7298-497f-b693-767f8f3e4c82/image.png" alt=""></p>
</li>
<li><p>ex) 하나의 image에 patch의 수가 8x8이고, 하나의 window에 patch의 수가 4x4. 이라면, SW-MSA의 Window의 수는 3x3으로 된다. </p>
</li>
<li><p>추가, window의 수가 증가하면, 계산량이 증가하는데, 이를 cyclic shift와 attention mask를 통해서 W-MSA와 동일한 window의 개수를 사용하게 된다. 즉 W-MSA와 동일한 계산량으로 한다.</p>
</li>
</ul>
<h4 id="1-cyclic-shift">1. cyclic shift</h4>
<p><img src="https://velog.velcdn.com/images/terry_9996/post/f4330e09-b3e9-4979-847c-30da77d238e4/image.png" alt=""></p>
<ul>
<li>3x3 window를 A,B,C에 해당했던 Window들을 sifht를 진행하여 변경함. </li>
</ul>
<h4 id="2-attention-mask">2. attention mask</h4>
<ul>
<li><p>cyclic shift를 진행하고서, 같은 내의 window A,B,C는 서로 이웃임에도 서로 이미지내에 영향이없기에 attention을 바로 진행하게 된다면 서로 연관이 없는 이미지가 서로 영향을 주기 때문에, 서로 연관하지 않도록 MASK를 진행하고서, 서로 연관이 없는 부분은 self-attention이 되지 않도록 막아줌. </p>
</li>
<li><p>추가로, 다음 swin transformer block에서도 사용할 수 있도록 reverse shift도 진행한다. </p>
</li>
</ul>
<hr>
<h2 id="swin-transformer-block-v2">swin transformer block V2</h2>
<p>기존의 v1에서는 self-attention 계산이 동일하지만, v2에서는 다르게 계산이 된다. 
이는 기존의 $Q$$K^T$ 의 방식에서 scaled Cosine를 반영하도록 한 것이다. </p>
<h3 id="log-spaced-cpb">log-spaced CPB</h3>
<ul>
<li>bias로 더해주는 것으로, log스케일로 변환하여서 기존v1에서 해상도가 커지게 되며, 상대좌표가 커지게 되는 것을 막아주기 위해 진행함.</li>
</ul>
<h4 id="relative-coordinates-상대좌표">relative coordinates 상대좌표</h4>
<ul>
<li><p>window 수 3이라 가정하면, x축과 y축의 상대좌표를 구함. x축 기준 아래로 내려가면 -1, 위로 올라가면 +1 // y축으로는 오른쪽 가면 -1, 왼쪽으로가면 +1이 된다. </p>
</li>
<li><p>구해진 상대좌표를 log scaled 진행한다. 
<img src="https://velog.velcdn.com/images/terry_9996/post/b835d1d4-07f5-4e02-9db2-2b917450afca/image.png" alt=""> </p>
</li>
<li><p>추가로 Continous relative position bias -&gt; MLP</p>
</li>
<li><p>Architecture의 하이퍼 파라미터는 실습시, C=96, layer는 2,2,6,2 이지만 사실 layer는 1,1,3,1임 왜냐하면 swin transformer가 2개(W-MSA, SW-MSA)때문이다.</p>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>