<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>on_board.log</title>
        <link>https://velog.io/</link>
        <description>Hello!</description>
        <lastBuildDate>Wed, 25 Jan 2023 05:58:42 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>on_board.log</title>
            <url>https://velog.velcdn.com/images/on_board/profile/03140f57-3c14-457b-8f02-700c45adc3b8/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. on_board.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/on_board" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[데이터 제작 대회 Wrap-up]]></title>
            <link>https://velog.io/@on_board/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%9C%EC%9E%91-%EB%8C%80%ED%9A%8C-Wrap-up</link>
            <guid>https://velog.io/@on_board/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%9C%EC%9E%91-%EB%8C%80%ED%9A%8C-Wrap-up</guid>
            <pubDate>Wed, 25 Jan 2023 05:58:42 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="대회-개요">대회 개요</h2>
</blockquote>
<h3 id="주제">주제</h3>
<ul>
<li>데이터 제작 및 수정을 통한 이미지 속 글자 검청 성능 개선 대회</li>
</ul>
<h3 id="개요">개요</h3>
<ul>
<li>데이터가 학습에 미치는 영향을 확인하기 위해 데이터 제작 및 수정이 가능하다.</li>
<li>데이터의 영향력을 확인하기 위해 모델, Optimizer 변경은 불가하고 Augmentation만 가능하다.</li>
</ul>
<h3 id="데이터">데이터</h3>
<ul>
<li>ICDAR_Korean 데이터셋 536장 + Upstage Annotation Tool로 제작한 974장</li>
<li>총 Annotation 21,183개</li>
<li>아래 그래프는 이미지 당 Annotation의 수, Annotation 넓이 분포, Annotation 형태의 분포</li>
</ul>
<p><img src="https://velog.velcdn.com/images/on_board/post/581ec667-e798-4b58-abb4-ecd70bbb1ae4/image.png" alt=""></p>
<blockquote>
<h2 id="문제-정의">문제 정의</h2>
</blockquote>
<h3 id="1-annotation의-불규칙성">1. Annotation의 불규칙성</h3>
<ul>
<li>Upstage Annotation Tool로 제작한 데이터는 다수의 사람이 참여하였고, 최종 검수 작업이 없었다. 그 결과 Annotation에 일관성이 없었다.</li>
</ul>
<h3 id="2-데이터의-불균형">2. 데이터의 불균형</h3>
<ul>
<li>세로로 쓰인 글자와 곡선 형태의 글자가 가로로 쓰인 글자보다 현저하게 적었다.</li>
</ul>
<h3 id="3-곡선-형태-annotation-처리">3. 곡선 형태 Annotation 처리</h3>
<ul>
<li>제공된 Baseline 코드에서는 사각형의 형태의 Bounding Box만 학습이 가능하여, 곡선 형태의 글자에 대한 전처리가 필요했다.</li>
</ul>
<blockquote>
<h2 id="데이터-제작-및-검수--augmentation">데이터 제작 및 검수 &amp; Augmentation</h2>
</blockquote>
<h3 id="데이터-제작-및-검수">데이터 제작 및 검수</h3>
<ul>
<li>Upstage Annotation Tool을 이용하여 다수가 데이터 제작에 참여하였지만, 최종 검수하는 작업이 없었다. 그래서 팀 내에서 시각화 작업을 통해 통일된 규칙으로 데이터를 검수하였다.</li>
<li>다각형 형태의 Annotation의 경우, 사각형 형태로 변환을 해야 학습이 가능했다. 그래서 다각형의 최대 X, Y 좌표와 최소 X, Y 좌표를 이용하여 다각향 전체를 포함할 수 있는 사각형으로 변환하였다.</li>
</ul>
<h3 id="augmentation">Augmentation</h3>
<ul>
<li>글자 이미지의 경우 상하 좌우가 명확하게 구분되기 때문에 Flip을 이용한 Augmentation은 진행하지 않았다. </li>
<li>글자 이미지의 특성상 글자와 배경의 경계가 명확해야 글자를 인식하기 수월하다고 판단하였고, CLAHE를 적용하여 경계선이 명확해지는 효과를 주었다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/on_board/post/6780c079-7fa9-43e1-aa86-1fbac04634a7/image.png" alt=""></p>
<blockquote>
<h2 id="개인-회고">개인 회고</h2>
</blockquote>
<ul>
<li>데이터를 추가하고 수정하는 것만으로 유의미한 성능 향상으로 이어졌고, 이런 경험을 통해 데이터의 중요함을 다시 느낄 수 있었다.</li>
<li>또한 이미지의 특성에 맞는 Augmentation만으로 성능을 높일 수 있음을 확인하였다.</li>
<li>다만 외부 데이터를 추가하여 어느 정도 Noise가 존재하는 데이터의 증가가 성능 향상으로 이어지는 확인하는 실험을 진행하지 못한 점이 아쉬웠다.</li>
<li>일주일이라는 대회 기간 동안 데이터에만 집중하여 다양한 시사점을 얻을 수 있었고 이를 추후 진행할 대회와 프로젝트에 적극적으로 적용할 계획이다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Image Classification 대회 Wrap-up]]></title>
            <link>https://velog.io/@on_board/Image-Classification-%EB%8C%80%ED%9A%8C-Wrap-up</link>
            <guid>https://velog.io/@on_board/Image-Classification-%EB%8C%80%ED%9A%8C-Wrap-up</guid>
            <pubDate>Wed, 18 Jan 2023 13:58:18 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="대회-개요">대회 개요</h2>
