<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.3">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2023-10-12T19:03:33+00:00</updated><id>/feed.xml</id><title type="html">SSL</title><subtitle>Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.</subtitle><author><name>SSL</name></author><entry><title type="html">[ML Study]ch08-3 합성곱 신경망의 시각화</title><link href="/deep%20learning/2023/08/22/mlstudy-ch08-3.html" rel="alternate" type="text/html" title="[ML Study]ch08-3 합성곱 신경망의 시각화" /><published>2023-08-22T00:02:00+00:00</published><updated>2023-08-22T00:02:00+00:00</updated><id>/deep%20learning/2023/08/22/mlstudy-ch08-3</id><content type="html" xml:base="/deep%20learning/2023/08/22/mlstudy-ch08-3.html">&lt;body&gt;
    &lt;img src=&quot;/assets/images/post/book_banner.jpg&quot; align=&quot;right&quot; width=&quot;20%&quot; height=&quot;27.2%&quot; /&gt;
    &lt;br /&gt;&lt;br /&gt;
    &lt;p&gt;본 포스팅 한빛미디어의 &lt;a href=&quot;https://product.kyobobook.co.kr/detail/S000001810330&quot;&gt;&amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;&lt;/a&gt;를 요약 정리했습니다.&lt;/p&gt;
&lt;/body&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id=&quot;1-가중치-시각화&quot;&gt;1. 가중치 시각화&lt;/h3&gt;
&lt;hr /&gt;

&lt;p&gt;각 필터는 커널이라 부르는 가중치와 절편을 가지고 있는데 일반적으로 절편은 시각적으로 의미가 있지 않다.
&lt;br /&gt;가중치는 입력 이미지의 2차원 영역에 적용되어 어떤 특징을 크게 두드러지게 표현하는 역할을 한다.&lt;/p&gt;

&lt;p&gt;2절에서 best-cnn-model.h5 파일을 생성하고 이어서 학습해야 하고, model.layers를 통해 층을 확인한다.
&lt;br /&gt;Conv2D, MaxPooling2D, Conv2D, MaxPooling2D, Flatten, Dense, Dropout, Dense 층으로 이루어진 것을 확인 할 수 있다.&lt;/p&gt;

&lt;p&gt;layers 속성의 첫 번째 원소를 선택해 weigths의 첫 번째 원소(가중치)와 두 번째 원소(절편)의 크기를 출력해보면&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-pyhon&quot;&gt;conv = model.layers[0]
print(conv.weights[0].shape, conv.weights[1].shape)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(3, 3, 1, 32)  (32, )와 같이 나타난다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;그리고 가중치 배열의 평균과 표준편차를 넘파이 mean()과 std() 메서드로 계산해보면&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-pyhon&quot;&gt;conv_weights = conv.weights[0].numpy()
print(conv_weights.mean(), conv_weights.std())
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;가중치의 평균값은 0에 가깝고 표준편차는 0.27 정도이다. 
&lt;br /&gt;이 값을 히스토그램으로 확인해보면 0을 중심으로 종 모양 분포를 띠고 있는 것을 알 수 있다.&lt;/p&gt;

&lt;p&gt;이번에는 32개의 커널을 16개씩 두 줄에 출력해 보도록 해보자.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-pyhon&quot;&gt;fig, axs = plt.subplots(2, 16, figsize=(15,2))
for i in range(2):
    for j in range(16):
        axs[i, j].imshow(conv_weights[:,:,0,i*16 + j], vmin=-0.5, vmax=0.5)
        axs[i, j].axis('off')
plt.show()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;훈련하지 않은 빈 합성곱 신경망을 만들기 위해서 먼저 Sequential 클래스로 모델을 생성하고 Conv2D 층을 하나 추가한다.
&lt;br /&gt;다음 이 층의 가중치를 no_training_conv 변수에 저장해 이번처럼 평균과 표준편차를 확인해본다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-pyhon&quot;&gt;no_training_weights = no_training_conv.weights[0].numpy()
print(no_training_weights.mean(), no_training_weights.std())
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;-0.010310263과 0.0773888으로 표준편차가 매우 작게 나타난다.
&lt;br /&gt;히스토그램으로 확인해 보면 이전과 다르게 비교적 고른 분포를 볼 수 있다.
&lt;br /&gt;그 이유는 텐서플로가 신경망의 가중치를 처음 초기화할 때 균등 분포에서 랜덤하게 값을 선택하기 때문이다.&lt;/p&gt;

&lt;h3 id=&quot;2-함수형-api&quot;&gt;2. 함수형 API&lt;/h3&gt;
&lt;hr /&gt;

&lt;p&gt;함수형 API는 케라스의 Model 클래스를 사용해서 모델을 만든다.
&lt;br /&gt;마치 체인처럼 입력에서 출력까지 연결하고 마지막에 Model 클래스에 입력과 출력을 지정하여 모델을 만든다.&lt;/p&gt;

&lt;p&gt;model 객체의 층에서 Conv2D의 출력이 필요한데,
&lt;br /&gt;model 객체의 입력과 Conv2D의 출력을 알 수 있다면 이 둘을 연결해 새로운 모델을 만들 수 있다.&lt;/p&gt;

&lt;p&gt;첫 번째 Conv2D 층이 출력한 특성 맵이 필요하므로 Conv2D 객체의 output 속성에서 얻으면 된다.
&lt;br /&gt;model.layers[0].output처럼 참조 가능하고 model 객체의 입력은 model.input으로 알 수 있다.
&lt;br /&gt;또한 이 둘을 연결하는 새로운 conv_acti 모델을 만들 수 있다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;conv_acti&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keras&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;layers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;model 객체의 predict() 메서드를 호출하면 최종 출력층의 확률을 반환하지만,
&lt;br /&gt;conv_acti 객체의 predict() 메서드를 호출하면 첫 번째 Conv2D의 출력을 반환할 것이다.&lt;/p&gt;

&lt;h3 id=&quot;3-특성-맵-시각화&quot;&gt;3. 특성 맵 시각화&lt;/h3&gt;
&lt;hr /&gt;

&lt;p&gt;훈련 세트에 있는 첫 번째 샘플을 보면 앵클 부츠가 나온다.
&lt;br /&gt;이 샘플을 conv_acti 모델에 주입해 Conv2D 층이 만드는 특성 맵을 출력하는 것을 해보자.&lt;/p&gt;

&lt;p&gt;첫 번째 차원을 유지해야 하므로 슬라이싱 연산자를 통해 첫 번째 샘플을 선택한다.
&lt;br /&gt;feature_maps.shape의 크기를 확인해보면 (1, 28, 28, 32)가 나오는데 
&lt;br /&gt;세임 패딩과 32개의 필터를 사용한 합성곱의 출력이므로 (28, 28, 32)로 출력되고, 첫 번째 차원은 배치 차원이라 1로 출력된다.&lt;/p&gt;

&lt;p&gt;imshow 함수로 특성 맵을 그려보면 32개의 필터로 인해 입력 이미지에서 강하게 활성화된 부분을 보여준다.
&lt;br /&gt;출력한 그림을 보고 어떤 부분이 강하게 활성화되어 보여주는지 일 수 있다.
&lt;br /&gt;이와 같은 방법으로 두 번째 합성곱 층의 특성 맵도 확인 가능하다.&lt;/p&gt;

&lt;p&gt;첫 번째 풀링 층에서 가로세로 크기가 절반으로 줄고, 필터 개수가 64개이므로 (1, 14, 14, 64)일 것이다.
&lt;br /&gt;하지만 inshow 함수로 확인 했을 때 시각적으로 확인하기 어렵다.
&lt;br /&gt;두 번째 합성곱의 필터 크기는 (3, 3, 32)인데, 
&lt;br /&gt;두 번째 합성곱 층의 첫 번째 필터가 앞서 출력된 32개의 특성 맵과 곱해져 두 번째 합성곱 층의 첫 번째 특성 맵이 된다.
&lt;br /&gt;따라서 (14, 14, 32) 특성 맵에서 어떤 부위를 감지하는지 직관적으로 알기 어렵다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;합성곱 층을 많이 쌓을 수록 심해지는데 뒤로 갈수록 앞쪽에서 감지한 시각적인 정보를 바탕으로 추상적인 정보를 학습한다고 할 수 있다.&lt;/p&gt;</content><author><name>Hyeonsu</name></author><category term="Deep Learning" /><category term="가중치 시각화" /><category term="특성 맵 시각화" /><category term="함수형 API" /><summary type="html">본 포스팅 한빛미디어의 &amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;를 요약 정리했습니다.</summary></entry><entry><title type="html">[ML Study]ch08-2 합성곱 신경망을 사용한 이미지 분류</title><link href="/machine%20learning/2023/08/22/mlstudy-ch08-2.html" rel="alternate" type="text/html" title="[ML Study]ch08-2 합성곱 신경망을 사용한 이미지 분류" /><published>2023-08-22T00:01:00+00:00</published><updated>2023-08-22T00:01:00+00:00</updated><id>/machine%20learning/2023/08/22/mlstudy-ch08-2</id><content type="html" xml:base="/machine%20learning/2023/08/22/mlstudy-ch08-2.html">&lt;body&gt;
    &lt;img src=&quot;/assets/images/post/book_banner.jpg&quot; align=&quot;right&quot; width=&quot;20%&quot; height=&quot;27.2%&quot; /&gt;
    &lt;br /&gt;&lt;br /&gt;
    &lt;p&gt;본 포스팅 한빛미디어의 &lt;a href=&quot;https://product.kyobobook.co.kr/detail/S000001810330&quot;&gt;&amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;&lt;/a&gt;를 요약 정리했습니다.&lt;/p&gt;
