<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jun-yong.log</title>
        <link>https://velog.io/</link>
        <description>도전하는 개발자 지망생</description>
        <lastBuildDate>Sat, 04 Mar 2023 08:25:40 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jun-yong.log</title>
            <url>https://velog.velcdn.com/images/jun_yong_1569/profile/74de11e8-7660-459a-bd56-d5e90b52b2e0/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jun-yong.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jun_yong_1569" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[OpenCV build]]></title>
            <link>https://velog.io/@jun_yong_1569/OpenCV-build</link>
            <guid>https://velog.io/@jun_yong_1569/OpenCV-build</guid>
            <pubDate>Sat, 04 Mar 2023 08:25:40 GMT</pubDate>
            <description><![CDATA[<p>OpenCV를 사용하기 위해서는 CMake 작업 공간에 OpenCV 라이브러리를 구성해야 한다.</p>
<pre><code>ORB_SLAM2$ mkdir Thirdparty &amp;&amp; cd Thirdparty
thirdParty$ mkdir -P OpenCV/build &amp;&amp; mkdir -P OpenCV/install
thirdParty$ cd OpenCV
OpenCV$ git clone https://github.com/opencv/opencv.git
OpenCV$ git checkout &quot;your_version&quot;
OpenCV$ cd build
build$ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../install/ ../opencv/
build$ make -j4
build$ sudo make install</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[usb_cam 설치 오류]]></title>
            <link>https://velog.io/@jun_yong_1569/usbcam-%EC%84%A4%EC%B9%98-%EC%98%A4%EB%A5%98</link>
            <guid>https://velog.io/@jun_yong_1569/usbcam-%EC%84%A4%EC%B9%98-%EC%98%A4%EB%A5%98</guid>
            <pubDate>Fri, 17 Feb 2023 06:48:24 GMT</pubDate>
            <description><![CDATA[<pre><code>[ 50%] Built target usb_cam
[ 75%] Linking CXX executable /home/jun/xycar_ws/devel/lib/usb_cam/usb_cam_node
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `av_packet_from_data&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `sws_scale&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `av_frame_alloc&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `avcodec_close&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `av_frame_get_buffer&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `av_new_packet&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `avcodec_alloc_context3&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `av_log_set_level&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `avcodec_free_context&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `av_free&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `avcodec_open2&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `avcodec_send_packet&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `sws_getContext&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `av_image_get_buffer_size&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `av_parser_close&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `av_parser_init&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `avcodec_register_all&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `sws_freeContext&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `avcodec_receive_frame&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `av_image_copy_to_buffer&#39;
/home/jun/xycar_ws/devel/lib/libusb_cam.so: undefined reference to `avcodec_find_decoder&#39;
collect2: error: ld returned 1 exit status
usb_cam/CMakeFiles/usb_cam_node.dir/build.make:170: recipe for target &#39;/home/jun/xycar_ws/devel/lib/usb_cam/usb_cam_node&#39; failed
make[2]: *** [/home/jun/xycar_ws/devel/lib/usb_cam/usb_cam_node] Error 1
CMakeFiles/Makefile2:1326: recipe for target &#39;usb_cam/CMakeFiles/usb_cam_node.dir/all&#39; failed
make[1]: *** [usb_cam/CMakeFiles/usb_cam_node.dir/all] Error 2
Makefile:140: recipe for target &#39;all&#39; failed
make: *** [all] Error 2
Invoking &quot;make -j12 -l12&quot; failed</code></pre><p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/382c97aa-d384-4615-8f7b-be356f7a6c75/image.png" alt=""></p>
<p> 이 문제에 대한 대응으로 해당 라이브러리를 찾을 수 없다는 의미로 ~/catkin_ws/src/usb_cam/ 아래의 CMakeLists.txt를 확인하여 수정해야됩니다.</p>
<p>&quot;locate libavcodec&quot;, &quot;locate libavutil&quot;, &quot;locate libswscale&quot;을 사용하여 라이브러리의 경로를 찾은 다음 CMakeLists.txt에 다음 줄을 추가합니다.</p>
<pre><code>set(avcodec_LINK_LIBRARIES /usr/lib/x86_64-linux-gnu/libavcodec.so)
set(avutil_LINK_LIBRARIES /usr/lib/x86_64-linux-gnu/libavutil.so)
set(swscale_LINK_LIBRARIES /usr/lib/x86_64-linux-gnu/libswscale.so)</code></pre><p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/7b1ec7a8-e826-4dbb-b122-ffa97b5a1ba3/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/e9e81aba-2d8f-46d7-8de7-d037ff97ba93/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[230106] CNN - Shallow CNN]]></title>
            <link>https://velog.io/@jun_yong_1569/230106-CNN-Shallow-CNN</link>
            <guid>https://velog.io/@jun_yong_1569/230106-CNN-Shallow-CNN</guid>
            <pubDate>Sat, 07 Jan 2023 13:49:36 GMT</pubDate>
            <description><![CDATA[<h2 id="shallow-cnn">Shallow CNN</h2>
<p>Shallow Neural Network
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/289c3aa3-e4fc-4885-9776-ee7734a58c93/image.png" alt=""></p>
<p>Conv1 : 3x3 Convolution + sigmoid
Max Pool : Max Pooling
FC : Fully Connected Layer + sigmoid</p>
<h3 id="--backpropagation-in-shallow-neural-network">- Backpropagation in Shallow Neural Network</h3>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/96be4a47-59f0-4b0a-bc12-a6f471b4d1aa/image.png" alt=""></p>
<ul>
<li>Update the weights in backpropagation</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/8678db3f-24f6-4db5-b1be-05889559b142/image.png" alt=""></p>
<ul>
<li>Backpropagation in Shappow Neural Network (W2)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/e4c0850c-41d7-4eee-bbb6-44fe219d112f/image.png" alt=""></p>
<ul>
<li>W2 수식</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/e8120dd6-a38c-4328-bbf7-d2c2df80f05a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/dd1ed3d9-d52a-4f63-87e0-752c65b92575/image.png" alt=""></p>
<ul>
<li>Backpropagation in Shappow Neural Network (W1)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/08fcca49-b06d-44c5-b88c-e6a7c6e2624f/image.png" alt=""></p>
<ul>
<li>W1 수직</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/149d34bf-15c8-4413-ae3d-445090f73608/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/e6b46ca2-248c-4560-bb4d-a40ceeda503c/image.png" alt=""></p>
<h3 id="--max-pooling-backpropagation">- Max Pooling backpropagation</h3>
<ul>
<li>Max Pooling backpropagation
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/291bb094-f8bf-46a4-838b-196b13200be4/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[230106] CNN - Pooling]]></title>
            <link>https://velog.io/@jun_yong_1569/230106-CNN-Pooling</link>
            <guid>https://velog.io/@jun_yong_1569/230106-CNN-Pooling</guid>
            <pubDate>Sat, 07 Jan 2023 08:03:48 GMT</pubDate>
            <description><![CDATA[<h3 id="cnn---pooling">CNN - Pooling</h3>
<p>Feature map의 channel resolution을 줄여주는 용도로 Pooling이 사용된다
Resize the feature map &amp; Reduce the resolution of feature map
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/24f87265-ca92-4a1f-a3e2-2311e8891c23/image.png" alt=""></p>
<ul>
<li><p>Max Pooling vs Average Pooiling
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/384daceb-8b27-4628-9012-242f1cf28164/image.png" alt=""></p>
<ul>
<li>Max -&gt; 선명한 느낌, 각 픽셀의 특징이 보인다, 연속적이지 않다</li>
<li>Ave -&gt; 주변의 영향을 받아서 평균값으로 스무딩된 느낌이다</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/479cce2c-2f79-47b8-b144-5b2b3550b7a5/image.png" alt=""></p>
<h3 id="fully-connected-layer">Fully Connected Layer</h3>
<p>컨볼루션 연산과 다르게 2D의 기하학적인 정보를 가지고 있는 Feature map을 1D 벡터로 reshape을 시켜준다. 한 요소당 한 가중치와 매칭될 수 있게 FC weights를 만들어서 연산 후 합하여 결과를 도출한다
Reshape 2D feature maps from 2D to 1D
All weights are matching with each feature map pixel</p>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/5ea4d798-b6f0-48fc-b2fc-fc2722d27934/image.png" alt=""></p>
<h3 id="activation">Activation</h3>
<p>컨볼루션과 풀링을 통해 나온 결과 중 Feature map에서 유의미한 값을 더욱 도드라지게 만들어주며 유의미하지 않은 값을 0이나 음수의 값으로 치환하여 값에 차이를 주어 유의미한 값을 잘 나타내게 끔 활성화 함수가 사용된다
Activation 함수는 Non-linear function이다</p>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/caa97930-90d2-4c88-b484-fd78a1cbe863/image.png" alt=""></p>
<h2 id="실습">실습</h2>
<h3 id="mainpy-forward_net----conv2d-pooling-fully-connected-layer">main.py (forward_net()  -&gt; Conv2d, Pooling, fully connected layer)</h3>
<pre><code class="language-python">from function.convolution import Conv
from function.pool import Pool
from function.fc import FC
import numpy as np
import time

def forward_net():
    &quot;&quot;&quot;_summary_
    &#39;Conv - Pooling - FC&#39; model inference code 
    &quot;&quot;&quot;
    #define
    batch = 1
    in_c = 3
    in_w = 6
    in_h = 6
    k_h = 3
    k_w = 3
    out_c = 1

    X = np.arange(batch*in_c*in_w*in_h, dtype=np.float32).reshape([batch,in_c,in_w,in_h])
    W1 = np.array(np.random.standard_normal([out_c,in_c,k_h,k_w]), dtype=np.float32)

    Convolution = Conv(batch = batch,
                        in_c = in_c,
                        out_c = out_c,
                        in_h = in_h,
                        in_w = in_w,
                        k_h = k_h,
                        k_w = k_w,
                        dilation = 1,
                        stride = 1,
                        pad = 0)

    L1 = Convolution.gemm(X,W1)

    print(&quot;L1 shape : &quot;, L1.shape)
    print(L1)

    Pooling = Pool(batch=batch,
                   in_c = 1,
                   out_c = 1,
                   in_h = 4,
                   in_w = 4,
                   kernel=2,
                   dilation=1,
                   stride=2,
                   pad = 0)

    L1_MAX = Pooling.pool(L1)
    print(&quot;L1_MAX shape : &quot;, L1_MAX.shape)
    print(L1_MAX)

    #fully connected layer
    W2 = np.array(np.random.standard_normal([1, L1_MAX.shape[1] * L1_MAX.shape[2] * L1_MAX.shape[3]]), dtype=np.float32)
    Fc = FC(batch = L1_MAX.shape[0],
            in_c = L1_MAX.shape[1],
            out_c = 1,
            in_h = L1_MAX.shape[2],
            in_w = L1_MAX.shape[3])

    L2 = Fc.fc(L1_MAX, W2)

    print(&quot;L2 shape : &quot;, L2.shape)
    print(L2)

if __name__ == &quot;__main__&quot;:
    forward_net()</code></pre>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/1dd4be78-0367-4e9e-b029-ae520754ac45/image.png" alt=""></p>
<hr>
<h3 id="poolpy">pool.py</h3>
<pre><code class="language-python">import numpy as np

# 2D Pooling
class Pool:
    def __init__(self, batch, in_c, out_c, in_h, in_w, kernel, dilation, stride, pad):
        self.batch = batch
        self.in_c = in_c
        self.out_c = out_c
        self.in_h = in_h
        self.in_w = in_w
        self.kernel = kernel
        self.dilation = dilation
        self.stride = stride
        self.pad = pad
        self.out_w = (in_w - kernel + 2 * pad) // stride + 1
        self.out_h = (in_h - kernel + 2 * pad) // stride + 1

    def pool(self, A):
        C = np.zeros([self.batch, self.out_c, self.out_h, self.out_w], dtype=np.float32)
        for b in range(self.batch):
            for c in range(self.in_c):
                for oh in range(self.out_h):
                    a_j = oh * self.stride - self.pad
                    for ow in range(self.out_w):
                        a_i = ow * self.stride - self.pad
                        max_value = np.amax(A[:, c, a_j:a_j+self.kernel, a_i:a_i+self.kernel])
                        C[b, c, oh, ow] = max_value
        return C</code></pre>
<hr>
<h3 id="fcpy">fc.py</h3>
<pre><code class="language-python">import numpy as np

class FC:
    def __init__(self, batch, in_c, out_c, in_h, in_w):
        self.batch = batch
        self.out_c = out_c
        self.in_c = in_c
        self.in_h = in_h
        self.in_w = in_w 

    def fc(self, A, W):
        #A shape : [b,in_c, in_h, in_w]
        a_mat = A.reshape([self.batch, -1])
        B = np.dot(a_mat, np.transpose(W, (1,0)))
        return B</code></pre>
<hr>
<h3 id="mainpy-activation">main.py (activation)</h3>
<pre><code class="language-python">import matplotlib.pyplot as plt
import numpy as np
from function.activation import *

def plot_activation():
    &quot;&quot;&quot;_summary_
    Plot the activation output of [-10,10] inputs
    activations : relu, leaky_relu, sigmoid, tanh
    &quot;&quot;&quot;
    x = np.arange(-10,10,1)

    out_relu = relu(x)
    out_leaky = leaky_relu(x)
    out_sigmoid = sigmoid(x)
    out_tanh = tanh(x)

    #print(out_relu, out_leaky, out_sigmoid, out_tanh)

    plt.plot(x, out_relu, &#39;r&#39;, label=&#39;relu&#39;)
    plt.plot(x, out_leaky, &#39;b&#39;, label=&#39;leaky&#39;)
    plt.plot(x, out_sigmoid, &#39;g&#39;, label=&#39;sigmoid&#39;)
    plt.plot(x, out_tanh, &#39;bs&#39;, label=&#39;tanh&#39;)
    plt.ylim([-2,2])
    plt.legend()
    plt.show()</code></pre>
<hr>
<h3 id="activationpy">activation.py</h3>
<pre><code class="language-python">import numpy as np

def relu(x):
    x_shape = x.shape
    x = np.reshape(x,[-1])
    x = [max(v,0) for v in x]
    x = np.reshape(x, x_shape)
    return x

def leaky_relu(x):
    x_shape = x.shape
    x = np.reshape(x, [-1])
    x = [max(0.1*v,v) for v in x]
    x = np.reshape(x, x_shape)
    return x

def sigmoid(x):
    x_shape = x.shape
    x = np.reshape(x,[-1])
    x = [ 1 / (1 + np.exp(-v)) for v in x]
    x = np.reshape(x, x_shape)
    return x

def tanh(x):
    x_shape = x.shape
    x = np.reshape(x, [-1])
    x = [np.tanh(v) for v in x]
    x = np.reshape(x,x_shape)
    return x</code></pre>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/daf5ac60-d794-4235-927a-d02a5879de8a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/809475f0-bf32-491b-a7cb-124e8e046624/image.png" alt=""></p>
<hr>
<p><a href="https://github.com/Jun-yong-lee/pytorch_study/tree/Convolution">https://github.com/Jun-yong-lee/pytorch_study/tree/Convolution</a></p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[230106-1] CNN]]></title>
            <link>https://velog.io/@jun_yong_1569/230106-1-CNN</link>
            <guid>https://velog.io/@jun_yong_1569/230106-1-CNN</guid>
            <pubDate>Fri, 06 Jan 2023 12:59:33 GMT</pubDate>
            <description><![CDATA[<h2 id="cnn">CNN</h2>
<ul>
<li><p>CNN은 Convolution Neural Network의 약자로 이미지 처리에 특화된 네트워크이다.
CNN의 과정과 사람의 인지과정을 간단히 살펴보면 아래와 같다.
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/5bf82e68-d3e8-42a2-9bb4-fdf3bccdfc60/image.png" alt=""></p>
<p>컨볼루션 매트릭스라고 하여 (3x3, 5x5)의 작은 커널을 가진 연산을 하는 작업을 컨볼루션이라고 한다.</p>
<p>Padding : Add zero values in boundary of input image
Stride : Elements of sliding window of convolution kernel</p>
<p>Output shape</p>
<ul>
<li>oh = (ih - kh + padding*2)//stride + 1</li>
<li>ow = (iw - kw + padding*2)//stride + 1<ul>
<li>b  : batch</li>
<li>ic : in_channel</li>
<li>ih : in_height</li>
<li>iw : in_width</li>
<li>oc : out_channel</li>
<li>kh : kernel_h</li>
<li>kw : kernel_w
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/1659eeb3-118b-449e-9f46-5ef3fea5901a/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>A shape : [b, ic, ih, iw]</li>
<li>W shape : [oc, kc, kh, kw]</li>
<li>B shape : [b, oc, oh, ow]<ul>
<li>Weight sharing between batch of A</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/5e70b864-60ee-4e41-abaf-03b7f6c85444/image.png" alt=""></p>
<ul>
<li>Convolution Operation</li>
<li>MAC(Multiply Accumulation operation)<ul>
<li>Convolution MAC : kw x kh x kc x oc x ow x oh x b
① : kw x kh x oc, ② : kw x kh x kc x oc</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/cdf03d1c-b845-4c50-bfc1-883053e208f7/image.png" alt=""></p>
<pre><code class="language-python"># 7 loops in convolution operation
for b in batch:
    for oh in out_height:
        for ow in out_width:
            for oc in out_channel:
                for kc in kernel_channel:
                    for kh in kernel_height:
                        for kw in kernel_width:</code></pre>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/9b93f753-bf59-4165-ba43-372b140ae03c/image.png" alt=""></p>
<ul>
<li>IM2COL &amp; GEMM<ul>
<li>IM2COL<ul>
<li>Transform n-dimension data into 2D matrix data</li>
<li><span style="color: red"><strong>more efficient operation!!</strong></span></li>
</ul>
</li>
<li>GEMM<ul>
<li>General Matrix to Matrix Multiplication
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/301992c9-7220-4d89-9551-9b2e2759308c/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="sliding-window-convolution">Sliding window Convolution</h3>
<ul>
<li>시간 측정 결과 -&gt; L1 time : 0.0365447998046875</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/19b9d22e-a9a6-4519-b270-4261938c5e81/image.png" alt=""></p>
<h3 id="im2col-gemm-convolution">IM2COL GEMM convolution</h3>
<ul>
<li>시간 측정 결과 -&gt; L2 time : 0.0050013065338134766</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/695649ec-7254-42f0-9042-dc930cc728d5/image.png" alt=""></p>
<h3 id="pytorch-convolution">pytorch convolution</h3>
<ul>
<li>시간 측정 결과 -&gt; L3 time : 0.0</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/9152ed0f-f3d3-46c7-9f97-904a57e93583/image.png" alt=""></p>
<hr>
<table>
<thead>
<tr>
<th align="center"></th>
<th align="center">Sliding window</th>
<th align="center">IM2COL GEMM</th>
<th align="center">pytorch</th>
</tr>
</thead>
<tbody><tr>
<td align="center">시간</td>
<td align="center">0.0365447998046875</td>
<td align="center">0.0050013065338134766</td>
<td align="center">0</td>
</tr>
<tr>
<td align="center">측정된 시간은 위와 같으며 각각의 tensor의 내용을 살펴보면 3가지 convolution 모두 동일한 것을 확인할 수 있다.</td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
</tbody></table>
<h2 id="코드">코드</h2>
<h3 id="main">main</h3>
<pre><code class="language-python">import numpy as np
import time
import torch
import torch.nn as nn

from function.convolution import Conv

def convolution():
    print(&quot;convolution&quot;)

    # define the shape of input &amp; weight

    in_w = 6
    in_h = 6
    in_c = 3
    out_c = 16
    batch = 1
    k_w = 3
    k_h = 3

    X = np.arange(in_w * in_h * in_c * batch, dtype=np.float32).reshape([batch, in_c, in_h, in_w])
    W = np.array(np.random.standard_normal([out_c, in_c, k_h, k_w]), dtype=np.float32)

    Convolution = Conv(batch=batch,
                in_c=in_c,
                out_c=out_c,
                in_h=in_h,
                in_w=in_w,
                k_h=k_h,
                k_w=k_w,
                dilation=1,
                stride=1,
                pad=0)

    # print(f&quot;X = {X}&quot;)
    # print(f&quot;W = {W}, W.shape = {W.shape}&quot;)

    L1_time = time.time()

    for i in range(5):
        L1 = Convolution.conv(X, W)            
    print(f&quot;L1 time : {time.time() - L1_time}&quot;)
    print(f&quot;L1 : {L1}&quot;)

    L2_time = time.time()
    for i in range(5):
        L2 = Convolution.gemm(X, W)
    print(f&quot;L2 time : {time.time() - L2_time}&quot;)
    print(f&quot;L2 : {L2}&quot;)

    torch_conv = nn.Conv2d(in_c,
                           out_c,
                           kernel_size=k_h,
                           stride=1,
                           padding=0,
                           bias=False,
                           dtype=torch.float32)
    torch_conv.weight = torch.nn.Parameter(torch.tensor(W))

    L3_time = time.time()
    for i in range(5):
        L3 = torch_conv(torch.tensor(X, requires_grad=False, dtype=torch.float32))
    print(f&quot;L3 time : {time.time() - L3_time}&quot;)
    print(f&quot;L3 : {L3}&quot;)

if __name__ == &quot;__main__&quot;:
    convolution()</code></pre>
<h3 id="convolutionpy">convolution.py</h3>
<pre><code class="language-python">import numpy as np

class Conv:
    def __init__(self, batch, in_c, out_c, in_h, in_w, k_h, k_w, dilation, stride, pad):
        self.batch = batch
        self.in_c = in_c
        self.out_c = out_c
        self.in_h = in_h
        self.in_w = in_w
        self.k_h = k_h
        self.k_w = k_w
        self.dilation = dilation
        self.stride = stride
        self.pad = pad

        self.out_h = (in_h - k_h + 2 * pad) // stride + 1
        self.out_w = (in_w - k_w + 2 * pad) // stride + 1

    def check_range(self, a, b):
        return a &gt; -1 and a &lt; b

    # naive convolution Sliding window metric
    def conv(self, A, B):
        C = np.zeros((self.batch, self.out_c, self.out_h, self.out_w), dtype=np.float32)

        # seven loop
        for b in range(self.batch):
            for oc in range(self.out_c):
                # each channel of output
                for oh in range(self.out_h):
                    for ow in range(self.out_w):
                        # one pixel of output shape
                        a_j = oh * self.stride - self.pad
                        for kh in range(self.k_h):
                            if self.check_range(a_j, self.in_h) == False:
                                C[b, oc, oh, ow] += 0
                            else:
                                a_i = ow * self.stride - self.pad
                            for kw in range(self.k_w):
                                if self.check_range(a_i, self.in_w) == False:
                                    C[b, oc, oh, ow] += 0
                                else:
                                    C[b, oc, oh, ow] += np.dot(A[b, :, a_j, a_i], B[oc, :, kh, kw])
                                a_i += self.stride
                            a_j += self.stride
        return C

    # IM2COL. Change n-dim input to 2-dim matrix
    def im2col(self, A):
        # output
        mat = np.zeros((self.in_c * self.k_h * self.k_w, self.out_w * self.out_h), dtype=np.float32)

        mat_j = 0
        mat_i = 0
        for c in range(self.in_c):
            for kh in range(self.k_h):
                for kw in range(self.k_w):
                    in_j = kh * self.dilation - self.pad
                    for oh in range(self.out_h):
                        if not self.check_range(in_j, self.in_h):
                            for ow in range(self.out_w):
                                mat[mat_j, mat_i] = 0
                                mat_i += 1
                        else:
                            in_i = kw * self.dilation - self.pad
                            for ow in range(self.out_w):
                                if not self.check_range(in_i, self.in_w):
                                    mat[mat_j, mat_i] = 0
                                    mat_i += 1
                                else:
                                    mat[mat_j, mat_i] = A[0, c, in_j, in_i]
                                    mat_i += 1
                                in_i += self.stride
                        in_j += self.stride
                    mat_i = 0
                    mat_j += 1
        return mat

    # gemm. 2D matrix multiplication
    def gemm(self, A, B):
        a_mat = self.im2col(A)
        b_mat = B.reshape(B.shape[0],-1)
        c_mat = np.matmul(b_mat, a_mat)
        c = c_mat.reshape([self.batch, self.out_c, self.out_h, self.out_w])
        return c</code></pre>
<hr>
<p><a href="https://github.com/Jun-yong-lee/pytorch_study/tree/Convolution">https://github.com/Jun-yong-lee/pytorch_study/tree/Convolution</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[230105-2] Perception in self driving car]]></title>
            <link>https://velog.io/@jun_yong_1569/Perception-in-self-driving-car-vvuw4n7b</link>
            <guid>https://velog.io/@jun_yong_1569/Perception-in-self-driving-car-vvuw4n7b</guid>
            <pubDate>Fri, 06 Jan 2023 11:41:59 GMT</pubDate>
            <description><![CDATA[<h2 id="pytorch-lenet5-mnist-학습">Pytorch LeNet5 MNIST 학습</h2>
<hr>
<h2 id="mainpy">main.py</h2>
<pre><code class="language-python">from turtle import down
import argparse
import sys, os
import torch
import torch.nn as nn
from torchvision.datasets import MNIST
import torchvision.transforms as transforms
from torch.utils.data.dataloader import DataLoader
import torch.optim as optim

from model.models import *
from loss.loss import *
from util.tools import *

def parse_args():
    parser = argparse.ArgumentParser(description=&quot;MNIST&quot;)
    parser.add_argument(&#39;--mode&#39;, dest=&#39;mode&#39;, help=&quot;train / eval / test&quot;,
                        default=False, type=str)
    parser.add_argument(&#39;--download&#39;, dest=&#39;download&#39;, help=&quot;download MNIST dataset&quot;,
                        default=False, type=bool)
    parser.add_argument(&#39;--output_dir&#39;, dest=&#39;output_dir&#39;, help=&quot;output directory&quot;,
                        default=&#39;./output&#39;, type=str)
    parser.add_argument(&#39;--checkpoint&#39;, dest=&#39;checkpoint&#39;, help=&quot;checkpoint trained model&quot;,
                        default=None, type=str)

    if len(sys.argv) == 1:
        parser.print_help()
        sys.exit()
    args = parser.parse_args()
    return args

def get_data():
    my_transform = transforms.Compose([
        transforms.Resize([32, 32]),
        transforms.ToTensor(),
        transforms.Normalize((0.5,), (1.0,))
    ])
    download_root = &quot;./mnist_dataset&quot;
    train_dataset = MNIST(root=download_root,
                          transform=my_transform,
                          train=True,
                          download=args.download)
    eval_dataset = MNIST(root=download_root,
                         transform=my_transform,
                         train=False,
                         download=args.download)
    test_dataset = MNIST(root=download_root,
                         transform=my_transform,
                         train=False,
                         download=args.download)

    return train_dataset, eval_dataset, test_dataset

def main():
    print(torch.__version__)

    if not os.path.isdir(args.output_dir):
        os.mkdir(args.output_dir)

    if torch.cuda.is_available():
        print(&quot;gpu&quot;)
        device = torch.device(&quot;cuda&quot;)
    else:
        print(&quot;cpu&quot;)
        device = torch.device(&quot;cpu&quot;)

    # Get MNIST Dataset
    train_dataset, eval_dataset, test_dataset = get_data()

    # Make DataLoader
    train_loader = DataLoader(train_dataset,
                              batch_size=8,
                              num_workers=0,
                              pin_memory=True,
                              drop_last=True,
                              shuffle=True)
    eval_loader = DataLoader(eval_dataset,
                            batch_size=1,
                            num_workers=0,
                            pin_memory=True,
                            drop_last=False,
                            shuffle=False)
    test_loader = DataLoader(test_dataset,
                        batch_size=1,
                        num_workers=0,
                        pin_memory=True,
                        drop_last=False,
                        shuffle=False)

    _model = get_model(&#39;lenet5&#39;)

    # LeNet5

    if args.mode == &quot;train&quot;: # python main.py --mode &quot;train&quot; --download 1 --output_dir ./output
        model = _model(batch=8, n_classes=10, in_channel=1, in_width=32, in_height=32, is_train=True)
        model.to(device)
        model.train() # trian

        # optimizer &amp; scheduler
        optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
        scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1)

        criterion = get_criterion(crit=&#39;mnist&#39;, device=device)

        epoch = 15
        iter = 0
        for e in range(epoch):
            total_loss = 0
            for i, batch in enumerate(train_loader):
                img = batch[0]
                gt = batch[1]

                img = img.to(device)
                gt = gt.to(device)

                out = model(img)

                loss_val = criterion(out, gt)

                # backpropagation
                loss_val.backward()
                optimizer.step()
                optimizer.zero_grad()

                total_loss += loss_val.item()

                if iter % 100 == 0:
                    print(f&quot;{e} epoch {iter} iter loss : {loss_val.item()}&quot;)
                iter += 1

            mean_loss = total_loss / i
            scheduler.step()

            print(f&quot;-&gt;{e} epoch mean loss : {mean_loss}&quot;)
            torch.save(model.state_dict(), args.output_dir + &quot;/model_epoch&quot; + str(e)+&quot;.pt&quot;)
        print(&quot;Train end&quot;)


    elif args.mode == &quot;eval&quot;:
        # python main.py --mode &quot;eval&quot; --download 1 --output_dir ./output \ 
        # --checkpoint ./output/model_epoch2.pt
        model = _model(batch=1, n_classes=10, in_channel=1, in_width=32, in_height=32)
        # load trained model
        checkpoint = torch.load(args.checkpoint)
        model.load_state_dict(checkpoint)
        model.to(device)
        model.eval() # not train()

        acc = 0
        num_eval = 0

        for i, batch in enumerate(eval_loader):
            img = batch[0]
            gt = batch[1] # ground thruth

            img = img.to(device)

            # inference
            out = model(img)

            out = out.cpu()

            if out == gt:
                acc += 1
            num_eval += 1

        print(f&quot;Evaluation Score : {acc} / {num_eval}&quot;)

    elif args.mode == &quot;test&quot;:
        # python main.py --mode &quot;test&quot; --download 1 --output_dir ./output \
        # --checkpoint ./output/model_epoch2.pt
        model = _model(batch=1, n_classes=10, in_channel=1, in_width=1, in_height=1)
        checkpoint = torch.load(args.checkpoint)
        model.load_state_dict(checkpoint)
        model.to(device)
        model.eval() # not train()

        for i, batch in enumerate(test_loader):
            img = batch[0]
            img = img.to(device)

            # inference
            out = model(img)
            out = out.cpu()

            print(out)

            # show result
            show_img(img.cpu().numpy(), str(out.item()))

if __name__ == &quot;__main__&quot;:
    args = parse_args()
    main()

# image classification sequential
# 1. Get dataset
# 2. Make Dataloader(학습에 사용될 DB 구축)
# 3. design model
# 4. training
# 5. optimizer &amp; scheduler
# 6. loss function
# 7. forward -&gt; loss_val
# 8. loss_val -&gt; backpropagation -&gt; optimizer.step(), optimizer.zero_grad()
# 9. save model</code></pre>
<hr>
<h2 id="model">model</h2>
<h3 id="lenet5py">lenet5.py</h3>
<pre><code class="language-python">import torch
import torch.nn as nn

class Lenet5(nn.Module):
    def __init__(self, batch, n_classes, in_channel, in_width, in_height, is_train=False):
        super().__init__()
        self.batch = batch
        self.n_classes = n_classes
        self.in_width = in_width
        self.in_height = in_height
        self.in_channel = in_channel
        self.is_train = is_train

        # convolution output : [(W - K + 2P)/S] + 1

        # [(32 - 5 + 2*0) / 1] + 1 = 28
        self.conv0 = nn.Conv2d(self.in_channel, 6, kernel_size=5, stride=1, padding=0)
        self.pool0 = nn.AvgPool2d(2, stride=2)
        self.conv1 = nn.Conv2d(6, 16, kernel_size=5, stride=1, padding=0)
        self.pool1 = nn.AvgPool2d(2, stride=2)
        self.conv2 = nn.Conv2d(16, 120, kernel_size=5, stride=1, padding=0)

        # fully-connected layer
        self.fc3 = nn.Linear(120, 84)
        self.fc4 = nn.Linear(84, self.n_classes)

    def forward(self, x):
        # x&#39; shape : [B, C, H, W]
        x = self.conv0(x)
        x = torch.tanh(x)
        x = self.pool0(x)
        x = self.conv1(x)
        x = torch.tanh(x)
        x = self.pool1(x)
        x = self.conv2(x)
        x = torch.tanh(x)
        # change format from 4dim -&gt; 2dim ( [B, C, H, W] -&gt; [B, C*H*W] )
        x = torch.flatten(x, start_dim=1)
        x = self.fc3(x)
        x = torch.tanh(x)
        x = self.fc4(x)
        x = x.view(self.batch, -1)
        x = nn.functional.softmax(x, dim=1)

        if self.is_train is False:
            x = torch.argmax(x, dim=1)
        return x
</code></pre>
<hr>
<h3 id="modelspy">models.py</h3>
<pre><code class="language-python">from model.lenet5 import Lenet5

def get_model(model_name):
    if (model_name == &quot;lenet5&quot;):
        return Lenet5
    else:
        print(&quot;unknown model&quot;)</code></pre>
<hr>
<h2 id="loss">loss</h2>
<h3 id="losspy">loss.py</h3>
<pre><code class="language-python">import torch
import torch.nn as nn
import sys

class MNISTloss(nn.Module):
    def __init__(self, device=torch.device(&#39;cpu&#39;)):
        super(MNISTloss, self).__init__()
        self.loss = nn.CrossEntropyLoss().to(device)

    def forward(self, out, gt):
        loss_val = self.loss(out, gt)
        return loss_val

def get_criterion(crit = &quot;mnist&quot;, device=torch.device(&#39;cpu&#39;)):
    if crit == &quot;mnist&quot;:
        return MNISTloss(device=device)
    else:
        print(&quot;unknown criterion&quot;)
        sys.exit(1)
        return</code></pre>
<hr>
<h2 id="util">util</h2>
<h3 id="toolspy">tools.py</h3>
<pre><code class="language-python">from PIL import Image, ImageDraw
import numpy as np
import matplotlib.pyplot as plt

def show_img(img_data, text):
    _img_data = img_data * 255

    # 4D -&gt; 2D

    _img_data = np.array(_img_data[0, 0], dtype=np.uint8)

    img_data = Image.fromarray(_img_data)
    draw = ImageDraw.Draw(img_data)

    cx, cy = int(_img_data.shape[0] / 2), int(_img_data.shape[1] / 2)

    # draw text in image
    if text is not None:
        draw.text((cx, cy), text)

    plt.imshow(img_data)
    plt.show()</code></pre>
<hr>
<p><a href="https://github.com/Jun-yong-lee/pytorch_study/tree/pytorch_MNIST">https://github.com/Jun-yong-lee/pytorch_study/tree/pytorch_MNIST</a></p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[230105-1] Perception in self driving car]]></title>
            <link>https://velog.io/@jun_yong_1569/Perception-in-self-driving-car</link>
            <guid>https://velog.io/@jun_yong_1569/Perception-in-self-driving-car</guid>
            <pubDate>Fri, 06 Jan 2023 05:59:47 GMT</pubDate>
            <description><![CDATA[<h2 id="pytorch의-기본적인-사용방법">pytorch의 기본적인 사용방법</h2>
<hr>
<h2 id="코드">코드</h2>
<pre><code class="language-python">import torch
import numpy as np

# print(torch.__version__)

def make_tensor():
    # int16
    a = torch.tensor([[1, 2], [3, 4]], dtype=torch.int16)
    # float
    b = torch.tensor([2], dtype=torch.float32)
    # double
    c = torch.tensor([3], dtype=torch.float64)

    # print(a, b, c)

    tensor_list = [a, b, c]

    for t in tensor_list:
        print(f&quot;shape of tensor {t.shape}&quot;)
        print(f&quot;datatype of tensor {t.dtype}&quot;)
        print(f&quot;device tensor is stored on {t.device}&quot;)

def sumsub_tensor():
    a = torch.tensor([3, 2])
    b = torch.tensor([5, 3])

    print(f&quot;input {a}, {b}&quot;)

    # sum
    sum = a + b
    print(f&quot;sum : {sum}&quot;)
    # sub
    sub = a - b
    print(f&quot;sub : {sub}&quot;)

    sum_element_a = a.sum()
    print(f&quot;sum_element_a : {sum_element_a}&quot;)

def muldiv_tensor():
    a = torch.arange(0, 9).view(3, 3)
    b = torch.arange(0, 9).view(3, 3)
    print(f&quot;input tensor :\n {a} \n {b}&quot;)

    # mat_mul
    c = torch.matmul(a, b) # matrix multiplication
    print(f&quot;mat_mul : {c}&quot;)

    # elementwise multiplication
    d = torch.mul(a, b)
    print(f&quot;elementwise mul : {d}&quot;)

def reshape_tensor():
    a = torch.tensor([2, 4, 5, 6, 7, 8])
    print(f&quot;input tensor : \n {a}&quot;)

    # view
    b = a.view(2, 3)
    print(f&quot;view \n {b}&quot;)

    # transpose
    bt = b.t()
    print(f&quot;transpose \n {bt}&quot;)

def access_tensor():
    a = torch.arange(1, 13).view(4, 3)
    print(f&quot;input : \n {a}&quot;)

    # first col
    print(a[:, 0])
    # first row
    print(a[0, :])
    # [1, 1]
    print(a[1, 1])

def transform_numpy():
    a = torch.arange(1, 13).view(4, 3)
    print(f&quot;input : \n {a}&quot;)

    a_np = a.numpy()
    print(f&quot;numpy : {a_np}&quot;)

    b = np.array([1, 2, 3])
    bt = torch.from_numpy(b)
    print(bt)

def concat_tensor():
    a = torch.arange(1, 10).view(3, 3)
    b = torch.arange(10, 19).view(3, 3)
    c = torch.arange(19, 28).view(3, 3)

    abc = torch.cat([a, b, c], dim=0)

    print(f&quot;input tensor : \n {a} \n {b} \n {c}&quot;)
    print(f&quot;concat : \n {abc}&quot;)
    print(abc.shape)

def stack_tensor():
    a = torch.arange(1, 10).view(3, 3)
    b = torch.arange(10, 19).view(3, 3)
    c = torch.arange(19, 28).view(3, 3)

    abc = torch.stack([a, b, c], dim=0)

    print(f&quot;input tensor : \n {a} \n {b} \n {c}&quot;)
    print(f&quot;stack : \n {abc}&quot;)
    print(abc.shape)

def transpose_tensor():
    a = torch.arange(1, 10).view(3, 3)
    print(f&quot;input tensor : \n {a}&quot;)

    # transpose
    at = torch.transpose(a, 0, 1)
    print(f&quot;transpose : \n {at}&quot;)

    b = torch.arange(1, 25).view(4, 3, 2)
    print(f&quot;input b tensor : \n {b}&quot;)

    bt = torch.transpose(b, 0, 2)
    print(f&quot;transpose : \n {bt}&quot;)
    print(bt.shape)

    bp = b.permute(2, 0, 1) # 0, 1, 2
    print(f&quot;permute : \n {bp}&quot;)
    print(bp.shape)

if __name__ == &quot;__main__&quot;:
    # make_tensor()
    # sumsub_tensor()
    # muldiv_tensor()
    # reshape_tensor()
    # access_tensor()
    # transform_numpy()
    # concat_tensor()
    # stack_tensor()
    transpose_tensor()</code></pre>
<h2 id="각-함수의-결과">각 함수의 결과</h2>
<hr>
<h3 id="--make_tensor">- make_tensor()</h3>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/206bbbe7-372a-4790-aa7f-110d77945ee5/image.png" alt=""></p>
<hr>
<h3 id="--sumsub_tensor">- sumsub_tensor()</h3>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/d514f86b-f6f2-4b6a-a20d-441b40ba7a08/image.png" alt=""></p>
<hr>
<h3 id="--muldiv_tensor">- muldiv_tensor()</h3>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/6e6fef1c-4393-4abf-975f-44dea14afd15/image.png" alt=""></p>
<hr>
<h3 id="--reshape_tensor">- reshape_tensor()</h3>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/9f974095-3ad6-4173-bb6d-9be91b671e1a/image.png" alt=""></p>
<hr>
<h3 id="--access_tensor">- access_tensor()</h3>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/294b8032-2161-4f1d-ad0e-6688011c6bbd/image.png" alt=""></p>
<hr>
<h3 id="--transform_numpy">- transform_numpy()</h3>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/44356185-516a-4498-af03-c4d246a7678d/image.png" alt=""></p>
<hr>
<h3 id="--concat_tensor">- concat_tensor()</h3>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/8aa2c5e4-25c7-4fe6-a3f2-cd803f3f6798/image.png" alt=""></p>
<hr>
<h3 id="--stack_tensor">- stack_tensor()</h3>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/c3ade9fc-a205-4978-a46f-ba4929819bd5/image.png" alt=""></p>
<hr>
<h3 id="--transpose_tensor">- transpose_tensor()</h3>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/3757f879-cc72-496a-98ef-a532cc3bb393/image.png" alt=""></p>
<hr>
<p><a href="https://github.com/Jun-yong-lee/pytorch_study/tree/pytorch_prac">https://github.com/Jun-yong-lee/pytorch_study/tree/pytorch_prac</a></p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[230103-4] Deep Learning: 신경망의 기초 - 기계학습 III]]></title>
            <link>https://velog.io/@jun_yong_1569/Deep-Learning-%EC%8B%A0%EA%B2%BD%EB%A7%9D%EC%9D%98-%EA%B8%B0%EC%B4%88-%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5-III</link>
            <guid>https://velog.io/@jun_yong_1569/Deep-Learning-%EC%8B%A0%EA%B2%BD%EB%A7%9D%EC%9D%98-%EA%B8%B0%EC%B4%88-%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5-III</guid>
            <pubDate>Thu, 05 Jan 2023 15:03:39 GMT</pubDate>
            <description><![CDATA[<h2 id="deep-learning-신경망의-기초---기계학습-iii">Deep Learning: 신경망의 기초 - 기계학습 III</h2>
<h3 id="14-간단한-기계-학습의-예">1.4 간단한 기계 학습의 예</h3>
<ul>
<li><p>기계학습 요소</p>
<ul>
<li><p>카드 승인 예제 및 요소</p>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/56e77d9c-6a75-46d4-83e3-9a832b6a979f/image.png" alt=""></p>
</li>
</ul>
<ul>
<li>카드 승인 교사학습 예제
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/8f1073c0-3e4c-43f0-adf8-30958d6edde9/image.png" alt=""></li>
<li>기계학습 설정<ul>
<li>교사학습의 경우,
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/7be3f304-ba53-4a40-83c6-df861833e218/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="151-과소적합과-과잉적합">1.5.1 과소적합과 과잉적합</h3>
<ul>
<li><p>[그림 1.13]의 1차 모델은 과소적합<sup>underfitting</sup></p>
<ul>
<li>모델의 &#39;용량이 작아&#39; 오차가 클 수밖에 없는 현상</li>
</ul>
</li>
<li><p>대안 : 비선형 모델을 사용</p>
<ul>
<li>[그림 1-13]의 2차, 3차, 4차, 12차는 다항식 곡선을 선택한 예</li>
<li>1차(선형)에 비해 오차가 크게 감소함
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/05bb05e1-1199-42f9-827f-f618eadeca88/image.png" alt=""></li>
</ul>
</li>
<li><p>과잉적합<sup>overfitting</sup></p>
<ul>
<li>12차 다항식 곡선을 채택한다면 훈련집합에 대해 거의 완벽하게 근사화함</li>
<li>하지만 &#39;새로운&#39; 데이터를 예측한다면 큰 문제 발생<ul>
<li>x<sub>0</sub>에서 빨간 막대 근방을 예측해야 하지만 빨간 점을 예측</li>
</ul>
</li>
<li>이유는 &#39;모델의 용량<sup>capacity</sup>이 크기&#39; 때문에 학습 과저에서 잡음까지 수용 -&gt; 과잉적합 현상<ul>
<li>훈련집합에 과몰입해서 단순 암기했기 때문</li>
</ul>
</li>
<li>적절한 용량의 모델을 선택하는 모델 선택 작업이 필요함
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/d3dd3946-f39f-430e-94ae-b5434d5e3d8c/image.png" alt=""></li>
</ul>
</li>
<li><p>1차~12차 다항식 모델의 비교 관찰</p>
<ul>
<li>1~2차는 훈련집합과 테스트집합 모두 낮은 성능</li>
<li>12차는 훈련집합에 높은 성능을 보이나 테스트집합에서는 낮은 성능 -&gt; 낮은 일반화 능력</li>
<li>3~4차는 훈련집합에 대해 12차보다 낮겠지만 테스트집합에는 높은 성능 -&gt; 높은 일반화 능력</li>
</ul>
</li>
<li><p>모델의 일반화 능력과 용량 관계
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/3772c471-0259-41c8-bfdc-b93f5466ebf5/image.png" alt=""></p>
</li>
<li><p>훈련집합에 대한 세가지 모델 적합도 예
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/214275f8-0edf-4042-ab73-13f12f73b31f/image.png" alt=""></p>
</li>
</ul>
<h3 id="152-편향supbiassup과-분산변동supvariancesup">1.5.2 편향<sup>bias</sup>과 분산(변동)<sup>variance</sup></h3>
<ul>
<li><p>훈련집합을 여러 번 수집하여 1차~12차에 적용하는 실험</p>
<ul>
<li>2차는 매번 큰 오차 -&gt; 바이어스가 큼. 하지만 비슷한 모델을 얻음 -&gt; 낮은 분산</li>
<li>12차는 매번 작은 오차 -&gt; 바이어스가 작음. 하지만 크게 다른 모델을 얻음 -&gt; 높은 분산</li>
<li>일반적으로 용량이 작은 모델은 바이어스는 크고 분산은 작음. 
복잡한 모델은 바이어스는 작고 분산은 큼</li>
<li>바이어스와 분산은 상충<sup>trade-off</sup> 관계
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/1ca0d603-1f26-42e4-beaf-8922c24eeb22/image.png" alt=""></li>
</ul>
</li>
<li><p>기계 학습의 목표</p>
<ul>
<li>낮은 편향과 낮은 분산을 가진 예측 모델을 만드는 것이 목표 (왼쪽 아래)
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/e3c9870b-49a8-4170-9ffd-5a12d64f1e89/image.png" alt=""></li>
<li>하지만 모델의 편향과 분산은 상충 관계</li>
<li>따라서 편향을 최소로 유지하며 분산도 최대로 낮추는 전략 필요</li>
</ul>
</li>
<li><p>편향과 분산의 관계</p>
<ul>
<li>용량 증가 -&gt; 편향 감소, 분산 증가 경향</li>
<li>일반화 오차 성능 (=편향+분산)은 U형의 곡선을 가짐</li>
</ul>
</li>
</ul>
<h3 id="153-검증집합과-교차검증을-이용한-모델-선택-알고리즘">1.5.3 검증집합과 교차검증을 이용한 모델 선택 알고리즘</h3>
<ul>
<li><p>검증집합을 이용한 모델 선택</p>
<ul>
<li>훈련집합과 테스트집합과 다른 별도의 검증집합<sup>validation set</sup>을 가진 상황(데이터의 양이 많을 경우)
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/79c2fbe7-216f-41b4-9bb2-56c938432a19/image.png" alt=""></li>
</ul>
</li>
<li><p>교차검증<sup>cross validation</sup></p>
<ul>
<li>비용 문제로 별도의 검증집합이 없는 상황에 유용한 모델 선택 기법(데이터 양이 적을 경우)</li>
<li>훈련집합을 등분하여, 학습과 평가 과정을 여러 번 반복한 후 평균 사용</li>
</ul>
</li>
<li><p>10겹 교차검증<sup>10-fold cross validation</sup>의 예
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/f5e1e779-da3c-4a3b-aa52-eb55df9a1e21/image.png" alt=""></p>
</li>
<li><p>부트스트랩<sup>boot strap</sup></p>
<ul>
<li>임의의 복원 추출 샘플링<sup>sampling with replacement</sup> 반복<ul>
<li>데이터 분포가 불균형일 때 적용</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="154-모델-선택의-한계의-현실적인-해결책">1.5.4 모델 선택의 한계의 현실적인 해결책</h3>
<ul>
<li>현대 기계 학습의 전략<ul>
<li>용량이 충분히 큰 모델을 선택 한 후,
선택한 모델이 정상을 벗어나지 않도록 여러 가지 규제<sup>regularization</sup> 기법을 적용함</li>
</ul>
</li>
</ul>
<h3 id="16-규제">1.6 규제</h3>
<h3 id="161-데이터-확대">1.6.1 데이터 확대</h3>
<ul>
<li>데이터를 더 많이 수집하면 일반화 능력이 향상됨
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/87391945-5192-49d0-a0a5-beafeaf90aa5/image.png" alt=""></li>
</ul>
<ul>
<li>데이터 수집은 많은 비용이 듦<ul>
<li>실측자료<sup>ground thruth</sup>를 사람이 일일이 표식<sup>labeling</sup>을 해야 함</li>
</ul>
</li>
<li>인위적으로 데이터 확대<sup>data augmentation</sup><ul>
<li>훈련집합에 있는 샘플을 변형<sup>transform</sup>함</li>
<li>ex) 약간 회전<sup>rotation</sup> 또는 왜곡<sup>warping</sup> (원 데이터의 부류 소속 등의 고유 특성이 변하지 않게 주의할 것)
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/e67683fb-ffb9-4fef-9ca2-149a52b4ed38/image.png" alt=""></li>
</ul>
</li>
</ul>
<h3 id="162-가중치-감쇠">1.6.2 가중치 감쇠</h3>
<ul>
<li><p>가중치를 작게 조절하는 기법</p>
<ul>
<li><p>[그림 1-18(a)]의 12차 곡선은 가중치가 매우 큼
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/988d0a04-b567-4cbe-90ef-948f4950d5f1/image.png" alt=""></p>
</li>
<li><p>가중치 감쇠는 개선된 목적함수를 이용하여 가중치를 작게 조절하는 규제 기법</p>
<ul>
<li>식 (1.11)의 두 번째 항은 규제 항으로서 가중치 크기를 작게 유지해줌
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/96fdb4dc-05a3-4336-b050-96083e997af0/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="171-지도-방식에-따른-유형">1.7.1 지도 방식에 따른 유형</h3>
<ul>
<li>지도 학습<sup>supervised learning</sup><ul>
<li>특징 벡터 𝕏와 목푯값 𝕐가 모두 주어진 상황</li>
<li>회귀<sup>regression</sup>와 분류<sup>classification</sup> 문제로 구분</li>
</ul>
</li>
<li>비지도 학습<sup>unsupervied learning</sup><ul>
<li>특징 벡터 𝕏는 주어지는데 목푯값 𝕐 가 주어지지 않는 상황(정답 없음)</li>
<li>군집화<sup>clustering</sup> 과업 (고객 성향에 따른 맞춤 홍보 응용 등)</li>
<li>밀도 추정<sup>density estimation</sup>, 특징 공간 변환 과업(PCA)</li>
</ul>
</li>
</ul>
<ul>
<li><p>강화 학습<sup>reinforcement learning</sup></p>
<ul>
<li><p>(상대적) 목표치가 주어지는데, 지도 학습과 다른 형태임(==보상<sup>reward</sup>)</p>
</li>
<li><p>ex) 바둑</p>
<ul>
<li><p>수를 두는 행위가 샘플인데, 게임이 끝나면 목푯값 하나가 부여됨
-이기면 1, 패하면 -1을 부여</p>
</li>
<li><p>게임을 구성한 샘플들 각각에 목푯값을 나누어 주어야 함</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>준지도 학습</p>
<ul>
<li>일부는 𝕏와 𝕐를 모두 가지지만, 나머지는 𝕏만 가진 상황</li>
<li>최근, 대부분의 데이터가 𝕏의 수집은 쉽지만, 𝕐는 수작업이 필요하여 최근 중요성 부각<h3 id="172-다양한-기준에-따른-유형">1.7.2 다양한 기준에 따른 유형</h3>
</li>
</ul>
</li>
<li><p>오프라인 학습<sup>offline learning</sup>과 온라인 학습<sup>online learning</sup></p>
<ul>
<li>보통은 오프라인 학습을 다룸</li>
<li>온라인 학습은 IoT 등에서 추가로 발생하는 샘플을 가지고 점증적 학습 수행</li>
</ul>
</li>
<li><p>결정론적 학습<sup>deterministic learning</sup>과 확률적 학습<sup>stochastic learning</sup></p>
<ul>
<li>결정론적에서는 같은 데이터를 가지고 다시 학습하면 같은 예측기가 만들어짐</li>
<li>스토캐스틱 학습은 학습 과정에서 난수를 사용하므로 같은 데이터로 다시 학습하면 다른 예측기가 만들어짐. 보통 예측 과정도 난수 사용 </li>
</ul>
</li>
<li><p>분별 모델<sup>discriminative models</sup>과 생성 모델<sup>generative models</sup></p>
<ul>
<li>분별 모델은 부류 예측에만 관심. 즉 P(y|x)의 추정에 관심</li>
<li>생성 모델은 P(x) 또는 P(x|y)를 추정함<ul>
<li>따라서 새로운 샘플을 ‘생성’할 수 있음 </li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[230103-3] Deep Learning: 신경망의 기초 - 기계학습 II]]></title>
            <link>https://velog.io/@jun_yong_1569/Deep-Learning-%EC%8B%A0%EA%B2%BD%EB%A7%9D%EC%9D%98-%EA%B8%B0%EC%B4%88-%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5-II</link>
            <guid>https://velog.io/@jun_yong_1569/Deep-Learning-%EC%8B%A0%EA%B2%BD%EB%A7%9D%EC%9D%98-%EA%B8%B0%EC%B4%88-%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5-II</guid>
            <pubDate>Thu, 05 Jan 2023 13:12:01 GMT</pubDate>
            <description><![CDATA[<h2 id="deep-learning-신경망의-기초---기계학습-ii">Deep Learning: 신경망의 기초 - 기계학습 II</h2>
<h3 id="13-데이터에-대한-이해">1.3 데이터에 대한 이해</h3>
<ul>
<li><p>과학 기술의 발전 과정
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/e09db7d8-0806-4a35-9809-71c3ab9b47b5/image.png" alt=""></p>
<ul>
<li>예) 튀코 브라헤는 천동설이라는 틀린 모델을 선택함으로써 자신이 수집한 데이터를 설명하지 못함. 케플러는 지동설 모델을 도입하여 제1, 제2, 제 3법칙을 완성함</li>
</ul>
</li>
<li><p>기계학습</p>
<ul>
<li>기계 학습이 푸는 문제는 훨씬 복잡함
예) [그림 1-2]의 ‘8’ 숫자 패턴과 ‘단추’ 패턴의 다양한 변화 양상</li>
<li>단순한 수학 공식으로 표현 불가능함</li>
<li>데이터를 설명할 수 있는 학습 모델을 찾아내는 과정, 즉 기계학습에는 자동으로 모델을 찾아내는 과정이 필수
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/076f8024-0609-4fd0-bcf6-01d45f24d826/image.png" alt=""></li>
</ul>
</li>
</ul>
<h3 id="131-데이터-생성-과정">1.3.1 데이터 생성 과정</h3>
<ul>
<li><p>데이터 생성 과정을 완전히 아는 인위적 상황의 예제</p>
<ul>
<li><p>예) 두 개 주사위를 던져 나온 눈의 합을 x라 할 때, y=(x-7)<sup>2</sup>+1 점을 받는 게임</p>
<ul>
<li>이런 상황을 ‘데이터 생성 과정을 완전히 알고 있다’고 말함</li>
<li>x를 알면 정확히 y를 예측할 수 있음
-&gt; 실제 주사위를 던져 𝕏={3,10,8,5}를 얻었다면,  𝕐={17,10,2,5}</li>
</ul>
</li>
<li><p>x의 발생 확률 P(x)를 정확히 알 수 있음</p>
<ul>
<li><p>P(x)를 알고 있으므로, 새로운 데이터 생성 가능 </p>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/900a1520-76b8-4dcf-99fc-1c69fcbc9058/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>위과 같은 실제 기계 학습 문제</p>
<ul>
<li>데이터 생성 과정을 알 수 없음</li>
<li>단지 주어진 훈련집합 𝕏, 𝕐로 가설 모델을 통해 근사 추정만 가능</li>
</ul>
</li>
</ul>
<h3 id="132-데이터베이스의-중요성">1.3.2 데이터베이스의 중요성</h3>
<ul>
<li><p>데이터베이스의 품질</p>
<ul>
<li>주어진 응용에 맞는 충분히 다양한 데이터를 충분한 양만큼 수집  추정 정확도 높아짐<ul>
<li>예) 정면 얼굴만 가진 데이터베이스로 학습하고 나면, 기운 얼굴은 매우 낮은 성능 </li>
</ul>
</li>
</ul>
</li>
<li><blockquote>
<p>주어진 응용 환경을 자세히 살핀 다음 그에 맞는 데이터베이스 확보는 아주 중요함</p>
</blockquote>
<ul>
<li>데이터의 양과 학습 모델의 성능 경향성 비교
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/beb2369c-a4df-451a-9729-bceb2dba813f/image.png" alt=""></li>
</ul>
</li>
<li><p>공개 데이터베이스</p>
<ul>
<li>기계 학습의 대표적인 3가지 데이터베이스: Iris, MNIST, ImageNet</li>
<li>UCI 저장소<sup>repository</sup>리퍼지토리 (2017년11월 기준으로 394개 데이터베이스 제공)</li>
</ul>
</li>
<li><p>Iris 데이터베이스는 통계학자인 피셔 교수가 1936년에 캐나다 동부 해안의 가스페 반도에 서식하는 3종의 붓꽃(setosa, versicolor, virginica)을 50송이씩 채취하여 만들었다[Fisher1936]. 150개 샘플 각각에 대해 꽃받침 길이, 꽃받침 너비, 꽃잎 길이, 꽃잎 너비를 측정하여 기록하였다. 따라서 4차원 특징 공간이 형성되며 목푯값은 3종을 숫자로 표시함으로써 1, 2, 3 값 중의 하나이다.
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/5aa53c10-b19c-4e74-8ceb-d0cbbd5bc0e7/image.png" alt=""></p>
</li>
<li><p>MNIST 데이터베이스는 미국표준국(NIST)에서 수집한 필기 숫자 데이터베이스로, 훈련집합 60,000자, 테스트집합 10,000자를 제공한다. <a href="http://yann.lecun.com/exdb/mnist%EC%97%90">http://yann.lecun.com/exdb/mnist에</a> 접속하면 무료로 내려받을 수 있으며, 1988년부터 시작한 인식률 경쟁 기록도 볼 수 있다. 2017년 8월 기준으로는 [Ciresan2012] 논문이 0.23%의 오류율로 최고 자리를 차지하고 있다. 테스트집합에 있는 10,000개 샘플에서 단지 23개만 틀린 것이다.
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/02b735f2-a9b0-4c81-bced-befe9daadb1e/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p>ImageNet 데이터베이스는 정보검색 분야에서 만든 WordNet의 단어 계층 분류를 그대로 따랐고, 부류마다 수백에서 수천 개의 영상을 수집하였다[Deng2009]. 총 21,841개 부류에 대해 총 14,197,122개의 영상을 보유하고 있다. 그중에서 1,000개 부류를 뽑아 ILSVRC라는 영상인식 경진대회를 2010년부터 매년 개최하고 있다.
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/ab515083-4152-4ce9-90fa-723d237ec294/image.png" alt=""></p>
<ul>
<li>데이터의 적은 양 -&gt; 차원의 저주와 관련<ul>
<li>MNIST: 28*28 흑백 비트맵이라면 서로 다른 총 샘플 수는 2<sup>784</sup>가지이지만, MNIST는 고작 6만 개 샘플
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/97f6795b-13fc-4519-9f61-e157133c27f5/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="133-데이터베이스-크기와-기계-학습-성능">1.3.3 데이터베이스 크기와 기계 학습 성능</h3>
<ul>
<li><p>적은 양의 데이터베이스로 어떻게 높은 성능을 달성하는가?</p>
<ul>
<li><p>방대한 공간에서 실제 데이터가 발생하는 곳은 매우 작은 부분 공간임</p>
</li>
<li><blockquote>
<p>데이터 희소<sup>data sparsity</sup> 특성 가정
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/d370e3ca-27a5-42fb-8aee-12ee9cc4700e/image.png" alt="">
위와 같은 데이터 발생 확률은 거의 0에 가까움</p>
</blockquote>
</li>
<li><p>매니폴드(마니 + 끼다) 가정<sup>manifold assumption (or manifold hypothesis)</sup></p>
<ul>
<li>고차원의 데이터는 관련된 낮은 차원의 매니폴드에 가깝게 집중되어 있음</li>
<li>아래와 같이 일정한 규칙에 따라 매끄럽게 변화</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/b8880688-111b-4bfe-a7e0-c225935422fe/image.png" alt=""></p>
<h3 id="134-데이터-가시화">1.3.4 데이터 가시화</h3>
<ul>
<li>4차원 이상의 초공간은 한꺼번에 가시화 불가능</li>
<li>여러 가지 가시화 기법<ul>
<li>2개씩 조합하여 여러 개의 그래프 그림
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/7621a6d1-354d-4976-a8ae-615ad36e19b4/image.png" alt=""></li>
</ul>
</li>
</ul>
<h3 id="14-간단한-기계-학습의-예">1.4 간단한 기계 학습의 예</h3>
<ul>
<li>선형 회귀<sup>linear regression</sup><ul>
<li>[그림 1-4] : 식 (1.2)의 직선 모델(가설)을 사용하므로 두 개의 매개변수 Θ=(𝑤,𝑏)<sup>T</sup>
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/f3658381-7123-4134-8f2e-e7e4bcadc352/image.png" alt=""></li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/75c2c0a3-5257-4115-b7cf-778a1da11abe/image.png" alt=""></p>
<ul>
<li>목적 함수<sup>objective function</sup> (또는 비용 함수<sup>cost function</sup>)<ul>
<li>식 (1.8)은 선형 회귀를 위한 목적 함수<ul>
<li>식 (1.8)을 평균제곱오차식<sup>MSE(Mean Squared Error)</sup>라 부름
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/2b9aee64-aeec-45b3-9439-74adc48224b6/image.png" alt=""></li>
<li>𝑓<sub>Θ</sub>(𝐱<sub>i</sub>)는 예측함수의 예측 출력, y<sub>i</sub>는 예측함수가 맞추어야 하는 실제 목표치</li>
<li>𝑓<sub>Θ</sub>(𝐱<sub>i</sub>) - y<sub>i</sub>는 오차<sup>error</sup> 혹은 손실<sup>loss</sup><ul>
<li>처음에는 최적 매개변수 값을 알 수 없으므로 난수로 Θ<sub>1</sub>=(𝑤<sub>1</sub>,b<sub>1</sub>)<sup>T</sup> 설정 -&gt; Θ<sub>2</sub>=(𝑤<sub>2</sub>,b<sub>2</sub>)<sup>T</sup> 로 개선 -&gt; Θ<sub>3</sub>=(𝑤<sub>3</sub>,b<sub>3</sub>)<sup>T</sup> 로 개선 -&gt; Θ<sub>3</sub>는 최적해  Θhat</li>
</ul>
</li>
<li>𝐽(Θ<sub>1</sub>)&gt;𝐽(Θ<sub>2</sub>)&gt; 𝐽(Θ<sub>3</sub>)</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[230103-2] Deep Learning: 신경망의 기초 - 기계학습 I]]></title>
            <link>https://velog.io/@jun_yong_1569/Deep-Learning-%EC%8B%A0%EA%B2%BD%EB%A7%9D%EC%9D%98-%EA%B8%B0%EC%B4%88-%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5-I</link>
            <guid>https://velog.io/@jun_yong_1569/Deep-Learning-%EC%8B%A0%EA%B2%BD%EB%A7%9D%EC%9D%98-%EA%B8%B0%EC%B4%88-%EA%B8%B0%EA%B3%84%ED%95%99%EC%8A%B5-I</guid>
            <pubDate>Wed, 04 Jan 2023 02:45:57 GMT</pubDate>
            <description><![CDATA[<h2 id="deep-learning-신경망의-기초---기계학습-i">Deep Learning: 신경망의 기초 - 기계학습 I</h2>
<h3 id="111-기계-학습의-정의">1.1.1 기계 학습의 정의</h3>
<p><strong>인공지능(Artificial Intelligence)이란?</strong></p>
<ul>
<li>인간의 학습, 추론, 지각, 자연언어 이해 등의 지능적 능력을 기기로 실현한 기술</li>
</ul>
<p><strong>학습이란?</strong></p>
<ul>
<li>&quot;경험의 결과로 나타나는, 비교적 지속적인 행동의 변화나 그 잠재력의 변화 또는 지식을 습득하는 과정&quot;</li>
</ul>
<p><strong>기계 학습(Machine Learning)이란?</strong></p>
<ul>
<li><p>인공지능 초창기 정의
&quot;Progeramming computers to learn from experience should eventually eliminate the need for much of this detailed programming effort. 컴퓨터가 경험을 통해 학습할 수 있도록 프로그래밍할 수 있다면, 세세하게 프로그래밍해야 하는 번거로움에서 벗어날 수 있다[Samuel1959].&quot;</p>
</li>
<li><p>현대적 정의
&quot;A computer program is said to learn from experience E with respect to some class of tasks T and performace measure P, if its performance at tasks in T, as measured by P, improves with experience E. 어떤 컴퓨터 프로그램이 T라는 작업을 수행한다. 이 프로그램의 성능을 P라는 척도로 평가했을 때 경험 E를 통해 성능이 개선된다면 이 프로그램은 학습을 한다고 말할 수 있다[Mitchell1997]&quot;</p>
<p>-&gt; <span style="color: red"><strong>최적의 프로그램(알고리즘)</strong></span>을 찾는 행위</p>
<ul>
<li><span style="color: red"><strong>경험 <em>E</em></strong></span> 를 통해</li>
<li>주어진 <span style="color: red"><strong>작업 <em>T</em></strong></span> 에 대한</li>
<li><span style="color: red"><strong>성능 <em>P</em></strong></span> 의 향상</li>
</ul>
<p>&quot;Programming computers to optimize a performance criterion using example data or past experience. 사례 데이터, 즉 과거 경험을 이용하여 성능 기준을 최적화하도록 프로그래밍하는 작업[Alpaydin2010]&quot;
&quot;Computational methods using experience to improve performance or to make accurate predictions. 성능을 개선하거나 정확하게 예측하기 위해 경험을 이용하는 계산학 방법들[Mohri2012]&quot;</p>
</li>
</ul>
<ul>
<li>기계 학습과 전통적인 프로그래밍의 비교
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/a9707d4d-60a2-41f3-9941-3bc4b16695d4/image.png" alt=""></li>
</ul>
<h3 id="112-지식기반-방식에서-기계-학습으로의-대전환">1.1.2 지식기반 방식에서 기계 학습으로의 대전환</h3>
<ul>
<li>인공지능의 탄생 == 연산 장치의 탄생
컴퓨터의 뛰어난 능력
복잡한 연산을 사람보다 잘함
ex) 80932.4321575*0.152367512
ex) 복잡한 함수의 미분과 적분</li>
</ul>
<ul>
<li>인공지능의 주도권 전환
지식 기반 -&gt; 기계 학습 -&gt; <span style="color: red"><strong>심층 학습</strong></span><sup>deep Learning</sup>(<span style="color: red"><strong>표현 학습</strong></span><sup>Representation Learning</sup>)
데이터 중심 접근방식으로 전환</li>
</ul>
<h3 id="113-기계-학습-개념">1.1.3 기계 학습 개념</h3>
<ul>
<li><p>간단한 기계 학습 예제</p>
<ul>
<li>가로축은 시간, 세로축은 이동체의 위치 &lt;- 모든 데이터는 정량화된 형태로 표현(벡터)</li>
<li>4개의 점이 데이터 관측<img src="https://velog.velcdn.com/images/jun_yong_1569/post/7fef4239-6225-49b0-a555-f6e79bbc69a4/image.jpg" width="50%"></li>
</ul>
</li>
<li><p>문제<sup>task</sup> 예측<sup>prediction</sup></p>
<ul>
<li>임의의 시간이 주어지면 이때 이동체의 위치는?</li>
<li>예측은 회귀<sup>regression</sup> 문제와 분류<sup>classification</sup> 문제로 나뉨<ul>
<li><span style="color: red"><strong>회귀</strong></span>는 목표치가 <span style="color: red"><strong>실수</strong></span>, <span style="color: red"><strong>분류</strong></span>는 부류 혹은 <span style="color: red"><strong>종류</strong></span>의 값</li>
</ul>
</li>
</ul>
</li>
<li><p>훈련집합<sup>training set</sup></p>
<ul>
<li>가로축은 특징, 세로축은 목표치</li>
<li>관측한 4개의 점이 훈련집합을 구성함<ul>
<li>훈련 집합: X = {x_1, x_2, ..., x_n}, Y = {y_1, y_2, ..., y_n}</li>
</ul>
</li>
</ul>
</li>
<li><p>관찰된 데이터들을 어떻게 설명할 것인가?</p>
<ul>
<li>가설<sup>hypothesis</sup> : 눈대중으로 데이터 양상이 직선 형태를 보임 -&gt; 모델을 직선으로 가정하여 선택</li>
<li>가설인 직선 모델의 수식<ul>
<li>2개의 매개변수<sup>parameter</sup> w와 b
y = wx + b</li>
</ul>
</li>
<li>기계 학습의 훈련<sup>train</sup><ul>
<li>주어진 문제인 예측을 가장 정확하게 할 수 있는 최적의 매개변수를 찾는 작업</li>
<li>처음은 임의의 매개변수 값에서 시작하지만, 개선하여 정량적인 최적 성능<sup>performance</sup>에 도달</li>
</ul>
</li>
<li>훈련을 마치면, 추론<sup>inference</sup>을 수행<ul>
<li>새로운<sup>unknown</sup> 특징에 대응되는 목표치의 예측에 사용</li>
</ul>
</li>
<li>기계 학습의 궁극적인 목표<ul>
<li>훈련집합에 없는 새로운 데이터에 대한 오류를 최소화 (새로운 데이터 = 테스트 집합<sup>test set</sup>)</li>
<li>테스트 집합에 대한 높은 성능을 일반화<sup>generalization</sup> 능력이라 부름</li>
<li>기계학습의 필수요소<ul>
<li>학습할 수 있는 데이터가 있어야 함</li>
<li>데이터 규칙 존재</li>
<li>수학적으로 설명 불가능</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/eb35e4c3-9684-4293-8576-0d01a227cb83/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/5d98f01b-c184-4a18-a3ed-6cca7c70fdd3/image.png" alt=""></p>
<h3 id="121-1차원과-2차원-특징-공간">1.2.1 1차원과 2차원 특징 공간</h3>
<ul>
<li><p>모든 데이터가 정량적으로 표현되며, 특징 공간 상에 존재</p>
</li>
<li><p>1차원 특징 공간
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/26c719e9-164e-4b0e-a402-6bcf6c7fca9a/image.png" alt=""></p>
</li>
<li><p>2차원 특징 공간
x=(x1,x2)T
x=(몸무게,키)T, y=장타율 
x=(체온,두통)T, y=감기 여부</p>
</li>
<li><p>다차원 특징 공간 예제
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/59f011a8-c57a-4f38-b0ef-a52920000fb8/image.png" alt=""></p>
</li>
<li><p>차원의 저주(curse of dimensionality)</p>
<ul>
<li>차원이 높아짐에 따라 발생하는 현실적인 문제들</li>
<li>1차, 2차, 3차원에서의 차원의 저주 예시</li>
<li>예) d=784인 MNIST 샘플의 화소가 0과 1값을 가진다면 2<sup>784</sup> 개의 칸이 거대한 공간에 고작 6만 개의 샘플을 흩뿌린 매우 희소한 분포</li>
<li>차원이 높아질수록 유의미한 표현을 찾기 위해 지수적으로 많은 데이터가 필요함</li>
</ul>
</li>
<li><p>선형 분리 불가능<sup>linearly non-separable</sup>한 원래 특징 공간</p>
<ul>
<li>직선 모델을 적용하면 75% 정확도가 한계
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/89bd87ea-eefe-499e-bba0-14f87984434e/image.png" alt=""></li>
</ul>
</li>
<li><p>식 (1.6)으로 변환된 새로운 특징 공간</p>
<ul>
<li>공간 변환을 통해 직선 모델로 100% 정확도
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/ddde8915-e5cb-47b9-b628-dd32400c353f/image.png" alt=""></li>
</ul>
</li>
</ul>
<ul>
<li><p>표현 학습<sup>representation learning</sup></p>
<ul>
<li>좋은 특징 공간을 자동으로 찾는 작업</li>
<li>딥러닝은 다수의 은닉층을 가진 신경망을 이용하여 계층적인 특징 공간을 찾아냄
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/0709e068-f24e-4fad-965f-af5c10c390f3/image.png" alt=""></li>
</ul>
</li>
<li><p>심층학습<sup>deep learning</sup></p>
<ul>
<li><p>표현학습의 하나로 다수의 은닉층을 가진 신경망을 이용하여 최적의 계층적인 특징을 학습</p>
</li>
<li><p>인공지능의 단계</p>
<ul>
<li>초인공지능(Super AI)
인공지능의 발전이 가속화되어 모든 인류의 지성을 합친 것보다 더 뛰어난 인공지능</li>
<li>강인공지능(Strong AI = 인공일반지능)
인간이 할 수 있는 어떠한 지적인 업무도 성공적으로 해낼 수 있는 (가상적인) 기계의 지능</li>
<li>약인공지능(Weak AI)
인간이 지시한 명령의 틀 안에서만 일하기 때문에 예측과 관리가 용이</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[230103-1] Deep Learning: 신경망의 기초 - 인공지능과 기계학습 소개]]></title>
            <link>https://velog.io/@jun_yong_1569/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%EA%B0%9C%EC%9A%94</link>
            <guid>https://velog.io/@jun_yong_1569/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%EA%B0%9C%EC%9A%94</guid>
            <pubDate>Tue, 03 Jan 2023 13:59:00 GMT</pubDate>
            <description><![CDATA[<h2 id="deep-learning-신경망의-기초---인공지능과-기계학습-소개">Deep Learning: 신경망의 기초 - 인공지능과 기계학습 소개</h2>
<p>인공지능의 사전적 의미 - 인간의 학습능력과 추론능력, 지각능력, 자연언어의 이해능력 등을 컴퓨터 프로그램으로 실현한 기술을 말한다.
일산 속 인공지능에는 음성인식(Siri), 추천 시스템(eBay, Netflix), 자율주행(Waymo), 실시간 객체 인식(Face ID), 로봇(HUBO), 번역(papago)가 있다.</p>
<p>인공지능의 역사는 아래와 같으며 1980<del>2000년대까지 기계학습이 번창한 시대였으며 2010</del>현재까지 심층학습의 혁신으로 인공지능의 황금 시대라고 볼 수 있다.
<img src="https://velog.velcdn.com/images/jun_yong_1569/post/092d50fa-dc17-4a45-ac3f-82e01d5dae85/image.png" alt=""></p>
<h3 id="인공지능의-분류">인공지능의 분류</h3>
<p><img src="https://velog.velcdn.com/images/jun_yong_1569/post/e2e82dee-2a65-433e-8513-f0e8c5cb5de9/image.png" alt="">
<strong>머신러닝과 딥러닝</strong></p>
<ul>
<li>머신러닝(Machine Learning)<blockquote>
<p>협의적: 컴퓨터가 다량의 데이터를 기반으로 스스로 학습하고 통계적인 결과를 도출하는 인공지능
광의적: 인공지능의 하위 개념이지만, 컴퓨터로 연구하는 대부분의 인공지능을 포함
ex) SVM</p>
</blockquote>
<ul>
<li>딥러닝(Deep Learning)<blockquote>
<p>협의적: 역전파의 기울기 소실 문제를 해결해 깊은 다층 레이어 학습을 가능하게 한 머신러닝
광의적: 인간의 뇌와 흡사하게 구현한 신경망 알고리즘을 적용하여 보다 빠르고 효율적으로 학습하는 인공지능
ex) CNN, RNN</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<p>앞으로 인공지능의 분야 중 Deep Learning을 활용한 자율주행 기술을 자이카에 적용하여 구동시키기 위해 학습을 진행할 예정이다!!</p>
<h3 id="출처">출처</h3>
<blockquote>
<p><a href="https://itwiki.kr/w/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5">https://itwiki.kr/w/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] - 다음에 올 숫자 (C++)]]></title>
            <link>https://velog.io/@jun_yong_1569/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%8B%A4%EC%9D%8C%EC%97%90-%EC%98%AC-%EC%88%AB%EC%9E%90-C</link>
            <guid>https://velog.io/@jun_yong_1569/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%8B%A4%EC%9D%8C%EC%97%90-%EC%98%AC-%EC%88%AB%EC%9E%90-C</guid>
            <pubDate>Tue, 03 Jan 2023 13:09:08 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-문제-설명">📌 문제 설명</h2>
<p>등차수열 혹은 등비수열 <code>common</code>이 매개변수로 주어질 때, 마지막 원소 다음으로 올 숫자를 return 하도록 solution 함수를 완성해보세요.</p>
<h2 id="📌-제한사항">📌 제한사항</h2>
<ul>
<li>2 &lt; <code>common</code>의 길이 &lt; 1,000</li>
<li>-1,000 &lt; <code>common</code>의 원소 &lt; 2,000</li>
<li>등차수열 혹은 등비수열이 아닌 경우는 없습니다.</li>
<li>공비가 0인 경우는 없습니다.</li>
</ul>
<h2 id="📌-입출력-예">📌 입출력 예</h2>
<table>
<thead>
<tr>
<th align="center">common</th>
<th align="center">result</th>
</tr>
</thead>
<tbody><tr>
<td align="center">[1, 2, 3, 4]</td>
<td align="center">5</td>
</tr>
<tr>
<td align="center">[2, 4, 8]</td>
<td align="center">16</td>
</tr>
</tbody></table>
<h2 id="📌-입출력-예-설명">📌 입출력 예 설명</h2>
<p>입출력 예 #1</p>
<ul>
<li>[1, 2, 3, 4]는 공차가 1인 등차수열이므로 다음에 올 수는 5이다.</li>
</ul>
<p>입출력 예 #2</p>
<ul>
<li>[2, 4, 8]은 공비가 2인 등비수열이므로 다음에 올 수는 16이다.</li>
</ul>
<h2 id="📌-풀이">📌 풀이</h2>
<p>문제의 제한사항에서 <code>common</code>의 길이가 2보다 크다는 것을 바탕으로 common[0], common[1], common[2]의 값을 이용하였다.</p>
<pre><code class="language-cpp">(common[1] - common[0] == common[2] - common[1]) // 등차수열
(common[1]/common[0] == common[2]/common[1]) // 등비수열
0으로 나눠지는 경우가 있을 수 있으니 조심!!</code></pre>
<h2 id="📌-코드">📌 코드</h2>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;iostream&gt;

int solution(std::vector&lt;int&gt; common) { 
    if ((common[1] - common[0]) == (common[2] - common[1])) {
        return int(common[common.size() - 1] + common[1] - common[0]);
    }
    else {
        return int((common[1]/common[0]) * common[common.size() - 1]);
    }
}</code></pre>
]]></description>
        </item>
    </channel>
</rss>