</blockquote>
<h3 id="주제--마스크-착용-상태-분류">주제 : 마스크 착용 상태 분류</h3>
<ul>
<li>카메라로 촬영한 사람 얼굴 이미지의 마스크 착용 상태와 나이, 연령대를 판단하는 Task</li>
</ul>
<h3 id="개요">개요</h3>
<ul>
<li>마스크 착용 상태 (Wear, Incorrect, Not Wear ), 
성별 (Male, Female), 
연령 (30세 미만 = young, 30세 이상 60세 미만 = middle, 60세 이상 = old)
을 기준으로 총 18개의 클래스로 분류하면 된다.</li>
<li>평가는 F1 Score를 통해 진행된다.</li>
</ul>
<h3 id="데이터">데이터</h3>
<ul>
<li>전체 사람 수 : 4,500명</li>
<li>한 사람당 사진의 개수 : 7 (마스크 착용 5장, 미착용 1장, 오착용 1장)</li>
<li>이미지 크기 : (384, 512)</li>
<li>전체 데이터셋(31,500장) 중 학습 데이터는 60%(18,900장)이다.</li>
</ul>
<blockquote>
<h3 id="대회-timeline">대회 Timeline</h3>
</blockquote>
<ul>
<li>10/24 ~ 10/26 : Domain Study</li>
<li>10/27 ~ 10/30 : 실험 기획 및 통제 변인 설정</li>
<li>10/27 ~ 10/30 : 기본 모델 선정</li>
<li>10/30 ~ 11/01 : 모델 Custom</li>
<li>11/01 ~ 11/03 : Hyperparameter Tuning</li>
<li>11/03 : 대회 종료</li>
</ul>
<blockquote>
<h3 id="문제-정의">문제 정의</h3>
</blockquote>
<ol>
<li><p>EDA 결과, Data Imbalance가 존재했다. 남여 비율은 6:4로 큰 차이는 없었지만, 60대 이상을 나타내는 &#39;Old&#39;가 약 7.3%로 매우 낮은 비율을 차지했다. 또한 &#39;Middle&#39;과 &#39;Old&#39;의 경계선 부분의 데이터 밀도가 높다는 문제가 있다.
<img src="https://velog.velcdn.com/images/on_board/post/05d04f23-6b98-4965-8fd9-3e6c55596a7d/image.png" alt=""></p>
</li>
<li><p>마스크 착용 상태, 성별, 연령대를 서로 다른 모델로 학습 후 인코딩을 통해 Label을 추론하는 방법과 3가지 카테고리를 단일 Task로 가정하여 추론하는 방법을 선택해야 했다.</p>
</li>
</ol>
<p>주어진 문제를 해결하기 위해 아래와 같은 방법에 대해 고민을 하였다.
<img src="https://velog.velcdn.com/images/on_board/post/b5e8d16b-d57a-44b5-8598-1395e4844dff/image.png" alt=""></p>
<blockquote>
<h3 id="dataset-구성">Dataset 구성</h3>
</blockquote>
<p>EDA 중 알게 된 Class Imbalance 문제를 해결하기 위해 Weigthed Random Sampler를 이용하여 비중이 낮은 Class에 가중치를 주어 학습 과정에서 자주 학습될 수 있도록 하였다.</p>
<blockquote>
<h3 id="model-search">Model Search</h3>
</blockquote>
<ul>
<li>모델은 EfficientNet으로 고정하였다. 이유는 대회를 진행하기 전 EfficientNet 논문 스터디를 진행하여 EfficientNet을 직접 실험함으로써 이해도를 더 높이고자 했기 때문이다.</li>
<li>주어진 데이터의 Input Size가 (384, 512)이기 때문에 EfficientNet의 논문에서 제시한 Input Size를 고려하여 Input Size가 (380, 380)인 B4 모델부터 실험을 진행하였다.</li>
</ul>
<blockquote>
<h3 id="task-세분화">Task 세분화</h3>
</blockquote>
<p>앞서 문제 정의에서 언급했듯이 모델 관점에서 문제를 해결하기 위한 방법을 두 가지로 추렸다. </p>
<ol>
<li>모델를 학습시켜 총 18개의 class를 구분하는 방법 </li>
<li>Category(마스크 착용 상태, 성별, 연령대)를 분리하여 따로 학습 시킨 후 각 출력값을 인코딩하는 방법</li>
</ol>
<p>이 중 두 번째 방법을 먼저 선택하여 실험을 진행했다. 그 이유는 Task를 분리함으로써 하나의 모델이 표현해야 하는 Feature Map이 단순해져 최적화가 쉬워질 것이라고 생각했기 때문이다. 그리고 Young, Middle, Old의 Decision Boundary가 명확해지는 효과가 있을 것이라 생각했다.</p>
<p>하지만 단일 모델의 성능과 비교했을 때 Task를 세분화한 실험의 성능이 낮았다. 이에 대한 개인적인 결론은 다음과 같다.</p>
<ul>
<li><p>불명확한 기준
나이대를 구분할 수 있는 명확한 특징이 존재하지 않기 때문에 얼굴을 바탕으로 구분하는 것은 한계가 있었다. 그래서 나이를 분류하는 모델의 정확도가 다른 모델에 비해 낮은 정확도를 보였다고 생각한다.</p>
</li>
<li><p>오류의 중복
각 모델의 정확도가 90%로 동일하다면, 세 모델이 모두 올바른 label을 출력할 확률은 72.9%이다. 즉 각 Task에 대해서는 높은 성능을 낼 수 있지만, 이를 종합하는 과정에서 오류의 중복으로 정확도가 떨어졌다고 판단했다. 그리고 나이에 대한 낮은 성능이 결과를 더 악화시켰다고 판단했다.</p>
</li>
</ul>
<p>이러한 실험 결과로 인해 최종 모델은 Task를 세분화하지 않고 18개의 Class를 구분하는 방법으로 진행하였다.</p>
<blockquote>
<h3 id="실험-관리">실험 관리</h3>
</blockquote>
<p>모델이 확정된 이후에는 통제변인을 설정 후 하나의 조작변인만 변화시키며, 현재 모델의 최적의 Augmentation, Loss function, Optimizer를 탐색하는 실험과 Hyperparameter Tuning을 진행하였다.</p>
<blockquote>
<h3 id="개인-회고">개인 회고</h3>
</blockquote>
<ol>
<li><p>실험 관리 미숙
머신러닝 대회를 처음 접해 실험 관리에서 아쉬운 점이 많았다. 여러 개의 변인을 한 번에 조작하여 결과 도출의 원인을 파악하지 못해 다시 실험을 진행한 경우도 많았으며, 모델 실험의 기준을 정하지 못해 일관성 없는 실험도 진행하였다.</p>
</li>
<li><p>문제에 대한 고찰 부족
문제를 정확히 파악하지 않고 실험을 진행하여 실험 도중 문제 정의를 다시 하였다. 그 결과, 실험에 필요한 절대적인 시간이 부족해져 충분한 실험을 진행하지 못했다.</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[EfficientNet]]></title>
            <link>https://velog.io/@on_board/EfficientNet</link>
            <guid>https://velog.io/@on_board/EfficientNet</guid>
            <pubDate>Tue, 25 Oct 2022 17:15:55 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h1 id="efficientnet">EfficientNet</h1>