&lt;/body&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;합성곱-신경망을-사용한-이미지-분류&quot;&gt;합성곱 신경망을 사용한 이미지 분류&lt;/h2&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;패션-mnist-데이터-불러오기&quot;&gt;패션 MNIST 데이터 불러오기&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Conv2D&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;입력의 너비와 높이 방향의 합성곱 연산을 구현한 클래스이다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;첫번쨰 매개변수는 합성곱 필터의 개수이다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;kernel_size 매개변수&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;필터의 커널 크기를 지정한다. 가로세로 크키가 같은 경우 정수 하나로, 다른 경우 정수의 튜플로 지정할 수 있다.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;일반적으로 커널의 가로세로 크기는 동일하다.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;커널의 깊이는 입력의 깊이와 동일하기 떄문에 따로 지정하지 않는다.&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;strides 매개변수&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;필터의 이동 간격을 지정한다.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;가로세로 크기가 같은 경우 정수 하나로, 다른 경우 정수의 튜플로 지정할 수 있다.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;일반적으로 가로세로 스트라이드 크기는 동일하다.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;기본값은 1이다.&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;padding 매개변수&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;입력의 패딩 타입을 지정한다.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;기본값 ‘valid’는 패딩을 하지 않는다.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;‘same’은 합성곱 층의 출력의 가로세로 크기를 입력과 동일하게 맞추도록 입력에 패딩을 추가한다.&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;activation 매개변수는 합성곱 층에 적용할 활성화 함수를 지정한다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;MaxPooling2D&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;먼저 Pooling은 convolution으로 뽑아낸 값을 전부 가져가는 것이 아니라, 대표적인 특징만 남기는 작업이다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;많이 사용하는 것은 MaxPooling으로 지정한 kernel만큼 훑으면서 가장 큰 값만 남기는 것이다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;첫 번째 매개변수는 풀링의 크기를 지정하며, 가로세로 크키가 같은 경우 정수 하나로, 다른 경우 정수의 튜플로 지정할 수 있다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;일반적으로 커널의 가로세로 크기는 동일하다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;strides 매개변수&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;풀링의 이동 간격을 지정한다.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;기본값은 풀링의 크기와 동일하다. 즉 입력 위를 겹쳐서 풀링하지 않는다.&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;padding 매개변수&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;입력의 패딩 타입을 지정한다.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;기본값 ‘vaild’는 패딩을 하지 않는다.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;‘same’은 합성곱 층의 출력의 가로세로 크기를 입력과 동일하게 맞추도록 입력에 패딩을 추가한다.&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;plot_model&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;케라스 모델 구조를 주피터 노트북에 그리거나 파일로 저장한다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;모델 구조를 시각화하는 함수이다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;모델의 계층 구성 및 데이터 흐름을 이해하기 쉬운 그래프로 표현할 수 있다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;첫 번째 매개변수에 케라스 모델 객체를 전달한다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;to_file 매개변수&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;파일 이름을 지정하면 그림을 파일로 저장한다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;show_shapes 매개변수&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;True로 지정하면 층의 입력, 출력 크기를 표시한다. 기본값은 False이다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;show_layer_names 매개변수&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;True로 지정하면 층 이름을 출력한다. 기본값은 True이다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;입력 이미지는 항상 깊이(채널) 차원이 있어야 한다.&lt;/p&gt;

&lt;p&gt;만약 입력 이미지가 흑백 이미지와 같은 채널 차원이 없는 2차원 배열일 경우 Conv2D 층을 사용하기 위해 마지막에 채널 차원을 추가해야 한다.&lt;/p&gt;

&lt;p&gt;넘파이 reshape() 메서드를 사용해 전체 배열 차원을 그대로 유지하면서 마지막에 차원을 간단히 추가할 수 있다.&lt;/p&gt;

&lt;p&gt;아래의 그림과 같이 차원이 추가 되는 것을 확인할 수 있다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/post/2023-08-22[8-2]/1.차원추가.png&quot; alt=&quot;1&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;
&lt;h3 id=&quot;합성곱-신경망-만들기&quot;&gt;합성곱 신경망 만들기&lt;/h3&gt;

&lt;p&gt;합성곱 신경망을 만들 떄 1. 합성곱 층 추가하기, 2. 풀링 층 추가하기, 3. Flatten, 은닉층, Drop, 출력층 구성하기로 나눌 수 있다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;합성공 층 추가하기&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;첫 번째 합성곱 층인 Conv2D를 추가한다. 만약 흑백 임지와 같은 채널 차원이 없는 2차원 배열일 경우 마지막에 채널 차원을 추가한다.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;필요한 매개변수는 커널의 개수, 커널의 이미지, 커널의 사이즈, 활성화 함수, 패딩, 입력 데이터 크기가 있다.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;패딩은 세임패딩을 전용한다.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;패딩은 입력 배열 주위를 가상의 원소로 채우는 것을 말한다.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;세임패딩은 합성곱 층의 출력 크기를 입력과 동일하게 만들기 위해 입력에 패딩을 추가하는 것이다.&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;폴링 층 추가하기&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;케라스는 최대 풀링과 평균 풀링을 MaxPooling2D와 AveragePooling2D를 제공한다. 그 중에서 하나를 선택하여 풀링을 사용한다.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;풀링을 통과한 후 두 번째 합성곱 풀링 층을 추가한다.&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Flatten, 은닉층, Drop, 출력층 구성하기&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;출력층에서 확률을 계산하기 위해 3창원 특성 맵을 펼친다.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;Flatten 층을 만들고, Dense은닉층, Dropout, Dense 출력층 순서대로 층을 구성한다.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;은닉층과 출력층 사이에 Dropout을 넣어 은닉층의 과대적합을 막아 성능을 개선할 수 있다.&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;
&lt;h3 id=&quot;모델-구조-확인하기&quot;&gt;모델 구조 확인하기&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;summary() 메서드로 모델 구조를 확인할 수 있다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;keras.utils 패키지의 plot_model() 으로 층의 구성을 그림으로 확인할 수 있다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;</content><author><name>Hyemin</name></author><category term="Machine Learning" /><category term="Conv2D" /><category term="MaxPooling2D" /><category term="plot_model" /><summary type="html">본 포스팅 한빛미디어의 &amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;를 요약 정리했습니다.</summary></entry><entry><title type="html">[ML Study]ch08-1 인공 신경망</title><link href="/machine%20learning/2023/08/22/mlstudy-ch08-1.html" rel="alternate" type="text/html" title="[ML Study]ch08-1 인공 신경망" /><published>2023-08-22T00:00:00+00:00</published><updated>2023-08-22T00:00:00+00:00</updated><id>/machine%20learning/2023/08/22/mlstudy-ch08-1</id><content type="html" xml:base="/machine%20learning/2023/08/22/mlstudy-ch08-1.html">&lt;body&gt;
    &lt;img src=&quot;/assets/images/post/book_banner.jpg&quot; align=&quot;right&quot; width=&quot;20%&quot; height=&quot;27.2%&quot; /&gt;
    &lt;br /&gt;&lt;br /&gt;
    &lt;p&gt;본 포스팅 한빛미디어의 &lt;a href=&quot;https://product.kyobobook.co.kr/detail/S000001810330&quot;&gt;&amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;&lt;/a&gt;를 요약 정리했습니다.&lt;/p&gt;
&lt;/body&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;합성곱&quot;&gt;합성곱&lt;/h2&gt;
&lt;hr /&gt;
&lt;p&gt;합성곱(convolution)은 입력 데이터의 특징을 추출하기 위한 연산이다. 주로 이미지 데이터를 처리하는 데 사용되고 합성곱 연산을 통해 입력 이미지에서 패턴과 특징을 감지한다.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;유용한 특성만 드러나게 하는 것과 유사&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;특성&quot;&gt;특성&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;입력 데이터 전체에 가중치를 곱하는 것이 아닌 일부 데이터에 가중치를 곱한다.&lt;/li&gt;
  &lt;li&gt;하나의 뉴런에 1개의 출력을 내므로 몇개의 데이터를 입력하던지 output은 뉴런의 개수만큼 출력된다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/post/2023-08-23-[8-1]/neuron.gif&quot; alt=&quot;gif_1&quot; /&gt;
위 영상과 같이 뉴런의 개수와 총 입력데이터의 개수 만큼 출력된다.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;“뉴런 == 필터 == 커널” 모두 같은 말이다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;2차원 데이터 일때는 필터를 (3,3)과 같이 사각형으로 만들어서 1차원에서 하던것과 같이 똑같이 진행합니다. 만약 총 데이터가 (4,4)였다면 필터를 이용해 연산해보면 (2,2)의 데이터가 출력되고 출력된 데이터를 특성 맵(feature map)이라고 부른다.&lt;/p&gt;

&lt;h2 id=&quot;케라스-합성곱-층&quot;&gt;케라스 합성곱 층&lt;/h2&gt;
&lt;hr /&gt;
&lt;p&gt;케라스의 층은 keras.layers 패키지에 구현되어 있다.&lt;/p&gt;

&lt;p&gt;위에서 2차원 데이터를 입력으로 하기 위한 패키지는 아래와 같이 커널(필터)의 크기를 정해주고 맨 앞은 필터의 개수를 정해주면 된다.&lt;/p&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;tensorflow&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keras&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;keras&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;layers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Conv2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kernel_size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;activation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'relu'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;패딩-및-스트라이드&quot;&gt;패딩 및 스트라이드&lt;/h3&gt;
&lt;p&gt;입력 데이터가 (4,4), 커널이 (3,3)이면 출력값은 (2,2)가 되지만 만약 출력값이 줄어드는 것을 원하지 않고 (3,3)으로 고정되길 원한다면 입력 데이터(4,4)를 x,y 한 행씩 추가하여 (5,5)로 만들고 합성곱 층을 실행하면 된다. 추가한 행은 0이라는 값으로 패딩(padding)하여 0으로 채워주면된다. 0으로 추가되는 것이기 때문에 계산에도 영향을 끼치지 않아서 맘대로 늘려도 상관없다.&lt;/p&gt;

&lt;p&gt;패딩 종류는 0으로 채워 넣는 세임 패딩(same padding)과 순수한 입력 배열에서만 합성곱을 하여 특성 맵을 만드는 경우인 밸리드 패딩(valid padding)이 존재한다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;keras&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;layers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Conv2D&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;필터&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;개수&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kernel_size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;activation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'relu'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'same'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ow&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'valid'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;스트라이드(stride)는 이동 크기라고 한다. 기본으로는 1의 값이 들어가므로 한칸씩 위아래로 이동하지만 만약 이미지의 크기가 크고 특성 맵을 더 작게 줄이고 싶다면 스트라이드 값을 늘려주면된다. (만약 2로 하게되면 두 칸씩 이동)&lt;/p&gt;

&lt;h3 id=&quot;풀링&quot;&gt;풀링&lt;/h3&gt;
&lt;p&gt;풀링(pooling)은 합성곱 층에서 만든 특성 맵의 가로세로 크기를 중이는 역할을 수행한다. 특성 맵의 개수는 줄이지 않는다.&lt;/p&gt;</content><author><name>Jinha_k</name></author><category term="Machine Learning" /><category term="Artificial Neural Network" /><category term="TensorFlow" /><category term="one-hot encoding" /><category term="Dense Layer" /><summary type="html">본 포스팅 한빛미디어의 &amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;를 요약 정리했습니다.</summary></entry><entry><title type="html">[ML Study]ch07-3 신경망 모델 훈련</title><link href="/machine%20learning/2023/08/09/mlstudy-ch07-3.html" rel="alternate" type="text/html" title="[ML Study]ch07-3 신경망 모델 훈련" /><published>2023-08-09T00:03:00+00:00</published><updated>2023-08-09T00:03:00+00:00</updated><id>/machine%20learning/2023/08/09/mlstudy-ch07-3</id><content type="html" xml:base="/machine%20learning/2023/08/09/mlstudy-ch07-3.html">&lt;body&gt;
    &lt;img src=&quot;/assets/images/post/book_banner.jpg&quot; align=&quot;right&quot; width=&quot;20%&quot; height=&quot;27.2%&quot; /&gt;
    &lt;br /&gt;&lt;br /&gt;
    &lt;p&gt;본 포스팅 한빛미디어의 &lt;a href=&quot;https://product.kyobobook.co.kr/detail/S000001810330&quot;&gt;&amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;&lt;/a&gt;를 요약 정리했습니다.&lt;/p&gt;
&lt;/body&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;신경망-모델-훈련&quot;&gt;신경망 모델 훈련&lt;/h2&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;손실-곡선&quot;&gt;손실 곡선&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;fit() 메서드로 모델을 훈련하면 훈련 과정이 상세하게 출력되어 에포크 횟수, 손실, 정확도 등을 확인할 수 있다.&lt;/li&gt;
  &lt;li&gt;그런데 아래와 같이 출력의 마지막에 다음과 같은 메시지가 출력되는 것을 확인했을 것이다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;tensorflow.python.keras.callbacks.History at 0x7f11f82f5710&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;위 메시지는 fit()메서드의 실행 결과를 출력한 것이다. fit() 메서드는 History 클래스 객체를 반환한다. History 객체에는 훈련 과정에서 계산한 지표, 즉 손실과 정확도 값이 저장 되어 있다.
이 값을 이용해 그래프를 그려 얼마나 손실 했는지, 정확도가 얼마나 향상하는지 확인할 수 있다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/post/2023-08-09[7-3]/1.손실곡선.png&quot; alt=&quot;1.손실 곡선&quot; /&gt;&lt;/p&gt;

&lt;p&gt;위 그래프를 보면 에포크 횟수와 손실 값을 확인할 수 있다. x축은 에포크 횟수, y축은 계산된 손실 값이다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/post/2023-08-09[7-3]/2.정확도곡선.png&quot; alt=&quot;2. 정확도 곡선&quot; /&gt;&lt;/p&gt;

&lt;p&gt;위 그래프는 정확도를 출력한 것이다. 그래프를 보면 에포크마다 손실이 감소하고 정확도가 향상하는 것을 볼 수 있다.&lt;/p&gt;

&lt;p&gt;이를 통해 에포크를 늘리면 손실이 감소할 것이라 판단하여 에포크 횟수를 늘려 훈련을 진행한다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/post/2023-08-09[7-3]/3.에포크늘림.png&quot; alt=&quot;3. 에포크 늘린것&quot; /&gt;&lt;/p&gt;

&lt;p&gt;예상대로 에포크 횟수를 늘리니 에포크마다 손실이 감소하는 것을 확인할 수 있다.&lt;/p&gt;

&lt;hr /&gt;
&lt;h3 id=&quot;검증-손실&quot;&gt;검증 손실&lt;/h3&gt;

&lt;p&gt;에포크에 따른 과대적합과 과소적합을 파악하려면 훈련 세트에 대한 점수뿐만 아니라 검증 세트에 대한 점수도 필요하다.&lt;/p&gt;

&lt;p&gt;따라서 훈련 세트의 손실만 그리는 것이 아닌 검증 세트에 대한 손실을 그려 파악해야 한다.&lt;/p&gt;

&lt;p&gt;만약 그래프를 그린다면 아래와 같은 그래프가 그려질거라 예상한다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/post/2023-08-09[7-3]/4.검증%20손실.png&quot; alt=&quot;4.검증 손실&quot; /&gt;&lt;/p&gt;

&lt;p&gt;과대/과소 적합 문제를 보기 위해 훈련 손실과 검증 손실을 한 그래프에 그려서 비교한다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/post/2023-08-09[7-3]/5.검증,훈련%20세트%20그래프.png&quot; alt=&quot;5.검증 손실&quot; /&gt;&lt;/p&gt;

&lt;p&gt;그래프를 보면 초기에 검증 손실이 감소하다가 다섯 번째 에포크 만에 다시 상승하기 시작한다.&lt;/p&gt;

&lt;p&gt;훈련 손실은 꾸준히 감소하기 때문에 전형적인 과대적합 모델이 만들어진다.&lt;/p&gt;