<p>Rethinking Model Scaling for Convolutional Neural Network</p>
</blockquote>
<ul>
<li>본 리뷰에는 잘못된 내용이 있을 수 있으므로 유의하며 읽으시길 바랍니다.</li>
</ul>
<p>논문: <a href="https://arxiv.org/abs/1905.11946">https://arxiv.org/abs/1905.11946</a></p>
<blockquote>
<h3 id="introduction">Introduction</h3>
</blockquote>
<p>기존에는 Convnet의 크기를 키우는 것(scaling up)은 더 높은 정확도를 얻기 위해 사용되었고, 
깊이(depth) 혹은 너비(width)를 키우는 것이 가장 흔한 방법이었다.</p>
<p>이 논문은 기존 방법 보다 더 높은 정확도(accuracy)와 효율성(efficiency)을 달성할 수 있는
scaling up 방법을 다룬 논문이다.</p>
<p>논문에서는 network의 너비(width), 깊이(depth), 해상도(resolution)의 균형이 중요하다는 것을 
실험을 통해 증명하였다. </p>
<p>network scaling은 baseline network에 영향을 많이 받기 때문에 neural network search를 통해 새로운 baseline network(EfficientNets)을 만들었다.</p>
<p>아래는 EfficientNet과 다른 network의 정확도와 parameter의 수를 비교한 그래프이다.
모든 면에서 EfficientNet이 앞서고 있음을 확인할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/on_board/post/6be9a0d7-edcb-4f02-a8e5-9797c346ffab/image.png" width=500 heigh=500></p></p>
<blockquote>
<h3 id="related-work">Related Work</h3>
</blockquote>
<ul>
<li><p>ConvNet Accuracy
AlexNet을 이후로 network의 크기가 커질수록 정확도도 높아졌다.
2014 ImageNet의 winner인 GoogleNet은 6.8M개의 parameter를,
2017 ImageNet의 winner인 SENet은 145M개의 parameter를 가지고 있었고,
2018 ImageNet에서는 557M개의 parameter를 가진 network가 우승을 하였다.
이처럼 network의 규모가 커지게 되면서, 이를 처리하기 위한 별도의 작업이 필요했고, 하드웨어 메모리를 한계를 마주하게 되었다.
그 결과 효율성에 대한 중요도가 높아지게 되었다.</p>
</li>
<li><p>ConvNet Efficiency
Model Compression은 효율성을 위해 network의 크기를 줄이는 한 방법이며,
그리고 최근에는(논문기준) neural architecture search를 이용하여 network의 크기를 조절하는 방법이 큰 인기를 끌고 있다. 하지만 적용해야 할 범위가 더 넓어서  더 많은 비용이 드는 큰 모델에는 어떻게 적용해야 하는지 불분명하다는 문제가 있다. 그래서 이 논문에서는 규모가 매우 큰 모델에도 적용할 수 있는 방법에 집중하였고, 이를 위해 model scaling에 집중하였다.</p>
</li>
</ul>
<blockquote>
<h3 id="compound-model-scaling">Compound Model Scaling</h3>
</blockquote>
<ol>
<li><p>Problem Formulation</p>
</li>
<li><p>Scaling Dimensions</p>
</li>
<li><p>Compund Scaling</p>
</li>
<li><p>Problem Formulation
Convnet의 구조는 아래의 수식처럼 나타낼 수 있다.
$$
N = F_{k} \odot...\odot F_{2} \odot F_{1}(X_{1}) = \bigodot_{j=1...k}F_{j}(X_{1})
$$
$F_{i}$ 는 layer $i$ 에 대한 함수이고 이를 chain rule로 위와 같이 나타낼 수 있다.
그리고 각 layer는 서로 다른 모양의 tensor를 input를 받기 때문에 이를 반영한 수식은 아래와 같다.
$$
N = \bigodot_{i=1...s} F_i^{L_{i}}(X_{⟨H_{i},W_{i},C_{i}⟩})
$$
model scaling을 할 때 각 층을 설계하면서 사용할 수 있는 자원에 대한 제약 조건을 만들어 
문제를 단순화하였다. 하지만 이러한 제약 조건에도 불구하고 $L_{i}, C_{i}, H_{i}, W_{i}$를 모두 탐색해야므로 
설계 규모는 여전히 큰 편이었다.
그래서 설계 규모를 좀 더 줄이기 위해 모든 layer는 constant ration(상수비)로 
설계해야 한다는 제약 조건을 추가하였다.
이러한 정해진 자원 속에서 model의 정확도를 최대화해야 한다는 이 논문의 목표는 
아래와 같은 수식 (Equation 2) 으로 나타낼 수 있다. ($\hat{F_{i}}, \hat{L_{i}}, \hat{H_{i}}, \hat{W_{i}}, \hat{C_{i}}$ 는 predefined parameter이다.)</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/on_board/post/4a640522-3a9f-4627-9862-0954b617b34d/image.png" width=600></p></p>
<ol start="2">
<li>Scaling Dimensions (단일 dimension만 조절)</li>
</ol>
<ul>
<li>Width ($w$)
넓은 너비의 network는 feature를 더 잘 반영할 수 있고, 학습이 쉽다는 경향이 있다.
하지만 너비만 넓은 network는 고차원 feature를 추출하기에는 어려움이 있다.
그 결과 아래 그래프에서 보이는 것처럼 $w$ (너비)가 넓어질수록 
network가 빠르게 포화(saturate) 상태에 도달하게 된다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/on_board/post/9cdb329a-1ecc-4065-83bf-871300a73d9a/image.png" width=400></p></p>
<ul>
<li>Depth ($d$)
network의 깊이가 깊어질수록 richer and complex feature를 얻을 수 있지만, 
아래 그래프처럼 깊이가 일정 수준에 도달하면 $d$ (깊이)가 커진다고 정확도의 차이는 없어진다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/on_board/post/4d7016b8-6a6c-4d7d-9046-d3c45511ef56/image.png" width=400></p></p>
<ul>
<li>Resolution ($r$)
고화질의 input image는 fine-grained pattern을 추출하는 데 도움을 줄 수 있다.
그래서 더 높은 정확도를 얻기 위해 고화질의 input image를 사용하기도 한다.
하지만 아래 그래프에서 보이듯이 $r$ (화질)이 높아질수록 증가폭이 감소하는 것을
확인할 수 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/on_board/post/ab489967-b149-41f9-88e8-9e90b153bbf0/image.png" width=400></p></p>
<ol start="3">
<li>Compund Scaling
위의 실험 결과를 보면 고화질 이미지가 처리하기 위해서는 고화질 이미지의 특징을 추출하기 위해 너비가 넓어야 하고, 추출된 풍부하고 복잡한 feature를 처리하기 위해 더 깊은 network가 필요하다는 것을 알 수 있다. 따라서 더 성능이 좋은 network를 만들기 위해서는 single dimension으로 scaling을 하는 것이 아닌 균형잡힌 compound scaling이 필요하다.
그래서 이 논문에서는 아래 그래프처럼 여러 dimension을 조절하여 실험을 진행하였고, 그래프에서 보이는 것처럼 dimension을 하나만 조절하는 것보다 $d와r$을 모두 조절한 두 경우가 성능이 더 좋다는 것을 실험적으로 증명하였다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/on_board/post/6f61ebc9-8813-4817-a5ef-6e7d318e72b9/image.png" width=500></p></p>
<p>이처럼 network의 balance를 조절하는 연구는 이전에도 있었지만, 까다로운 tuning manual를 따라야 했다.
하지만 이 논문에서는 아래와 같은 새로운 <strong><em>compound    scaling method</em></strong>를 제시하였다. (Equation 3)</p>
<p><img src="https://velog.velcdn.com/images/on_board/post/84a68530-be5e-4cc9-a6c5-dddf27555475/image.png" width=500></p></p>
<blockquote>
<h3 id="efficientnet-architecture">EfficientNet Architecture</h3>
</blockquote>
<p>model scaling은 layer operator를 바꾸지 않기 때문에 basline network의 중요도가 높다. 따라서 이 논문에서는 더 좋은 성능을 위해 새로운 baseline인 efficientNet을 만들었고 아래 table1이 EfficientNet-B0의 구조이다. </p>
<p><img src="https://velog.velcdn.com/images/on_board/post/5da652d7-8e0e-44ac-9089-3464a104236e/image.png"></p></p>
<p>이 network에 적합한 compound scaling을 위해 equation2,3의 공식을 이용하여 $\alpha, \beta, \gamma$는 1.2, 1.1, 1.15이다.
그리고 EfficientNet-B0의 결과를 이용하여 EfficientNet-B1 ~ B7도 얻어냈다.</p>
<blockquote>
<h3 id="experiments">Experiments</h3>
</blockquote>
<p>아래의 내용은 ImageNet에서 EfficientNet과 기존 network의 성능을 비교한 것이다.
(표에 있는 자세한 설명을 참고)</p>
<p><img src="https://velog.velcdn.com/images/on_board/post/54c5c390-0691-416d-900d-8b45d73d0d8b/image.png"></p></p>
<p><img src="https://velog.velcdn.com/images/on_board/post/f985da95-5377-4f15-8a1f-a2e7294692ef/image.png"></p></p>
<p><img src="https://velog.velcdn.com/images/on_board/post/8889ecd6-04d1-445c-9577-e4c07b3cdfbe/image.png"></p></p>
<p><img src="https://velog.velcdn.com/images/on_board/post/694ead70-d638-4e4b-ae26-4b3af9e895f3/image.png"></p></p>
<p><img src="https://velog.velcdn.com/images/on_board/post/456c8b63-b63c-45a7-9bb6-3ec8e7c8de75/image.png"></p></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ResNet]]></title>
            <link>https://velog.io/@on_board/ResNet</link>
            <guid>https://velog.io/@on_board/ResNet</guid>
            <pubDate>Sun, 16 Oct 2022 10:14:17 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h1 id="resnet">ResNet</h1>