&lt;p&gt;검증 손실이 상승하는 시점을 가능한 뒤로 늦추면 검증 세트에 대한 손실이 줄어들 뿐만 아니라 검증 세트에 대한 정확도도 증가할 것이다.&lt;/p&gt;</content><author><name>Hyemin</name></author><category term="Machine Learning" /><category term="드롭아웃" /><category term="콜백" /><category term="조기 종료" /><summary type="html">본 포스팅 한빛미디어의 &amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;를 요약 정리했습니다.</summary></entry><entry><title type="html">[ML Study]ch07-2 심층 신경망</title><link href="/deep%20learning/2023/08/09/mlstudy-ch07-2.html" rel="alternate" type="text/html" title="[ML Study]ch07-2 심층 신경망" /><published>2023-08-09T00:02:00+00:00</published><updated>2023-08-09T00:02:00+00:00</updated><id>/deep%20learning/2023/08/09/mlstudy-ch07-2</id><content type="html" xml:base="/deep%20learning/2023/08/09/mlstudy-ch07-2.html">&lt;body&gt;
    &lt;img src=&quot;/assets/images/post/book_banner.jpg&quot; align=&quot;right&quot; width=&quot;20%&quot; height=&quot;27.2%&quot; /&gt;
    &lt;br /&gt;&lt;br /&gt;
    &lt;p&gt;본 포스팅 한빛미디어의 &lt;a href=&quot;https://product.kyobobook.co.kr/detail/S000001810330&quot;&gt;&amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;&lt;/a&gt;를 요약 정리했습니다.&lt;/p&gt;
&lt;/body&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id=&quot;1-2개의-층&quot;&gt;1. 2개의 층&lt;/h3&gt;
&lt;hr /&gt;

&lt;p&gt;케라스 API를 사용해 MNIST 데이터셋을 불러온다.
&lt;br /&gt;1절과 같이 학습시키고 인공 신경망 모델에 층을 2개 추가한다.&lt;/p&gt;

&lt;p&gt;입력층과 출력층 사이에 밀집층이 추가된 것으로 이 사이에 있는 모든 층을 &lt;strong&gt;은닉층&lt;/strong&gt;이라 부른다.
&lt;br /&gt;은닉층 옆에 &lt;strong&gt;활성화 함수&lt;/strong&gt;가 붙는데 이는 신경망 층의 선형 방정식의 계산 값에 적용하는 함수이다.
&lt;br /&gt;활성화 함수는 출력층에 적용하는 활성화 함수보다 비교적 자유롭다.&lt;/p&gt;

&lt;p&gt;은닉층에서 선형적인 산술 계산만 수행한다면 수행 역할이 없는 셈이 되어 선형 계산을 적당하게 비선형적으로 비틀어야 한다.
&lt;br /&gt;다음 층의 계산과 단순히 합쳐지는 것을 방지하고 나름의 역할을 하도록 하는 것이다.&lt;/p&gt;

&lt;p&gt;많이 사용하는 활성화 함수 중 하나는 &lt;strong&gt;시그모이드 함수&lt;/strong&gt;이다.&lt;/p&gt;

&lt;p&gt;이 함수는 뉴런의 출력을 z값을 0과 1 사이로 압축하는데
&lt;br /&gt;시그모이드 활성화 함수를 사용한 은닉층과 소프트맥스 함수를 사용한 출력층을 케라스의 Dense 클래스로 만들어 보자.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;dense1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keras&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;layers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Dense&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;activation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'sigmod'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input_shape&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;784&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dense2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keras&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;layers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Dense&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;activation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'softmax'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;dense1이 은닉층이고 100개의 뉴런을 가진 밀집층이다. 
은닉층의 뉴런 개수를 정하는데는 특별한 기준이 없다.
&lt;br /&gt;하지만 적어도 출력층의 뉴런보다는 많게 만들어야 한다. 부족한 정보가 전달될 수 있기 때문이다.
&lt;br /&gt;dense2는 출력층으로 10개의 클래스를 분류하므로 10개의 뉴런을 둔 것이다.&lt;/p&gt;

&lt;h3 id=&quot;2-심층-신경망-만들기&quot;&gt;2. 심층 신경망 만들기&lt;/h3&gt;
&lt;hr /&gt;

&lt;p&gt;앞서 만든 두 객체를 Sequential클래스에 추가해서 &lt;strong&gt;심층 신경망&lt;/strong&gt;을 만들어 보자.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-pyhton&quot;&gt;model = keras.Sequential([dense1, dense2])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sequential 클래스에서 여러 개의 층을 추가하려면 두 객체를 리스트로 만들어 전달해야 한다. [dense1, dense2]
&lt;br /&gt;이 리스트는 가장 처음 등장하는 은닉층에서 마지막 출력층의 순서로 나열해야 한다.
&lt;br /&gt;출력층을 가장 마지막에 두어야 한다는 것이다.&lt;/p&gt;

&lt;p&gt;케라스는 모델의 summary() 메서드를 호출하면 층에 대한 유용한 정보를 얻을 수 있는데&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-pyhton&quot;&gt;model.summary()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이런 식으로 확인 가능하다.&lt;/p&gt;

&lt;p&gt;맨 첫 줄에 모델 이름이 나오면서 이 모델에 들어 있는 층이 순서대로 나열된다.
&lt;img src=&quot;/assets/images/post/2023-08-09-[7-2]/ch07-2(1).png&quot; alt=&quot;결정트리&quot; /&gt;
&lt;br /&gt;위처럼 층마다 층 이름, 클래스, 출력 크기, 모델 파라미터 개수가 출력되는 것을 볼 수 있다.
&lt;br /&gt;위의 정보를 보고 모델의 층들을 파악하면 된다.&lt;/p&gt;

&lt;h3 id=&quot;3-층을-추가하는-다른-방법&quot;&gt;3. 층을 추가하는 다른 방법&lt;/h3&gt;
&lt;hr /&gt;

&lt;p&gt;Seqeuntial 클래스에 층을 추가하는 다른 방법으로 이 클래스 생성자 안에서 바로 Dense 클래스의 객체를 만드는 것이 있다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keras&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Sequential&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;keras&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;layers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Dense&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;activation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'sigmoid'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input_shape&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;784&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'hidden'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;keras&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;layers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Dense&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;activation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'softmax'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'output'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'패션 MNIST 모델'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;위와 같이 작성하게 되면 층을 한눈에 쉽게 알아볼 수 있고 name 매개변수로 모델의 이름을 지정할 수 있다.&lt;/p&gt;

&lt;p&gt;Dense 클래스를 사용해 sigmod와 softmax를 사용한 것과 같이 Seqeuntial 클래스의 객체를 만들고 이 객체의 add() 메서드를 호출해 층을 추가할 수 있다.
&lt;br /&gt;이와 같이 만들어진 모델을 compile() 설정을 하여 에포크를 지정해 훈련한다.&lt;/p&gt;

&lt;h3 id=&quot;4-렐루-함수&quot;&gt;4. 렐루 함수&lt;/h3&gt;
&lt;hr /&gt;

&lt;p&gt;시그모이드 함수는 올바른 출력을 만드는데 신속하게 대응하지 못한다는 단점이 있다.
&lt;br /&gt;이를 보완하기 위해 제안된 활성화 함수가 &lt;strong&gt;렐수 함수&lt;/strong&gt;이다.&lt;/p&gt;

&lt;p&gt;렐루 함수는 양수일 경우 입력을 그냥 통과 시키고, 음수일 경우에는 0으로 만든다.
&lt;br /&gt;따라서 max(0, z)와 같은 형식으로 쓸 수 있고 이미지 처리에서 좋은 성능을 낸다.&lt;/p&gt;

&lt;p&gt;렐루 함수를 사용하기 전 &lt;strong&gt;Flatten 층&lt;/strong&gt;을 살펴보자.
&lt;br /&gt;Flatten은 배치 차원을 제외한 나머지 입력 차원을 모두 일렬로 펼치는 역할을 하는데, 
층처럼 입력층과 은닉층 사이에 추가하기 때문에 이를 층이라 부른다.
&lt;br /&gt;따라서, 입력층 바로 뒤에 코드를 추가하면 된다.&lt;/p&gt;

&lt;p&gt;Flatten 층을 신경망 모델에 추가하면 입력값의 차원을 짐작할 수 있는 것에 장점이 있다.
&lt;br /&gt;input_shape 매개변수를 Flatten 층으로 옮기고 첫 번째 Dense 층의 활성화 함수를 &lt;strong&gt;relu&lt;/strong&gt;로 바꾸어 확인해 보면 알 수 있다.
&lt;br /&gt;시그모이드 함수를 사용했을 때보다 성능이 향상되고, 검증 세트에서도 몇 퍼센트 성능이 향상된다.&lt;/p&gt;

&lt;h3 id=&quot;5-옵티마이저&quot;&gt;5. 옵티마이저&lt;/h3&gt;
&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;옵티마이저&lt;/strong&gt;의 종류로 Adam, Momentum, RMSprop, SGD 등이 존재한다.
&lt;br /&gt;가장 기본적인 옵티마이저는 확률적 경사 하강법인 &lt;strong&gt;SGD&lt;/strong&gt;이다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;compile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;optimizer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'sgd'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loss&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'sparse_categorical_crossentropy'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;metrics&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'accuracy'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;또는&lt;/p&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;sgd&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keras&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;optimizers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SGD&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;compile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;optimizer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sgd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loss&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'sparse_categorical_crossentropy'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;metrics&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'accuracy'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;이렇게 SGD 옵티마이저를 불러온다.
&lt;br /&gt;기본 경사 하강법 옵티마이저는 모두 SGD 클래스에서 제공하고, SGD 클래스의 momentum 매개변수의 기본값은 0이다.
&lt;br /&gt;&lt;strong&gt;모멘텀 최적화&lt;/strong&gt;를 사용하여 보통 momentum 매개변수는 0.9 이상을 지정한다.&lt;/p&gt;

&lt;p&gt;SGD 클래스의 nesterov 매개변수를 기본값 False에서 True로 바꾸면 &lt;strong&gt;네스테로프 모멘텀 최적화&lt;/strong&gt;를 사용한다.
&lt;br /&gt;이는 모멘텀 최적화를 2번 반복하여 구현한다. 기본 확률적 경사 하강법보다는 더 나은 성능을 제공한다.&lt;/p&gt;

&lt;p&gt;모델이 최적점에 가까이 갈수록 학습률을 낮출 수 있다. 이를 &lt;strong&gt;적응적 학습률&lt;/strong&gt;이라고 한다.
&lt;br /&gt;학습률 매개변수를 튜닝하는 수고를 덜 수 있다는 것이 장점이며, 대표적으로 &lt;strong&gt;Adagrad, RMSprop&lt;/strong&gt;가 있다.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;모멘텀 최적화와 RMSprop의 장점을 접목한 것이 Adam이다.
&lt;br /&gt;이전에 학습한 것과 같이 optimizer을 ‘adam’으로 설정해 훈련하면 기본 RMSprop 보다 조금 나은 성능을 보여준다.&lt;/p&gt;</content><author><name>Hyeonsu</name></author><category term="Deep Learning" /><category term="심층 신경망" /><category term="렐루 함수" /><category term="옵티마이저" /><summary type="html">본 포스팅 한빛미디어의 &amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;를 요약 정리했습니다.</summary></entry><entry><title type="html">[ML Study]ch07-1 인공 신경망</title><link href="/machine%20learning/2023/08/09/mlstudy-ch07-1.html" rel="alternate" type="text/html" title="[ML Study]ch07-1 인공 신경망" /><published>2023-08-09T00:01:00+00:00</published><updated>2023-08-09T00:01:00+00:00</updated><id>/machine%20learning/2023/08/09/mlstudy-ch07-1</id><content type="html" xml:base="/machine%20learning/2023/08/09/mlstudy-ch07-1.html">&lt;body&gt;
    &lt;img src=&quot;/assets/images/post/book_banner.jpg&quot; align=&quot;right&quot; width=&quot;20%&quot; height=&quot;27.2%&quot; /&gt;
    &lt;br /&gt;&lt;br /&gt;
    &lt;p&gt;본 포스팅 한빛미디어의 &lt;a href=&quot;https://product.kyobobook.co.kr/detail/S000001810330&quot;&gt;&amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;&lt;/a&gt;를 요약 정리했습니다.&lt;/p&gt;
&lt;/body&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;패션-mnist&quot;&gt;패션 MNIST&lt;/h2&gt;
&lt;p&gt;패션 MNIST는 기계 학습과 컴퓨터 비전 연구를 위해 사용되는 데이터셋 중 하나로 전통적인 손글씨 숫자 MNIST 데이터셋의 대안으로 개발되었다. 해당 데이터셋은 &lt;strong&gt;옷&lt;/strong&gt;, &lt;strong&gt;액세서리&lt;/strong&gt; 등 다양한 패션 아이템의 이미지로 구성되어 있고 각 이미지는 &lt;strong&gt;28x28 픽셀의 흑백 이미지&lt;/strong&gt;로 구성된다. 
&lt;br /&gt;
주로 이미지 분류 알고리즘을 개발하고 평가하는데 사용되고 딥러닝 라이브러리에서 데이터를 가져올 수 있다. 그리고 아래와 같이 패션 아이템을 나타내는 총 10개의 클래스가 있다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;T-shirt/top&lt;/li&gt;
  &lt;li&gt;Trouser&lt;/li&gt;
  &lt;li&gt;Pullover&lt;/li&gt;
  &lt;li&gt;Dress&lt;/li&gt;
  &lt;li&gt;Coat&lt;/li&gt;
  &lt;li&gt;Sandal&lt;/li&gt;
  &lt;li&gt;Shirt&lt;/li&gt;
  &lt;li&gt;Sneaker&lt;/li&gt;
  &lt;li&gt;Bag&lt;/li&gt;
  &lt;li&gt;Ankle boot&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;패션 MNIST를 불러오는 방법은 아래 코드와 같이 불러오면 된다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;tensorflow&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keras&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;train_x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;train_y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;test_y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keras&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;datasets&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fashion_mnist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;load_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;인공-신경망&quot;&gt;인공 신경망&lt;/h2&gt;</content><author><name>Jinha_k</name></author><category term="Machine Learning" /><category term="Artificial Neural Network" /><category term="TensorFlow" /><category term="one-hot encoding" /><category term="Dense Layer" /><summary type="html">본 포스팅 한빛미디어의 &amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;를 요약 정리했습니다.</summary></entry><entry><title type="html">[ML Study]ch06-3 주성분 분석</title><link href="/machine%20learning/2023/08/03/mlstudy-ch06-3.html" rel="alternate" type="text/html" title="[ML Study]ch06-3 주성분 분석" /><published>2023-08-03T00:02:00+00:00</published><updated>2023-08-03T00:02:00+00:00</updated><id>/machine%20learning/2023/08/03/mlstudy-ch06-3</id><content type="html" xml:base="/machine%20learning/2023/08/03/mlstudy-ch06-3.html">&lt;body&gt;
    &lt;img src=&quot;/assets/images/post/book_banner.jpg&quot; align=&quot;right&quot; width=&quot;20%&quot; height=&quot;27.2%&quot; /&gt;
    &lt;br /&gt;&lt;br /&gt;
    &lt;p&gt;본 포스팅 한빛미디어의 &lt;a href=&quot;https://product.kyobobook.co.kr/detail/S000001810330&quot;&gt;&amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;&lt;/a&gt;를 요약 정리했습니다.&lt;/p&gt;
&lt;/body&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;차원-축소&quot;&gt;차원 축소&lt;/h2&gt;
&lt;hr /&gt;
&lt;p&gt;차원 축소란 데이터가 가진 속성을 특성(Feature)라고 부르는데 이런 특성을 차원이라고 부른다. 차원 축소는 데이터를 가장 잘 나타내는 일부 특성을 선택하여 데이터 크기를 줄이고 지도 학습 모델의 성능을 향상시킬 수 있다.&lt;/p&gt;

&lt;h3 id=&quot;주성분-분석&quot;&gt;주성분 분석&lt;/h3&gt;
&lt;p&gt;주성분 분석(Principal component Analysis, PCA)는 차원 축소 알고리즘으로 다차원 데이터의 차원을 축소하면서 데이터의 변동성을 최대한 보존하는 기법이다. 이를 통해 데이터를 더 낮은 차원으로 표현하면서 중요한 정보를 유지할 수 있다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PCA 과정&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;데이터 센터링&lt;/li&gt;
  &lt;li&gt;최적화 문제 정의&lt;/li&gt;
  &lt;li&gt;최적화 문제 해결&lt;/li&gt;
  &lt;li&gt;주축 정렬&lt;/li&gt;
  &lt;li&gt;PCA로 변환 및 복원&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;주성분 분석의 한계&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;데이터가 가우시안 분포라는 것을 가정하여 가우시안 분포가 아닌 자료에 적용하기 어렵다.&lt;/li&gt;
  &lt;li&gt;분류 문제를 위해 제작된게 아니기 때문에 분류 성능 향상을 보장받지 못한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;pca-클래스&quot;&gt;PCA 클래스&lt;/h4&gt;