<p>Deep Residual Learning for Image Recognition</p>
</blockquote>
<p>Residual Network라는 구조를 사용하여 성능을 크게 향상시킨 모델이다.</p>
<blockquote>
<h3 id="introduction">Introduction</h3>
</blockquote>
<p>network는 모델의 깊이가 깊어질수록 정확도의 증가폭이 감소(saturated)하는 degradation 문제에 노출된다. 이 논문에서는 이러한 degradation 문제를 residual learning으로 해결하고자 했으며, 그 구조는 아래와 같다.</p>
<p align='center'>
<img
src="https://velog.velcdn.com/images/on_board/post/9c599fa5-2dde-405f-a50d-e391be2c13f1/image.png" width=400></p>

<p>위 구조는 2개의 weight layer를 거친 결과와 거치기 전의 값을 합해주는 구조이다. 그리고 2개의 레이어를 거치지 않고 나오는 X identity는 shortcut connection이라고 부른다.</p>
<p>논문에서는 shortcut connection이 없는 plain net과 shortcut connection이 있는 residual net의 학습 결과를 비교하였다.
plain net은 깊이가 깊어질수록 training error가 증가하였지만,
residual net은 깊이가 깊어질수록 training error가 감소하였다.</p>
<blockquote>
<h3 id="deep-residual-learning">Deep Residual Learning</h3>
</blockquote>
<h3 id="network-architectures">Network Architectures</h3>
<ul>
<li>Plain Network
VGG net을 baseline으로 만들어졌으며, 3 X 3 convolutional layer가 적용된 구조이다. 그리고 feature map(conv layer를 거쳐서 나온 결과물)의 크기가 절반이 되면, layer에 대한 시간복잡도를 유지하기 위해 filter의 개수를 2배로 늘린다. 그리고 downsampling은 convolutional layer의 stride를 2로 설정함으로써 구현한다. network의 끝은 average pooling layer를 통과하여 softmax 함수가 적용된 fully-connected layer를 지나는 구조이다.<p align='center'>
<img
src = "https://velog.velcdn.com/images/on_board/post/f2d03b09-2461-4cbb-b310-46b1896aa0fc/image.png" width = '500'>




</li>
</ul>
<ul>
<li>Residual Network
plain network 구조에서 shortcut connection을 추가한 구조이다.
input과 output이 동일한 크기이면 shortcut에서는 추가적인 작업이 필요없지만, input과 output이 다르면(점선 화살표) 크기를 맞추기 위해 filter의 stride를 2로 설정해준다.</li>
</ul>
<p align='center'>
<img
src='https://velog.velcdn.com/images/on_board/post/12d66e3d-a1f9-4ed6-8f48-cfef0d244e88/image.png'> 위 그림은 ResNet의 일부분인 34-layer의 구조이다.


<blockquote>
<h3 id="implementation">Implementation</h3>
</blockquote>
<p>convolutional layer를 거친 결과에 batch normalization을 적용하였고, batch size는 256으로 하여 Stochastic Gradient Descent (SGD)을 이용하여 학습을 진행하였다.
learning rate는 0.1로 설정하였고, error가 변화하지 않으면 10으로 나워주었다.
학습은 최대 60 x 10^4 반복하였고, weight decay와 momentum은 각 각 0.0001, 0.9로 설정하였다.</p>
<blockquote>
<h3 id="experiments">Experiments</h3>
</blockquote>
<p align = 'center'>
<img
src = 'https://velog.velcdn.com/images/on_board/post/6301d562-46cc-4c94-a5ec-3b1d43df7e03/image.png' width = 700>

<p>위의 표는 plain network와 residual network의 구조이다.</p>
<h3 id="imagenet-classifcation">ImageNet Classifcation</h3>
<ul>
<li>Plain Networks
ImageNet에서 plain network의 18-layer와 34-layer의 training error와 validation error를 비교해본 결과, 34-layer의 error가 높게 나오는 degradation 문제가 발생하였다. 그리고 이런 현상은 실험에서 관찰해본 결과 vanishing gradient로 인해 발생한 문제가 아니었다.</li>
</ul>
<p align = 'center'>
<img
src = 'https://velog.velcdn.com/images/on_board/post/25c6b6c7-54e1-4d96-8bbc-e666a13028fb/image.png' width = 500>
    Bold curve is validation error, the other is training error