&lt;p&gt;사이킷런은 sklearn.decomposition 모듈 아래 PCA 클래스로 주성분 분석 알고리즘을 제공한다. PCA 클래스 객체를 만들 때 c_components 매개변수에 주성분의 개수를 정해야 한다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;sklearn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;decomposition&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PCA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_components&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;copy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;whiten&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;svd_solver&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'auto'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tol&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;iterated_power&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'auto'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_oversamples&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;power_iteration_normalizer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'auto'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;random_state&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ul&gt;
  &lt;li&gt;PCA 클래스는 데이터의 특이값 분해를 사용해 선형 차원 축소로 데이터를 저차원 공간에 투영한다. 입력데이터는 중앙에 위치하지만 SVD를 적용하기 전에 각 특징에 대해 스케일링되지 않는다.&lt;/li&gt;
  &lt;li&gt;입력 데이터의 모양과 추출할 구성 요소의 수에 따라 전체 SVD의 LAPACK 구현 쏘는 Halko 등의 방법에 따른 무작위로 잘린 SVD를 사용한다.
    &lt;blockquote&gt;
      &lt;p&gt;특잇값 분해(Singular Value Decomposition, SVD)는 행렬을 세 개의 행렬의 곱으로 분해하는 기법이고 차원 축소할 때 사용한다.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;inverse_transform()&lt;/code&gt; 메서드를 이용하여 데이터를 복원할 수 있다.&lt;/p&gt;

&lt;h3 id=&quot;설명된-분산&quot;&gt;설명된 분산&lt;/h3&gt;
&lt;p&gt;설면된 분산(Explained Variance)은 주성분이 원본 데이터의 분산을 얼마나 잘 나타내는지를 기록한 값이다. PCA 클래스의 explained_variance_ratio에 각 주성분의 설명된 분산 비율이 기록되어 있고 첫번째 주성분의 설명된 분산이 가장 크다.&lt;/p&gt;</content><author><name>Jinha_k</name></author><category term="Machine Learning" /><category term="Dimensionality Reduction" /><category term="Principal Component Analysis" /><category term="Explained Variance" /><summary type="html">본 포스팅 한빛미디어의 &amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;를 요약 정리했습니다.</summary></entry><entry><title type="html">[ML Study]ch06-2 k 평균</title><link href="/machine%20learning/2023/08/03/mlstudy-ch06-2.html" rel="alternate" type="text/html" title="[ML Study]ch06-2 k 평균" /><published>2023-08-03T00:01:00+00:00</published><updated>2023-08-03T00:01:00+00:00</updated><id>/machine%20learning/2023/08/03/mlstudy-ch06-2</id><content type="html" xml:base="/machine%20learning/2023/08/03/mlstudy-ch06-2.html">&lt;body&gt;
    &lt;img src=&quot;/assets/images/post/book_banner.jpg&quot; align=&quot;right&quot; width=&quot;20%&quot; height=&quot;27.2%&quot; /&gt;
    &lt;br /&gt;&lt;br /&gt;
    &lt;p&gt;본 포스팅 한빛미디어의 &lt;a href=&quot;https://product.kyobobook.co.kr/detail/S000001810330&quot;&gt;&amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;&lt;/a&gt;를 요약 정리했습니다.&lt;/p&gt;
&lt;/body&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;k-평균&quot;&gt;K 평균&lt;/h2&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;k-평균-1&quot;&gt;K 평균&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;k-평균 알고리즘(K-means)은 주변 데이터를 K개의 클러스터로 묶어 평균값을 찾는 알고리즘이다.
    &lt;ul&gt;
      &lt;li&gt;여기서 K는 묶을 군집의 개수를 의미한다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;k-평균 알고리즘이 찾은 평균값이 클러스터의 중심에 위치하기 때문에 클러스터 중심(cluster center) 또는 센트로이드(centroid)라고 부른다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;k 평균 알고리즘 작동 순서는 다음과 같다.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;무작위로 k개의 클러스터 중심을 정한다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;각 샘플에서 가장 가까운 클러스터 중심을 찾아 해당 클러스터의 샘플로 지정한다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;클러스터에 속한 샘플의 평균값으로 클러스터 중심을 변경한다.
    &lt;ul&gt;
      &lt;li&gt;거리 상 가까운 군집(중심점)으로 주어진 모든 데이터를 할당 또는 배정한다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;클러스터 중심에 변화가 없을 때까지 2번으로 돌아가 반복한다.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;이를 그림으로 나타내면 아래의 그림과 같다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/post/2023-08-09-[6-2]/1.k-평균%20작동%20순서.png&quot; alt=&quot;1.k-평균 작동순서&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;먼저 3개의 클러스터 중심(빨간 점)을 랜덤하게 지정한다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;그리고 클러스터 중심에서 가장 가까운 샘플을 하나의 클러스터로 묶는다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;왼쪽 위부터 시계 방향으로 클러스터가 만들어졌다. 클러스터에는 순서나 번호는 의미가 없다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;그다음 클러스터의 중심을 다시 계산하여 이동시킨다. 맨 아래 클러스터는 사과 쪽으로 중심이 조금 더 이동하고 왼쪽 위의 클러스터는 포도 쪽으로 중심이 더 이동하는 식이다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;클러스터 중심을 다시 계산한 다음 가장 가까운 샘플을 다시 클러스터로 묶는다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;이제 3개의 클러스터에는 포도와 오렌지, 사과가 3개씩 올바르게 묶여있다. 다시 한번 클러스터 중심을 계산한다. 그다음 빨간 점을 클러스터의 가운데 부분으로 이동시킨다.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;이동된 클러스터 중심에서 다시 한번 가장 가까운 샘플을 클러스터로 묶는다. 중심에서 가장 가까운 샘플은 이전 클러스터와 동일하다. 따라서 만들어진 클러스터에 변동이 없으므로 k-평균 알고리즘을 종료한다.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;이렇게 k-평균 알고리즘은 처음에는 랜덤하게 클러스터 중심을 선택하고 점차 가장 가까운 샘플의 중심으로 이동하는 비교적 간단한 알고리즘이다.&lt;/p&gt;

&lt;p&gt;사이킷런의 k-평균 알고리즘은 sklearn.cluster 모듈 아래 KMeans 클래스에 구현되어 있다.&lt;/p&gt;</content><author><name>Hyemin</name></author><category term="Machine Learning" /><category term="k-평균" /><category term="클러스터 중심" /><category term="엘보우 방법" /><summary type="html">본 포스팅 한빛미디어의 &amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;를 요약 정리했습니다.</summary></entry><entry><title type="html">[ML Study]ch06-1 군집 알고리즘</title><link href="/machine%20learning/2023/08/03/mlstudy-ch06-1.html" rel="alternate" type="text/html" title="[ML Study]ch06-1 군집 알고리즘" /><published>2023-08-03T00:00:00+00:00</published><updated>2023-08-03T00:00:00+00:00</updated><id>/machine%20learning/2023/08/03/mlstudy-ch06-1</id><content type="html" xml:base="/machine%20learning/2023/08/03/mlstudy-ch06-1.html">&lt;body&gt;
    &lt;img src=&quot;/assets/images/post/book_banner.jpg&quot; align=&quot;right&quot; width=&quot;20%&quot; height=&quot;27.2%&quot; /&gt;
    &lt;br /&gt;&lt;br /&gt;
    &lt;p&gt;본 포스팅 한빛미디어의 &lt;a href=&quot;https://product.kyobobook.co.kr/detail/S000001810330&quot;&gt;&amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;&lt;/a&gt;를 요약 정리했습니다.&lt;/p&gt;
&lt;/body&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id=&quot;1-비지도-학습&quot;&gt;1. 비지도 학습&lt;/h3&gt;
&lt;hr /&gt;

&lt;p&gt;타깃이 없을 때 사용하는 머신러닝 알고리즘을 &lt;strong&gt;비지도 학습&lt;/strong&gt;이라고 한다.
&lt;br /&gt;타깃(사진에 대한 정답)을 모르는 사진들을 종류별로 분류하려 한다. 
&lt;br /&gt;이를 위해 사진의 픽셀값을 모두 평균내서 비슷한 과일을 모아보는 방법을 제안한다.&lt;/p&gt;

&lt;h3 id=&quot;2-과일-사진-데이터-준비하기&quot;&gt;2. 과일 사진 데이터 준비하기&lt;/h3&gt;
&lt;hr /&gt;

&lt;p&gt;npy파일로 저장된 사과, 바나나, 파인애플을 담고 있는 흑백사진 데이터를 준비한다.
&lt;br /&gt;npy파일을 다운로드 해야한다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;[과일 데이터셋의 출처] https://www.kaggle.com/moltean/fruits&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;wget 오류가 떠서 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://bit.ly/fruits_300_data&lt;/code&gt;에 접속해 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fruits_300.npy&lt;/code&gt;파일을 다운 받은 후,
&lt;br /&gt;주피터랩에 따로 파일을 넣어주고 실행시켰다.&lt;/p&gt;

&lt;p&gt;이 배열은 첫 번째 차원을 300으로 샘플의 개수, 두 번째 차원과 세 번째 차원은 둘 다 100으로 각각 이미지 높이, 이미지 너비를 나타낸다.
&lt;br /&gt;이미지의 크기는 100x100으로 300개의 샘플이 있는 것이다.&lt;/p&gt;