<ul>
<li>Residual Networks
  Shortcut connection을 사용한 residual networks에서는 network가 깊어질수록 training error와 validation error가 감소하였다.</li>
</ul>
<p aling = 'center'>
<img
src = 'https://velog.velcdn.com/images/on_board/post/5ff7f446-fd58-4a1e-b97e-95695d025b0c/image.png' width = 500>

<ul>
<li>다른 모델과 비교했을 때도 network가 깊어질수록 정확도가 올라가는 것을 확인할 수 있다. 그리고 shortcut의 유형을 변경함으로써 network의 성능을 더 높이는 것이 가능함을 실험적으로 증명하였다.</li>
</ul>
<p aling = 'center'>
<img
src = 'https://velog.velcdn.com/images/on_board/post/99b7a0dc-d919-4f8b-9031-b7385ae53298/image.png' width = 500>


<p>50-layer와 101-layer, 152-layer에는 아래와 같은 bottlenect 구조로 layer들이 연결되어 있고, shorcut은 parameter-free indentity shorcut을 이용하여 더 효율적으로 network가 작동하도록 하였다.</p>
<p aling = 'center'>
<img
src = 'https://velog.velcdn.com/images/on_board/post/336a0f6b-d17d-42d2-9096-50e14f6c83e0/image.png'> 


<p>참조 
<a href="https://arxiv.org/abs/1512.03385">https://arxiv.org/abs/1512.03385</a>, Deep Residual Learning for Image Recognition</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AlexNet]]></title>
            <link>https://velog.io/@on_board/AlexNet</link>
            <guid>https://velog.io/@on_board/AlexNet</guid>
            <pubDate>Sun, 09 Oct 2022 05:28:12 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h1 id="alexnet">AlexNet</h1>
</blockquote>
<h4 id="imagenet-classfication-with-deep-convolutional-neural-networks">ImageNet Classfication with Deep Convolutional Neural Networks</h4>
<p>논문의 명은 &#39;ImageNet Classfication with Deep Convolutional Neural Networks&#39;이지만, 논문의 저자 이름을 따서 해당 모델을 &#39;AlexNet&#39;이라고 부른다.</p>
<blockquote>
<h3 id="1-introduction">1. Introduction</h3>
</blockquote>
<p>도입부에서 밝힌 이 논문의 기여(contribution)는 ILSVRC-2010, ILSVRC-2012 대회에서 제공된 데이터셋을 이용한 결과물 중에 최고의 결과를 달성했다는 것이다.</p>
<p>그리고 네트워크의 성능을 향상 시키고 학습 시간을 줄이는 새롭고 독특한 특징(ReLU, Multiple GPU, Local Response Normalization, Overlapping Pooling)을 사용했다는 점도 꼽을 수 있다.</p>
<p>또한 overfitting 문제를 해결하였으며, 고성능 GPU와 더 많은 데이터가 있다면 성능을 향상시킬 수 있음을 실험적으로 제안하였다.</p>
<ol>
<li>ILSVRC-2010, ILSVRC-2012에서 best result</li>
<li>ReLU, Multiple GPU, Local Response Normalization, Overlapping Pooling</li>
</ol>
<blockquote>
<h3 id="2-the-dataset">2. The Dataset</h3>
</blockquote>
<p>ImageNet은 22,000개의 범주에 속하는 1500만 개의 데이터셋이다.
대회에서는 ImageNet의 부분 데이터로 학습을 진행하며, 부분 데이터는 120만 개의 데이터로 구성되어 있고, 이미지의 종류는 1000개이다. 
이 논문에서는 학습을 위해 이미지를 256 * 256으로 해상도를 조절하였다.</p>
<blockquote>
<h3 id="3-the-architecture">3. The Architecture</h3>
</blockquote>
<p><img src="https://velog.velcdn.com/images/on_board/post/44f6f42e-5a36-417a-96b5-0d128b964355/image.png" alt=""></p>
<ul>
<li>AlexNet은 5개의 convolutinal layer와 3개의 fully-connected layer로 구성되어 있다.</li>
</ul>
<ol>
<li><p><strong>ReLU (Rectified Linear Unit)</strong>
ReLU를 이용하여 tanh를 이용할 때보다 몇 배 더 빠르게 학습을 시켰다.
ReLU(실선), tanh(점선)
<img src="https://velog.velcdn.com/images/on_board/post/dd4d5155-c739-4440-b353-d5b6a1ddfd4f/image.png" height="400px" width="400px"></p></p>
</li>
<li><p><strong>Multiple GPU</strong>
2개의 GPU를 사용하여 크기가 큰 네트워크를 학습하였다. (GPU를 두 개 사용하는 것이 한 개 사용하는 것보다 약간 더 빠르다, the two-GPU net takes slightly less time to train than the one-GPU net)</p>
</li>
<li><p><strong>Local Response Normalization</strong>
convolutional layer와 max pooling layer를 거칠 때, 높은 픽셀값이 있으면 주변 픽셀에 영향을 주게 되고, 이는 학습에 부정적인 영향을 끼친다. 따라서 LRN을 사용하여 높은 픽셀값이 주변에 영향을 주지 않도록 측면 언제를 적용하였다.</p>
</li>
<li><p><strong>Overlapping Pooling</strong>
stride를 조절하여 필터들이 겹치게 하였다. 그 결과 top-1과 top-5에서 error rate가 0.4%, 0.3% 줄었다.</p>
</li>
</ol>
<blockquote>
<h3 id="4-reducing-overfitting">4. Reducing Overfitting</h3>
</blockquote>
<ol>
<li><p>Data Augmentation을 위해 이미지 좌우반전, 특정부분을 무작위로 224 * 224 크기의 이미지 추출, 이미지의 RGB 체널을 바꾸는 기법을 사용하였다.</p>
</li>
<li><p>Dropout을 첫 번째, 두 번째 fully-connected layer에 적용하였다.</p>
</li>
</ol>
<blockquote>
<h3 id="5-details-of-learning">5. Details of learning</h3>
</blockquote>
<ol>
<li>SGD를 이용하여 학습을 진행하였고, momentum(0.9)과 weight decay(0.0005)를 적용하였다.</li>
<li>weight는 표준편차가 0.01, 평균이 0인 가우시안 분포를 따르도록 초기화하였다.</li>
<li>2,4,5, fully-connected layer들의 bias값은 상수 1로 초기화하였고, 다른 층 bias는 0으로 초기화하였다.</li>
<li>모든 층의 learning rate를 0.01로 동일하게 적용하였고, 학습은 총 90회 반복하였다.</li>
</ol>
<blockquote>
<h3 id="6-results">6. Results</h3>
</blockquote>
<p>ILSVRC-2010의 결과는 아래 표와 같다. Top-1은 모델이 예측한 가장 가능성이 높은 첫 번째 대상을 의미한다. Top-5는 가장 가능성이 높은 상위 5개를 의미하는 것이다. 그 결과 Top-1에서의 error rate은 37.5%, Top-5에서는 17.0%를 기록하였다. (_italics_으로 쓰인 모델은 다른 이의 모델이다)
<img src="https://velog.velcdn.com/images/on_board/post/642595de-b69d-47cf-b01f-76a6e081d855/image.png" height="400px" width="400px"></p></p>
<p>ILSVRC-2012의 결과는 아래 표와 같다. 이 논문에 나온 CNN 모델의 Top-5 (val) error rate은 18.2%를 기록하였고(1 CNN), 유사한 5개의 CNN 모델에 대해서는 16.4%를 기록하였다(5 CNNs).
마지막 pooling layer에 6번째 convolutional layer를 추가한 모델은 16.6%의 error rate을 기록하였고(1 CNN), 앞에서 언급한 유사한 5개의 CNN 모델(5 CNNs)과 pre-train된 모델의 예측에 대한 error rate을 평균한 값은 15.3%를 달성하였다.(7 CNNs) (_italics_으로 쓰인 모델은 다른 이의 모델이고, *표시는 ImageNet 2011으로 pre-trained된 모델을 의미한다.)</p>
<p><img src="https://velog.velcdn.com/images/on_board/post/a5a9b407-3568-4397-a917-12f910fb9d70/image.png
" height="500px" width="500px"></p></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Exception & File & Log Handling]]></title>
            <link>https://velog.io/@on_board/Exception-File-Log-Handling</link>
            <guid>https://velog.io/@on_board/Exception-File-Log-Handling</guid>
            <pubDate>Sun, 25 Sep 2022 14:46:34 GMT</pubDate>
            <description><![CDATA[<ul>
<li>AI_TECH Week1 Day2</li>
<li>이 포스팅에서는 코드 작성법을 다루지 않습니다.</li>
</ul>
<blockquote>
<h3 id="exception-예외처리">Exception (예외처리)</h3>
</blockquote>
<p>예외처리를 통해 프로그램에서 발생할 수 있는 오류들을 처리할 수 있다.
보통은 try, except를 이용하고, 필요에 따라 raise, assert 구문을 사용한다.</p>
<p>예외의 종류</p>
<ul>
<li>IndexError: List의 index 범위를 넘어갈 때</li>
<li>NameError: 존재하지 않은 변수를 호출할 때</li>
<li>ZeroDivisionError: 0으로 숫자를 나눌 때</li>
<li>ValueError: 변환할 수 없는 문자/숫자를 변환할 때</li>
<li>FileNotFoundError: 존재하지 않는 파일을 호출할 때</li>
</ul>
<ul>
<li>더 많은 예외가 있기 때문에 필요할 때 검색하면 됨</li>
</ul>
<blockquote>
<h3 id="file-handling">File Handling</h3>
</blockquote>
<p>파일은 text(문자열 형태)와 binary(이진법 형태)로 구분할 수 있다.
파일을 open 함수로 열게 되면 close 함수를 이용하여 닫아주어야 하고,
with 구문을 이용하면 파일을 닫는 과정을 생략할 수 있다.</p>
<p>파일을 열 때 &#39;r(읽기모드)&#39;, &#39;w(쓰기모드)&#39;, &#39;a(추가모드)&#39; 중에서 필요에 맞는 접근 모드로 열어야 한다.
** 인코딩 문제가 있다면, encoding=&#39;utf8&#39;을 이용하면 된다.</p>
<ul>
<li>readlines() - 한 줄씩 리스트 형태로 저장</li>
<li>readline() - 한 줄만 불러옴 (순차적으로)</li>
</ul>
<blockquote>
<h3 id="log-handling">Log Handling</h3>
</blockquote>
<p>프로그램 실행 중에 생기는 정보를 log 라고 한다.
&#39;logging&#39; 모듈으로 구현할 수 있다.</p>
<p>로그의 Level</p>
<ul>
<li><p>DEBUG &gt; INFO &gt; WARNING &gt; ERROR &gt; Critical</p>
</li>
<li><p>debug: 개발시 처리 기록을 남겨야하는 로그 정보를 남김 
ex) 함수 A를 호출함, 변수 B를 무엇으로 변경</p>
</li>
<li><p>info: 처리가 진행되는 동안의 정보를 알림 
ex) 서버 시작 종료, user A 접속</p>
</li>
<li><p>warning: 사용자가 잘못 입력한 정보나 처리는 가능하나 
원래 의도와는 정보가 들어왔을 때 알림</p>
</li>
<li><p>error: 잘못된 처리로 인해 에러가 났으나, 프로그램은 동작할 수 있음</p>
</li>
<li><p>critical: 잘못된 처리로 데이터 손실이나 
더이상 프로그램이 동작할 수 없음을 알림</p>
</li>
</ul>
<p>**파이썬에서는 warning부터 화면에 출력되므로, 이를 조절하기 위해서는 logging.basicConfig(level=logging.DEBUG) 처럼 log level을 설정해야 한다.</p>
<p>로그의 저장</p>
<ul>
<li><p>configparser: 프로그램 실행 설정을 file에 저장하여, 호출하여 사용
  .cfg 형태로 파일을 저장하고 호출해야 함</p>