&lt;p&gt;첫 번째 이미지의 첫 번째 행을 모두 선택하여 픽셀 100개에 들어 있는 값을 출력해 본다.&lt;/p&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fruits&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;imshow() 함수를 사용해 출력된 값을 이미지로 그려본다. (이미지 : 사과)
&lt;br /&gt;이때, 흑백 이미지이므로 cmap 매개변수를 사용해 gray로 지정해 주는데 이를 또 반전시켜주어야 한다.&lt;/p&gt;

&lt;p&gt;0~255까지의 정숫값을 가지는 넘파이 배열은 0에 가까울 수록 검게 나타나고 높은 값은 밝게 표시가 된다.
&lt;br /&gt;이대로 출력한다면 배경은 검게 중간 부분은 밝게 나타나게 된다.&lt;/p&gt;

&lt;p&gt;사실 우리가 사용하는 흑백 이미지는 찍은 사진을 넘파이 배열로 변환할 때 &lt;strong&gt;반전&lt;/strong&gt;시켜 실제 사과가 가지는 &lt;strong&gt;낮은 값&lt;/strong&gt;을 밝은 색인 &lt;strong&gt;높은 값&lt;/strong&gt;으로 바꾼 것이다. (지금까지의 출력 결과)&lt;/p&gt;

&lt;p&gt;그렇게 되면 컴퓨터가 바탕에 집중하게 되는 것을 막고 높은 값을 가진 사과에 집중하게 된다.
&lt;br /&gt;픽셀값이 높을수록 출력값이 커지는 것에 의미를 부여할 수 있으므로 255에 가까운 값에 집중하게 되는 것이다.&lt;/p&gt;

&lt;p&gt;그러나 &lt;strong&gt;0에 가까울 수록 검게&lt;/strong&gt; 나타나고 &lt;strong&gt;높은 값은 밝게&lt;/strong&gt; 표시가 되므로 보기 안좋다.
&lt;br /&gt;따라서 또 반전시켜주어 배경이 아니라 사과가 흑백인 이미지를 나타내도록 한다. (gray_r 사용)
&lt;br /&gt;이제는 &lt;strong&gt;0에 가까울 수록 밝게&lt;/strong&gt; 나타나고 &lt;strong&gt;높은 값은 검게&lt;/strong&gt; 나타난다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imshow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fruits&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cmap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'gray_r'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;show&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;데이터에 100개씩 들어있는 바나나와 파인애플 이미지도 같은 방식으로 출력해 본다.&lt;/p&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;fig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;subplots&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;axs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imshow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fruits&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cmap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'gray_r'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;axs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imshow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fruits&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cmap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'gray_r'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;show&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;여러 개의 그래프를 나타내기 위해 subplots(1,2)로 행과 열을 지정해주었고,
&lt;br /&gt;axs[0], axs[1] 배열로 각각 파인애플, 바나나 이미지를 담아 출력한다.&lt;/p&gt;

&lt;h3 id=&quot;3-픽셀값-분석하기&quot;&gt;3. 픽셀값 분석하기&lt;/h3&gt;
&lt;hr /&gt;

&lt;p&gt;fruits 데이터를 사과, 파인애플, 바나나로 각각 나누어 보자.
&lt;br /&gt;두 번째 차원과 세 번째 차원{(100, 100)_2차원 배열}을 1차원 배열로 나열해 분리한다.
&lt;br /&gt;100x100으로 &lt;strong&gt;10,000&lt;/strong&gt;으로 만들고 첫 번째 차원인 샘플의 개수를 -1로 지정해 자동으로 남은 차원을 할당하도록 한다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;apple&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fruits&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reshape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;pineapple&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fruits&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reshape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;banana&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fruits&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;300&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reshape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;각 과일 배열의 크기는 (100, 10000)이다.&lt;/p&gt;

&lt;p&gt;픽셀 평균값을 계산하기 위해 mean() 메서드를 사용할 것이다. axis로 평균을 계산할 축을 지정한다.
&lt;br /&gt;&lt;strong&gt;axis=0&lt;/strong&gt;은 &lt;strong&gt;행&lt;/strong&gt;, &lt;strong&gt;axis=1&lt;/strong&gt;은 &lt;strong&gt;열&lt;/strong&gt;을 축으로 한다.
&lt;br /&gt;즉, &lt;strong&gt;(100, 10000)&lt;/strong&gt; 배열에서 axis=0(100_첫 번째 축_행), axis=1(10,000_두 번째 축_열)이 되는 것이다.
&lt;br /&gt;위에서 계산할 때 가로로 10,000을 만들었으니 &lt;strong&gt;axis=1&lt;/strong&gt;을 지정해 평균을 계산한다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;apple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;히스토그램을 그려 평균값의 분포를 확인해 보자.
&lt;br /&gt;alpha 값을 조정해 투명도를 줄여 겹쳐 그려보고, 알기 쉽게 legend() 함수를 사용해 어떤 과일인지 표시한다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;apple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pineapple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;banana&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;legend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'apple'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'pineapple'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'banana'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;show&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;픽셀값으로만 구분하기 쉽지 않으므로 샘플의 평균값이 아닌 픽셀별 평균값을 비교해 본다.&lt;/p&gt;

&lt;p&gt;axis=0(100_첫 번째 축_행)을 사용해 전체 샘플에 대한 10,000개의 픽셀별 평균값을 구해본다.
&lt;br /&gt;사과, 파인애플, 바나나에 대한 막대그래프이다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;fig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;subplots&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;figsize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;axs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;apple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;axs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pineapple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;axs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;banana&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;show&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;이제 픽셀을 평균 낸 이미지를 모든 사진을 합쳐 놓은 대표 이미지로 생각할 수 있다.
&lt;br /&gt;픽셀 위치에 따라 값의 크기가 차이나므로 세 과일을 구분할 수 있다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;apple_mean&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;apple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reshape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;pineapple_mean&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pineapple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reshape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;banana_mean&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;banana&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reshape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;fig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;subplots&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;figsize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;axs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imshow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;apple_mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cmap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'gray_r'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;axs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imshow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pineapple_mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cmap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'gray_r'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;axs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imshow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;banana_mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cmap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'gray_r'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;show&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;4-평균값과-가까운-사진-고르기&quot;&gt;4. 평균값과 가까운 사진 고르기&lt;/h3&gt;
&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;사과 사진의 평균값(apple_mean)&lt;/strong&gt;과 가장 가까운 사진을 고르기 위해, 넘파이 abs() 함수를 이용한 절대값으로 평균을 계산한다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;abs_diff&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fruits&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;apple_mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# abs_diff 배열 : (300, 100, 100)
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;abs_mean&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;abs_diff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 각 샘플에 대한 평균 구하기 
&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;abs_mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;                     &lt;span class=&quot;c1&quot;&gt;# abs_mean : 1차원 배열 (300, )
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;apple_mean과 오차가 가장 작은 샘플 100개를 고르기 위해서 
&lt;br /&gt;np.argsort() 함수로 작은 것에서 큰 순서대로 나열하여 처음 100개를 선택하고 10x10 격자로 그래프를 그려본다.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;apple_index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;argsort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;abs_mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;            
&lt;span class=&quot;n&quot;&gt;fig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;subplots&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;figsize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# 100개의 서브 그래프
&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;                                &lt;span class=&quot;c1&quot;&gt;# 이중 for문으로 10개의 행과 열 이미지 출력
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;axs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imshow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fruits&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;apple_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cmap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'gray_r'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;axs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'off'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;                       &lt;span class=&quot;c1&quot;&gt;# 좌표축 제외 
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;show&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;모두 사과가 나왔으므로 세 과일을 구분할 수 있게 되었다.
&lt;br /&gt;비슷한 샘플끼리 그룹으로 모으는 작업을 &lt;strong&gt;군집&lt;/strong&gt;이라 하고 이는 대표적인 비지도 학습 작업 중 하나이다.
&lt;br /&gt;군집 알고리즘에서 만든 그룹을 &lt;strong&gt;클러스터&lt;/strong&gt;라고 부른다.&lt;/p&gt;</content><author><name>Hyeonsu</name></author><category term="Machine Learning" /><category term="비지도 학습" /><category term="히스토그램" /><category term="군집" /><summary type="html">본 포스팅 한빛미디어의 &amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;를 요약 정리했습니다.</summary></entry><entry><title type="html">[ML Study]ch05-3 트리의 앙상블</title><link href="/machine%20learning/2023/08/01/mlstudy-ch05-3.html" rel="alternate" type="text/html" title="[ML Study]ch05-3 트리의 앙상블" /><published>2023-08-01T00:03:00+00:00</published><updated>2023-08-01T00:03:00+00:00</updated><id>/machine%20learning/2023/08/01/mlstudy-ch05-3</id><content type="html" xml:base="/machine%20learning/2023/08/01/mlstudy-ch05-3.html">&lt;body&gt;
    &lt;img src=&quot;/assets/images/post/book_banner.jpg&quot; align=&quot;right&quot; width=&quot;20%&quot; height=&quot;27.2%&quot; /&gt;
    &lt;br /&gt;&lt;br /&gt;
    &lt;p&gt;본 포스팅 한빛미디어의 &lt;a href=&quot;https://product.kyobobook.co.kr/detail/S000001810330&quot;&gt;&amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;&lt;/a&gt;를 요약 정리했습니다.&lt;/p&gt;