</li>
<li><p>argparser: 콘솔창에서 프로그램 실행시 setting 정보를 저장함</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[OOP, Module, Package]]></title>
            <link>https://velog.io/@on_board/OOP-Module-Package</link>
            <guid>https://velog.io/@on_board/OOP-Module-Package</guid>
            <pubDate>Sun, 25 Sep 2022 13:10:41 GMT</pubDate>
            <description><![CDATA[<ul>
<li>AI_TECH Week1 Day1</li>
<li>이 포스팅에서는 코드 작성법을 다루지 않습니다.</li>
</ul>
<blockquote>
<h3 id="객체지향-프로그래밍">객체지향 프로그래밍</h3>
<p>OOP (Object Oriented Programming)</p>
</blockquote>
<p>OOP의 핵심은 class를 이용하여 instance를 구현하는 것이다.</p>
<p>여기서 말하는 class와 instance의 관계는 레시피와 요리의 관계라고 볼 수 있다.</p>
<p>음식 만드는 방법(객체를 생성하는 방법)은 레시피(class)에 나와 있지만 실제로 만들 때는 재료 양(속성)을 바꿀 수 있다.</p>
<p>즉, 클래스 안에는 객체를 생성할 때 필요한 내용들이 있지만 객체를 선언할 때 객체의 속성은 바꿀 수 있다.</p>
<blockquote>
<p>인스턴스와 객체</p>
</blockquote>
<p>a = Recipe() 라는 코드가 있을 때, 
a는 객체(object)라고 하고, a는 Recipe 클래스의 인스턴스라고도 부른다.
즉, class와의 관계를 설명할 때는 인스턴스, a를 지칭할 때는 객체라고 부른다. </p>
<h5 id="메서드method와-함수function도-객체와의-관계로-구분할-수-있다">메서드(method)와 함수(function)도 객체와의 관계로 구분할 수 있다.</h5>
<h5 id="참조-httpswikidocsnet28">&lt;참조&gt; <a href="https://wikidocs.net/28">https://wikidocs.net/28</a></h5>
<blockquote>
<p>OOP의 특징 (상속, 다형성, visibility)</p>
</blockquote>
<p>상속 (inheritance)</p>
<ul>
<li>부모(상위) 클래스의 attribute, method를 자식(하위) 클래스가 접근 가능하도록 해줌</li>
</ul>
<p>다형성 (Polymorphism)</p>
<ul>
<li>같은 이름의 메서드를 내부 로직에서 다르게 사용하는 것을 말함</li>
<li>ex) &#39;Animal&#39; 이라는 클래스를 상속한 &#39;Dog&#39; 클래스와 &#39;Cat&#39; 클래스는 talk() 라는 동일한 메서드가 있지만, &#39;Dog&#39; 클래스에서는 talk의 반환값으로 &#39;멍멍&#39; 이 반환되고, &#39;Cat&#39; 클래스에서는 &#39;야옹&#39;이 반환된다.</li>
</ul>
<p>Visibility</p>
<ul>
<li>객체의 정보에 대한 접근 정도를 제한하는 것을 의미함</li>
<li>캡슐화 혹은 정보 은닉이라고 부름</li>
<li>decorator를 활용하여 사용 가능</li>
</ul>
<hr>
<p>Tip. 파이썬의 모든 함수는 일급함수(first-class object)</p>
<ul>
<li>일급함수는 변수나 데이터 구조에 할당할 수 있는 객체</li>
<li>객체를 파라미터나 반환값으로 사용 가능</li>
</ul>
<hr>
<blockquote>
<h3 id="module--package">Module &amp; Package</h3>
</blockquote>
<p>Module</p>
<ul>
<li>~.py 형태로 저장</li>
<li>import를 이용하여 호출</li>
<li>from, import를 이용하여 호출 범위 설정 가능</li>
</ul>
<p>Package</p>
<ul>
<li>모듈이 모여서 package가 됨</li>
<li>페키지를 대중에게 공개하면 Project라고 함</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>