&lt;/body&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id=&quot;1-정형-데이터와-비정형-데이터&quot;&gt;1. 정형 데이터와 비정형 데이터&lt;/h3&gt;
&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;정형 데이터&lt;/strong&gt;는 어떤 구조로 되어있다는 뜻이며, CSV나 데이터베이스, 엑셀 등에 저장하기 쉽다.
&lt;br /&gt;&lt;strong&gt;비정형 데이터&lt;/strong&gt;는 텍스트 데이터, 디지털 카메라로 찍은 사진 등 데이터베이스나 엑셀로 표현하기 어려운 것들이다.
&lt;br /&gt;
정형 데이터를 다루는데 가장 뛰어난 성과를 내는 알고리즘은 &lt;strong&gt;앙상블 학습(ensemble learning)&lt;/strong&gt;이다.&lt;/p&gt;

&lt;h3 id=&quot;2-랜덤-포레스트&quot;&gt;2. 랜덤 포레스트&lt;/h3&gt;
&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;랜덤 포레스트(Random Forest)&lt;/strong&gt;는 대표적인 앙상블 학습이다.
&lt;br /&gt;결정 트리를 랜덤하게 만들어 결정 트리(나무)의 숲을 만든다.
&lt;br /&gt;각 결정 트리의 예측을 사용해 최종 예측을 만든다.&lt;/p&gt;

&lt;p&gt;각 트리를 훈련하기 위한 데이터를 랜덤하게 만드는데,
&lt;br /&gt;우리가 입력한 훈련 데이터에서 랜덤하게 샘플을 추출하여 훈련 데이터를 만든다.
&lt;br /&gt;한 샘플이 중복되어 추출이 가능하다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;부트스트랩 샘플(bootstrap sample)&lt;/strong&gt;은 중복된 샘플을 뽑을 수 있는 것으로,
&lt;br /&gt;부트스트랩 샘플을 훈련 세트의 크기와 같게 만든다.
&lt;br /&gt;1000개의 샘플 가방에서 중복하여 1000개의 샘플을 뽑는다.&lt;/p&gt;

&lt;p&gt;분류 모델인 RandomForestClassifier는 기본적으로 전체 특성 개수의 제곱근만큼의 특성을 선택한다.
&lt;br /&gt;회귀 모델인 RandomForestRegressor는 전체 특성을 사용한다.&lt;/p&gt;

&lt;p&gt;랜덤 포레스트는 랜덤하게 선택한 샘플과 특성을 사용하기 때문에 훈련 세트에 과대적합되는 것을 막아준다.
&lt;br /&gt;결정 트리의 앙상블이기 때문에 DecisionTreeClassifier가 제공하는 중요한 매개변수를 모두 제공한다.
&lt;br /&gt;또한 &lt;strong&gt;특성 중요도&lt;/strong&gt;는 각 결정 트리의 특성 중요도를 취합한 것이다.
&lt;br /&gt;특성의 일부를 랜덤하게 선택하여 결정 트리를 훈련하기 때문에 하나의 특성에 과도하게 집중하지 않고 좀 더 많은 특성이 훈련에 기여할 기회를 얻는다.&lt;/p&gt;

&lt;p&gt;부트스트랩 샘플에 포함되지 않고 남는 샘플을 OOB 샘플이라고 하는데,
&lt;br /&gt;이것을 이용해 부트스트랩 샘플로 훈련한 결정 트리를 평가할 수 있다.&lt;/p&gt;

&lt;h3 id=&quot;3-엑스트라-트리&quot;&gt;3. 엑스트라 트리&lt;/h3&gt;
&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;엑스트라 트리(Extra Trees)&lt;/strong&gt;는 랜덤 포레스트와 매우 비슷하게 동작한다.
&lt;br /&gt;랜덤 포레스트와의 차이점은 부트스트랩 샘플을 사용하지 않는다는 점이 있다.
&lt;br /&gt; 각 결정 트리를 만들 때 전체 훈련 세트를 사용하고,대신 노드를 분할할 때 무작위로 분할한다.
&lt;br /&gt; 성능이 낮아지겠지만 많은 트리를 앙상블하기 때문에 검증 세트의 점수를 높이는 효과를 가진다.&lt;/p&gt;

&lt;p&gt;ExtraTreesClassifier로 교차 검증 점수를 확인하면 랜덤 포레스트와 비슷한 결과를 보여준다.
&lt;br /&gt;랜덤하게 노드를 분할하기 때문에 빠른 계산 속도가 장점이다.
&lt;br /&gt;엑스트라 트리의 회귀 버전은 ExtraTreesRegressor 클래스이다.&lt;/p&gt;

&lt;h3 id=&quot;4-그레이디언트-부스팅&quot;&gt;4. 그레이디언트 부스팅&lt;/h3&gt;
&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;그레이디언트 부스팅(gradient boosting)&lt;/strong&gt;은 깊이가 얕은 결정 트리를 사용하여 이전 트리의 오차를 보완하는 방식으로 앙상블 하는 방법이다.
&lt;br /&gt;GradientBoostingClassifier는 기본적으로 깊이가 3인 결정 트리를 100개 사용한다.
&lt;br /&gt;경사 하강법을 사용해 트리를 앙상블에 추가한다.
&lt;br /&gt;분류에서는 로지스틱 손실 함수를 사용하고 회귀에서는 평균 제곱 오차 함수를 사용한다.&lt;/p&gt;

&lt;p&gt;그레이디언트 부스팅은 결정 트리를 계속 추가하면서 가장 낮은 곳을 찾아 이동한다.
&lt;br /&gt;깊이가 얕은 트리를 사용하는 것도 그 이유이다.
&lt;br /&gt;또한 학습률 매개변수로 속도를 조절한다.&lt;/p&gt;

&lt;p&gt;GradientBoostingClassifier 사용해 교차 검증 점수를 확인하면 거의 과대적합이 되지 않는다.
&lt;br /&gt;결정 트리 개수를 늘려도 과대적합을 잘 억제하고 랜덤 포레스트보다 일반적으로 조금 더 높은 성능을 보인다. 
&lt;br /&gt;하지만 훈련 속도가 느리다는 단점이 있다.&lt;/p&gt;

&lt;h3 id=&quot;5-히스토그램-기반-그레이디언트-부스팅&quot;&gt;5. 히스토그램 기반 그레이디언트 부스팅&lt;/h3&gt;
&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;히스토그램 기반 그레이디언트 부스팅(Histogram-based Gradient Boosting)&lt;/strong&gt;은 입력 특서을 256개 구간으로 나누어 노드를 분할할 때 최적의 분할을 매우 빠르게 찾을 수 있다,
&lt;br /&gt;입력에 누락된 특성이 있더라도 이를 따로 전처리할 필요가 없게 256개의 구간 중에서 하나를 떼어 놓고 누락된 값을 위해서 사용한다.&lt;/p&gt;

&lt;p&gt;과대적합을 잘 억제하면서 그레이디언트 부스트보다 조금 더 높은 성능을 제공한다.
&lt;br /&gt;HistGradientBoostingClassifier 테스트 세트에서의 성능을 확인해보면 약 87% 정확도를 얻었다.
&lt;br /&gt;앙상블 모델은 단일 결정 트리보다 좋은 결과를 얻을 수 있다.&lt;/p&gt;

&lt;p&gt;사이킷런 말고 그레이언트 부스팅 알고리즘을 구현할 라이브러리가 있는데,
&lt;br /&gt;XGBoost라고 코랩에서 사용할 수 있다.
&lt;br /&gt;또 다른 히스토그램 기반 그레이디언트 부스팅 라이브러리는 LightGBM이 있다.&lt;/p&gt;</content><author><name>Hyeonsu</name></author><category term="Machine Learning" /><category term="앙상블 학습" /><category term="랜덤 포레스트" /><category term="엑스트라 트리" /><category term="그레이디언트 부스팅" /><summary type="html">본 포스팅 한빛미디어의 &amp;lt;혼자공부하는 머신러닝+딥러닝(박해선 저)&amp;gt;를 요약 정리했습니다.</summary></entry></feed>