<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>code_by_hot_pack.log</title>
        <link>https://velog.io/</link>
        <description>코딩은 핫팩빨</description>
        <lastBuildDate>Tue, 11 Apr 2023 07:27:29 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>code_by_hot_pack.log</title>
            <url>https://velog.velcdn.com/images/code_by_hot_pack/profile/8fde537e-c9e7-4e16-b09d-39377ebfcf02/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. code_by_hot_pack.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/code_by_hot_pack" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[0411_학습]]></title>
            <link>https://velog.io/@code_by_hot_pack/0411%ED%95%99%EC%8A%B5</link>
            <guid>https://velog.io/@code_by_hot_pack/0411%ED%95%99%EC%8A%B5</guid>
            <pubDate>Tue, 11 Apr 2023 07:27:29 GMT</pubDate>
            <description><![CDATA[<h2 id="시계열-데이터">시계열 데이터</h2>
<ul>
<li>시간별로 구성된 값 집합으로 <strong>추세 또는 예측 모델링</strong>을 위해 분석가능
ex) 센서 데이터, 설비 진동 데이터 등</li>
</ul>
<h2 id="비시계열-데이터tabular-data-non-time-series-data">비시계열 데이터(Tabular data, non-time series data)</h2>
<ul>
<li>쉽게 테이블 형태의 데이터가 비시계열 데이터(행과 열로 구성됨)</li>
<li>Tabular data는 산업현장에서 쉽게 볼 수 있는 데이터의 형태</li>
</ul>
<p>ex) 머신러닝 계열 모델이 주로 활용하는 데이터의 형태</p>
<h2 id="scaler">Scaler</h2>
<h3 id="min-max">min-Max</h3>
<ul>
<li>데이터의 값을 0~1 사이로 변화</li>
<li>변수가 정규분포가 아니거나 표준편차가 작을 때 사용</li>
<li>단, 이상치가 존재하지 않아야 함<h3 id="standard">Standard</h3>
</li>
<li>기존 변수의 범위를 정규 분포화</li>
<li>데이터의 최소/최대값을 모를 때 사용</li>
<li>단, 이상치가 존재하지 않아야 함<h3 id="log">Log</h3>
</li>
<li>X축의 변화량에 따른 y축의 변화량을 고려하여 왜도, 첨도를 감소</li>
<li>target에 log를 취했을 때 성능이 좋아지는 경우가 많다<h3 id="robust">Robust</h3>
</li>
<li>Median과 IQR(사분위수)를 사용하여 정규화</li>
<li>최소/최대값이 정해져 있어 이상치에 영향이 적다<h3 id="normalize">Normalize</h3>
</li>
<li>각 변수의 값을 원점으로부터 1만큼 떨어져 있는 범위 내로 환산</li>
<li>다른 스케일러를 사용하기 전 평탄화작업으로 사용</li>
</ul>
<h2 id="시계열-데이터-전처리">시계열 데이터 전처리</h2>
<h3 id="interpolate">Interpolate</h3>
<p>결측치를 앞뒤 값의 평균으로 대체</p>
<h3 id="feature-engineering---변동성-변수-생성">Feature Engineering - 변동성 변수 생성</h3>
<p>각 변수 혹은 여러변수의 변동성을 파악할 수 있는 변수를 생성하는 방법</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[결정트리(Decision Tree) 요약]]></title>
            <link>https://velog.io/@code_by_hot_pack/%EA%B2%B0%EC%A0%95%ED%8A%B8%EB%A6%ACDecision-Tree-%EC%9A%94%EC%95%BD</link>
            <guid>https://velog.io/@code_by_hot_pack/%EA%B2%B0%EC%A0%95%ED%8A%B8%EB%A6%ACDecision-Tree-%EC%9A%94%EC%95%BD</guid>
            <pubDate>Mon, 27 Feb 2023 06:37:15 GMT</pubDate>
            <description><![CDATA[<h1 id="결정트리-간단하게-특징만-딱">결정트리, 간단하게 특징만 딱</h1>
<h2 id="0-학습-참고자료">0. 학습 참고자료</h2>
<p>파이썬 머신러닝 완벽가이드 <a href="https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EC%99%84%EB%B2%BD%EA%B0%80%EC%9D%B4%EB%93%9C/dashboard">강의링크</a></p>
<h2 id="1-결정트리는-무엇인가">1. 결정트리는 무엇인가</h2>
<p>데이터에 있는 규칙을 학습을 통해 찾아내고 이를 Tree 기반의 분류 규칙을 만드는 것</p>
<p><img src="https://velog.velcdn.com/images/code_by_hot_pack/post/37a50628-66fa-4bc7-9846-ca8b619b2b7e/image.png" alt=""> <a href="https://tensorflow.blog/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D/2-3-5-%EA%B2%B0%EC%A0%95-%ED%8A%B8%EB%A6%AC/">이미지 출처링크</a></p>
<blockquote>
<p>데이터의 어떤 기준을 바탕으로 규칙을 만들어야 가장 효율적인 분류가 될 것인가가 알고리즘의 성능에 크게 영향을 미침</p>
</blockquote>
<h2 id="2-최적의-결정트리를-구성하기-위해서는">2. 최적의 결정트리를 구성하기 위해서는</h2>
<p>가능한 적은 결정기준으로 최대한 많고 <strong>균일한</strong> 데이터 세트를 구성할 수 있도록 분할하는 것이 필요</p>
<p>여기서 균일하다는 뜻은 예를 들면, 1과 2, 3으로 구성된 카드를 3개의 뭉치로 나눴다고 가정했을 때 특정 카드 뭉치에 1만 들어있고 2와 3은 들어있지 않았다고 했을 때 이 카드 뭉치는 &quot;균일하다&quot;라고 할 수 있음</p>
<blockquote>
<p>결정트리는 정보 균일도가 높은 데이터 세트를 먼저 선택할 수 있도록 규칙을 만든다</p>
</blockquote>
<h3 id="21-균일도를-판단하는-기준">2.1 균일도를 판단하는 기준</h3>
<p>정보 이득 지수와 지니 계수를 활용해 기준을 마련한다</p>
<h4 id="211-엔트로피와-정보-이득">2.1.1 엔트로피와 정보 이득</h4>
<p>주어진 데이터의 집합의 혼잡도를 의미하는 엔트로피라는 개념에서 균일하지 않은 데이터의 경우 엔트로피가 높다고 한다. 이 때 정보 이득 지수는 1에서 엔트로피 지수를 뺀 값으로 결정트리는 <strong>이 정보 이득 지수가 높은 속성을 기준으로 규칙을 생성하고 분할한다</strong></p>
<h4 id="212-지니-계수">2.1.2 지니 계수</h4>
<p>이 지수는 0과 1사이의 값으로 구성되고 0으로 갈수록 균일하고 1로 갈수록 균일하지 않다. 위에서 언급한 엔트로피와 비교해보면 엔트로피가 높다는 것은 지니 계수가 높다는 뜻과 의미가 부합한다. 따라서 <strong>결정트리는 지니 계수가 낮은 속성을 기준으로 데이터를 분할한다는 것</strong></p>
<h2 id="3-결정트리의-특징">3. 결정트리의 특징</h2>
<h3 id="31-장점">3.1 장점</h3>
<p>분류하는 알고리즘이 매우 직관적</p>
<h3 id="32-단점">3.2 단점</h3>
<p>과적합 문제에 쉽게 영향을 받음</p>
<h4 id="321-단점을-극복하기-위해서">3.2.1 단점을 극복하기 위해서</h4>
<p>하이퍼 파라미터 튜닝이 중요해진다. 대표적인 파라미터로는 <code>max_features</code> ,<code>max_depth</code> 등이 있다</p>
<h2 id="4-결정트리-학습-알고리즘에-쓰인-주요-파라미터-파악하기">4. 결정트리 학습 알고리즘에 쓰인 주요 파라미터 파악하기</h2>
<p>모델을 생성하고 분류문제를 파악했을때 그 모델이 어떤 feature를 판단의 기준으로 주로 활용했는가를 알고싶으면 <code>feature_importance_</code> 속성을 활용해 알 수 있다</p>
<h2 id="정리">정리</h2>
<p>자주 프로젝트를 활용하지 않다보면 개념이 기억나지 않을 때가 많다. 이렇게 정리해두면 좀 나아지지 않을까</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[한글화] How to Train YOLOv8 Object Detection on a Custom Dataset]]></title>
            <link>https://velog.io/@code_by_hot_pack/%ED%95%9C%EA%B8%80%ED%99%94-How-to-Train-YOLOv8-Object-Detection-on-a-Custom-Dataset</link>
            <guid>https://velog.io/@code_by_hot_pack/%ED%95%9C%EA%B8%80%ED%99%94-How-to-Train-YOLOv8-Object-Detection-on-a-Custom-Dataset</guid>
            <pubDate>Fri, 10 Feb 2023 21:46:44 GMT</pubDate>
            <description><![CDATA[<h1 id="yolo-v8-객체감지모델-학습하기">YOLO v8 객체감지모델 학습하기</h1>
<h2 id="0-학습-참고자료-및-진행방향">0. 학습 참고자료 및 진행방향</h2>
<h3 id="01-학습-참고자료">0.1 학습 참고자료</h3>
<ul>
<li><a href="https://blog.roboflow.com/how-to-train-yolov8-on-a-custom-dataset/">링크</a> : 로보플로우의 YOLO v8 소개 원문<h3 id="02-학습-진행방향">0.2 학습 진행방향</h3>
문서에서 제시하는 방법은 Colab에서 제공한 노트북 파일을 베이스로 한다고 적혀있어 노트북 파일을 활용하고 또 개인적으로 설치한 <code>Pytorch</code> 환경에서 설치가 가능한지, mps를 활용할 때 어떻게 되는지도 볼 계획...</li>
</ul>
<p>이었으나 <a href="https://github.com/ultralytics/ultralytics/issues/246">아직 MPS는 테스트 해보지 않았다는 슬픈 소식을 쉽게 찾을 수 있어서 단념했다</a></p>
<h2 id="1-how-to-install-yolov8">1. How to install YOLOv8</h2>
<blockquote>
<p>pip install ultralytics</p>
</blockquote>
<p>추천하는 설치방식은 pip라고 하니 그대로 따라한다</p>
<h2 id="2-the-new-yolov8-api">2. The New YOLOv8 API</h2>
<p>The developers of YOLOv8 decided to break away from the standard YOLO project design : separate train.py, detect.py, val.py, and export.py scripts. In the short term it will probably cause some confusion while in the long term, it is a fantastic decision!</p>
<p>This pattern has been around since YOLOv3, and every YOLO iteration has replicated it. It was relatively simple to understand but notoriously challenging to deploy especially in real-time processing and tracking scenarios.</p>
<p>The new approach is much more flexible because it allows YOLOv8 to be used independently through the terminal, as well as being part of a complex computer vision application.</p>
<blockquote>
<p>정리하면, 기존의 API 제공방식에서 벗어나 분리된 파일을 통해 제공하는 방법을 선택했고 좋은 성능을 보여줄 것이라고  한다</p>
</blockquote>
<h2 id="3-the-yolov8-cli">3. The YOLOv8 CLI</h2>
<p>YOLOv8 comes with a command line interface that lets you train, validate or infer models on various tasks and versions. The CLI requires no customization or code. You can run all tasks from the terminal. Usage is fairly similar to the scripts we are familiar with. The example below shows how to leverage the CLI to detect objects in a given image.</p>
<blockquote>
<p>CLI로 접근이 가능해 코드를 짤 필요가 없다고 하고 예시 코드를 첨부하였다</p>
</blockquote>
<p>CLI로 접근해보니, 동작은 하는 것 같은데 커멘드라인으로 결과가 나오고 이미지에 적용돼서 나오진 않았다</p>
<p><img src="https://velog.velcdn.com/images/code_by_hot_pack/post/ba36568a-d2cb-408e-b151-684348e7b59b/image.png" alt="학습한결과"></p>
<p>노트북 파일로 제공해준 커멘드라인명령어를 그대로 따라서 가져오니까 성공했다! 아마<code>save=True</code> 옵션이 필요한 듯 싶다</p>
<p><code>yolo task=detect mode=predict model=yolov8n.pt conf=0.25 source=&#39;https://media.roboflow.com/notebooks/examples/dog.jpeg&#39; save=True</code></p>
<p><img src="https://velog.velcdn.com/images/code_by_hot_pack/post/47ea430b-3e8d-43ff-92da-da7a8e636e2d/image.png" alt="옵션을 추가한 학습결과"></p>
<p>테두리가 생기니 편안해진다</p>
<h3 id="31-the-yolov8-python-sdk">3.1 The YOLOv8 Python SDK</h3>
<p>Ultralytics YOLO comes with a pythonic Model and Trainer interface. This finally allows us to use the YOLO model inside a custom Python script in only a few lines of code. Something like this has been impossible until now without doing a repository fork and making your own changes to the code.</p>
<blockquote>
<p>파이썬으로도 돌려볼 수 있다</p>
</blockquote>
<pre><code class="language-python">from ultralytics import YOLO

model = YOLO(&#39;yolov8n.pt&#39;)
model.predict(
   source=&#39;https://media.roboflow.com/notebooks/examples/dog.jpeg&#39;,
   conf=0.25
)</code></pre>
<p>이 방식도 CLI와 마찬가지로 출력 결과로만 분류한 내용을 보여줬고 뒤에 아까처럼 옵션을 추가하면 구분된 사진을 볼 수 있다</p>
<h2 id="4-preparing-a-custom-dataset-for-yolov8">4. Preparing a custom dataset for YOLOv8</h2>
<p>Building a custom dataset can be a painful process. It might take dozens or even hundreds of hours to collect images, label them, and export them in the proper format. Fortunately, Roboflow makes this process straightforward. Let me show you how!</p>
<blockquote>
<p>roboflow를 안 쓰면 데이터 수집과 라벨링 과정이 지옥이라고 한다.. 그래서 roboflow를 활용해 지옥에서 꺼내주는 방법을 알려주고자 한다</p>
</blockquote>
<h3 id="41-create-a-project">4.1 Create a project</h3>
<p>Before you start, you need to create a Roboflow account. Once you do that, you can create a new project in the Roboflow dashboard. Keep in mind to choose the right project type. In this case choose, &quot;Object Detection&quot;.</p>
<blockquote>
<p>먼저 가입하고 따라해라</p>
</blockquote>
<h3 id="42-upload-your-images">4.2 Upload your images</h3>
<p>Next, add data to your newly created project. You can do it via API or through our web interface. If you don’t have a dataset, you can grab one from Roboflow Universe or use the <em><strong>football-players-detection</strong></em> dataset which we will be showing later in this tutorial.</p>
<blockquote>
<p>나는 데이터셋이 없으니 Roboflow Universe에 있는 football-players-detection을 활용하겠다</p>
</blockquote>
<blockquote>
<p>원문에서 보면 football-players-detection을 클릭할 수 있는데 기존에 원문을 읽던 창을 복사해 새로 열고 클릭해보자</p>
</blockquote>
<h3 id="421-get-football-players-detection-images">4.2.1 Get football-players-detection images</h3>
<p>해당 내용은 원문에서 소개하고 있지 않아서 추가했다</p>
<p><img src="https://velog.velcdn.com/images/code_by_hot_pack/post/b9e5966c-511d-4eca-8a09-7b79d730c024/image.png" alt="1단계 클릭하기"> 
링크를 클릭했으면 위와 같은 사이트가 등장한다. 왼쪽에 있는 <code>Images</code>를 클릭</p>
<p><img src="https://velog.velcdn.com/images/code_by_hot_pack/post/20e841c6-c645-4fd3-8ccf-d96868ba8390/image.png" alt="2단계 보기개수 늘리기"></p>
<p>사진을 볼 수 있는 개수를 200개로 늘리고 진행했다. 다른 블로그를 참고해보니 전이학습을 베이스로 하는 딥러닝의 경우 100개의 데이터만으로도 성능이 꽤 나온다고하니 취향에 맞게 볼 수 있는 사진의 갯수를 정해보자</p>
<p>다른 방법으로 선택할 수 있는 사진의 개수를 늘리는 것이 있는지 모르겠지만 일단 이렇게 진행했다</p>
<p><img src="https://velog.velcdn.com/images/code_by_hot_pack/post/d2252565-61fe-4579-a33d-491ced288285/image.png" alt="3단계 select all and clone200"></p>
<p>그 다음 모든 사진을 구분없이 선택하고 선택한 사진의 개수만큼 복사하기를 클릭</p>
<p><img src="https://velog.velcdn.com/images/code_by_hot_pack/post/6d43a826-a0a2-4f41-9214-86d6545d92b4/image.png" alt="4단계 아래로 내려와서 클릭">
아래로 내려오면 앞 단계에서 생성했던 프로젝트를 선택할 수 있다</p>
<p><img src="https://velog.velcdn.com/images/code_by_hot_pack/post/d3a02d82-2c3b-4862-9cd1-d6e677365cab/image.png" alt="5단계 클릭클릭"></p>
<p>나는 소개하고 있는 블로그를 그대로 따라해서 해볼 생각이기 때문에 원본 이미지로 가져왔다</p>
<h3 id="43-label-your-images">4.3 Label your images</h3>
<p>If you only have images, you can label them in Roboflow Annotate. When starting from scratch, consider annotating large batches of images via API or use the model-assisted labeling tool to speed things up.</p>
<blockquote>
<p>혹시 이미지만 있다면? Annotate를 활용해서 레이블링을 하세요! 로보플로우의 도움을 구하면 빠르게 처리할 수도 있답니다</p>
</blockquote>
<blockquote>
<p>라고 쓰여있긴하나, 가져온 이미지를 테스트로 레이블링해보니 하나도 구분하지 못했다.. 즉, 200장의 사진을 직접 하니씩 테두리를 만들어야 한다..!</p>
</blockquote>
<p>혼자서 하기엔 너무 가혹하여 annotate된 이미지를 가져오기로 했다</p>
<h3 id="44-generate-a-new-version-of-your-dataset">4.4 Generate a new version of your dataset</h3>
<p>Now that we have our images and annotations added, we can Generate a Dataset Version. When Generating a Version, you may elect to add preprocessing and augmentations. This step is entirely optional, however, it can allow you to improve the robustness of your model significantly.</p>
<blockquote>
<p>주석을 달아준 이미지데이터세트의 버전을 만들어 전처리 등의 기능을 향상시킬 수 있다. 이는 모델의 견고함을 살려주는 작업이다(선택적인 요소라는 말)</p>
</blockquote>
<h3 id="45-export-your-dataset">4.5 Export your dataset</h3>
<p>Once the dataset version is generated, we have a hosted dataset we can load directly into our notebook for easy training.</p>
<p>One way to download a dataset from Roboflow Universe is to use our pip package. You can generate the appropriate code snippet directly in our UI. On a dataset’s Universe home page, click the Download this Dataset button and select YOLO v5 PyTorch export format.</p>
<p>After a few seconds, you will see a code similar to the one below, except with all the necessary parameters filled in. You can copy and paste it into your Jupyter Notebook or a similar environment. When you execute it, the dataset will be downloaded to your machine in the appropriate format. Magic!</p>
<blockquote>
<p>버전을 생성했으면 export 기능을 찾을 수 있고 YOLOv5 Pytorch 형태로 내보내기를 고르자. 그러면 커멘드가 나오고 이를 따라하고 있는 개발환경에 적용시켜보면 마법이 일어난다</p>
</blockquote>
<pre><code class="language-python">!pip install roboflow

from roboflow import Roboflow
rf = Roboflow(api_key=&quot;공유금지라 가림&quot;)
project = rf.workspace(&quot;amitis-yolo&quot;).project(&quot;football-players-detection-o7ym6&quot;)
dataset = project.version(1).download(&quot;yolov5&quot;)</code></pre>
<p>export하면 위와 같은 코드가 출력되고 가끔 오류가 있으니 코드에 빈 공간이 없는지 확인해야한다</p>
<h3 id="46-train-yolov8-on-a-custom-dataset">4.6 Train YOLOv8 on a custom dataset</h3>
<p><code>yolo task=detect mode=train model=yolov8s.pt data={dataset.location}/data.yaml epochs=100 imgsz=640</code></p>
<p>커멘드를 실행해 가져온 데이터로 학습을 진행한다</p>
<p>이 구간부터 내가 돌려본 환경에서 돌아가지 않아 제공한 노트북 파일에서 내꺼에 맞춰 돌려본다</p>
<p><img src="https://velog.velcdn.com/images/code_by_hot_pack/post/7f8f1809-db2b-47ed-8596-ac769156a51b/image.png" alt="코랩"></p>
<p><img src="https://velog.velcdn.com/images/code_by_hot_pack/post/0e9acba7-e281-4d81-9fb1-b7de766b0ae2/image.png" alt="코랩2"></p>
<p><img src="https://velog.velcdn.com/images/code_by_hot_pack/post/32a69c3e-29e3-4355-919b-67cac4493910/image.png" alt="코랩3"></p>
<p>200장으로 따라해본 학습은 이렇게 나왔다</p>
<p><img src="https://velog.velcdn.com/images/code_by_hot_pack/post/0b05bff6-b576-4031-842e-b053037f2ae3/image.png" alt="코랩4"></p>
<p>이런 식으로 학습하고 구분한다는 느낌을 가져가면 좋을 것 같다</p>
<h3 id="47-validate-with-a-new-model">4.7 Validate with a new model</h3>
<p>When the training is over, it is good practice to validate the new model on images it has not seen before. Therefore, when creating a dataset, we divide it into three parts, and one of them that we will use now as a test dataset.</p>
<blockquote>
<p>머신러닝할 때 학습용,평가용,테스트용으로 분류하는 것처럼 이미지 파일도 그렇게 분류해뒀으니 새로운 모델을 평가해보자</p>
</blockquote>
<h2 id="5-export-and-upload-weights">5. Export and Upload Weights</h2>
<p>이 부분은 원문에서 짤로 설명하는 것이 더 적절하다고 보여서 생략</p>
<h2 id="6-conclusion">6. Conclusion</h2>
<p>성능이 향상된 YOLOv8 많은 이용 부탁드린다</p>
<h2 id="한글화를-진행하면서-느낀점">한글화를 진행하면서 느낀점</h2>
<p>느낌으로 알겠다는 것과 직접 해보고 알겠다는 것에는 많은 차이가 있다</p>
<p>직접 해봐야 아는 것이 많아지고 어떤 부분을 모르는지 잘 파악할 수 있다</p>
<p>조만간 또 다른 블로그를 한글화로 해봐야 겠다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[도커로 머신러닝 모델 배포]]></title>
            <link>https://velog.io/@code_by_hot_pack/%EB%8F%84%EC%BB%A4%EB%A1%9C-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%AA%A8%EB%8D%B8-%EB%B0%B0%ED%8F%AC</link>
            <guid>https://velog.io/@code_by_hot_pack/%EB%8F%84%EC%BB%A4%EB%A1%9C-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%AA%A8%EB%8D%B8-%EB%B0%B0%ED%8F%AC</guid>
            <pubDate>Sat, 04 Feb 2023 22:18:01 GMT</pubDate>
            <description><![CDATA[<h1 id="도커와-fastapi를-활용해서-언어감지-모델을-배포해보자">도커와 FastAPI를 활용해서 언어감지 모델을 배포해보자</h1>
<h2 id="0-학습-참고자료">0. 학습 참고자료</h2>
<ul>
<li><a href="https://www.youtube.com/watch?v=h5wLuVDr0oc&amp;t=188">Deploy ML models with FastAPI, Docker, and Heroku</a></li>
</ul>
<h2 id="1-프로젝트-주제">1. 프로젝트 주제</h2>
<p>언어감지 데이터 셋을 kaggle에서 구해서 외국어 텍스트를 인식하고 어느 나라 언어인지 감지하는 모델을 웹에 배포하기</p>
<h2 id="2-elt--model-design">2. (E)LT &amp; Model Design</h2>
<h3 id="2-1-elt">2-1. (E)LT</h3>
<p>Kaggle에 있는 <a href="https://www.kaggle.com/datasets/basilb2s/language-detection">데이터</a>를 활용해서 데이터를 저장</p>
<ul>
<li>학습한 데이터는 배포에는 활용하지 않는다<h3 id="2-2-model-design">2-2. Model Design</h3>
모델학습에 쓰인 메인 과정만 소개하고 넘어감 이후 깃헙에 올린 데이터 참고
<a href="https://github.com/amitis94/heroku">링크</a><pre><code class="language-python">from sklearn.pipeline import Pipeline
</code></pre>
</li>
</ul>
<p>pipe = Pipeline([(&#39;vectorizer&#39;, cv), (&#39;multinomialNB&#39;, model)])
pipe.fit(X_train, y_train)</p>
<h1 id="웹에-올리기-위한-모델-찌부시키기">웹에 올리기 위한 모델 찌부시키기</h1>
<p>with open(&#39;trained_pipeline-0.1.0.pkl&#39;, &#39;wb&#39;) as f:
    pickle.dump(pipe, f)</p>
<pre><code>## 3. Dockerfile 만들기
도커 이미지를 빌드해서 FastAPI로 쓰기 위해서 공식문서에서 따라 쓰라고 만든 코드 복붙하고 app폴더 접근경로만 추가해주기
```Dockerfile
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9

COPY ./requirements.txt /app/requirements.txt

RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt

COPY ./app /app/app</code></pre><h3 id="참고-requirementstxt">참고. requirements.txt</h3>
<p>도커 컨테이너에도 모델이 동작할 수 있는 환경을 마련해주기 위해서 파일이 동작했던 환경을 얼려서 가져오기
<code>pip freeze &gt; requirements.txt</code></p>
<h2 id="4-app-빌드하기">4. app 빌드하기</h2>
<pre><code class="language-python">from fastapi import FastAPI
from pydantic import BaseModel
from app.model.model import predict_pipeline
from app.model.model import __version__ as model_verison

app = FastAPI()

class TextIn(BaseModel):
    text: str

class PredictionOut(BaseModel):
    language: str

@app.get(&#39;/&#39;)
def home():
    return {&quot;health_check&quot;: &quot;OK&quot;, &quot;model_version&quot;: model_verison}

@app.post(&quot;/predict&quot;, response_model=PredictionOut)
def predict(payload: TextIn):
    language = predict_pipeline(payload.text)
    return {&quot;언어는? &quot;: language}</code></pre>
<p>pydantic은 데이터 유효성 검사에 쓰이는 라이브러리라고 한다
짜둔 코드로 비교해보니 TextIn으로 받는 text는 문자형태만 인식하도록 규칙을 정하고 그렇지 않으면 오류를 보내는 기능으로 이해했다</p>
<h2 id="5-헤로쿠의-유료화로-배포-느낌만-느껴보기">5. 헤로쿠의 유료화..로 배포 느낌만 느껴보기</h2>
<p>Heroku가 작년 11월 말부터 무료로 쓸 수 없게 됐다..</p>
<p>일단 지금까지 설계한 파일을 도커 이미지로 빌드하고 돌려보면 80:80으로 연결한 로컬 주소에서 돌아가는 모델을 볼 수 있다</p>
<p>도커 컨테이너를 쓰기 위한 커멘드만 짚고 넘어가면 좋을 것 같아서 가져옴
<code>heroku git:remote {설계한 모델 이름}</code>
<code>heroku stack:set container</code> &lt;&lt; 이 부분이 도커 컨테이너로 돌린다는 명령어</p>
<h2 id="느낀점">느낀점</h2>
<p>배포까지 성공하고 올리고 싶었는데 헤로쿠가 역적으로 돌아선줄 몰랐다 도커도 마냥 벽처럼 느껴졌다가 계속 만지고 영상보면서 친해지다보니 엄청 어려워 보였던게 그냥 어려워 보인다</p>
<p>다음 토이 프로젝트는 2시간짜리 영상으로 머신러닝 모델을 배포해보려고 한다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[공분산과 (피어슨)상관계수]]></title>
            <link>https://velog.io/@code_by_hot_pack/%EA%B3%B5%EB%B6%84%EC%82%B0%EA%B3%BC-%ED%94%BC%EC%96%B4%EC%8A%A8%EC%83%81%EA%B4%80%EA%B3%84%EC%88%98</link>
            <guid>https://velog.io/@code_by_hot_pack/%EA%B3%B5%EB%B6%84%EC%82%B0%EA%B3%BC-%ED%94%BC%EC%96%B4%EC%8A%A8%EC%83%81%EA%B4%80%EA%B3%84%EC%88%98</guid>
            <pubDate>Fri, 03 Feb 2023 16:36:26 GMT</pubDate>
            <description><![CDATA[<h1 id="공분산과-상관계수를-알아보자">공분산과 상관계수를 알아보자</h1>
<h2 id="0-학습-참고자료">0. 학습 참고자료</h2>
<ul>
<li><p>파이썬으로 배우는 통계학 교과서</p>
<h2 id="1-공분산의-정의">1. 공분산의 정의</h2>
<p>2개의 연속형 변수의 관계성을 확인하는 통계량을 <strong>공분산</strong>이라고 하고 특징은 다음과 같다.</p>
</li>
<li><p>공분산이 0보다 클 때: 하나의 변수가 큰 값을 갖게 되면 나머지 변수도 커진다</p>
</li>
<li><p>공분산이 0보다 작을 때: 하나의 변수가 큰 값을 갖게 되면 나머지 변수는 작아진다</p>
</li>
<li><p>공분산이 0일 때: 두 변수 사이에 관계성이 없다</p>
</li>
</ul>
<h2 id="2-공분산-계산하기">2. 공분산 계산하기</h2>
<p><strong>분산은 편차를 제곱한 값의 평균!</strong></p>
<pre><code class="language-python"># 이론 구현
def Cov(x, y):
    N = len(x) # 두 변수의 길이는 같을 수밖에 없으니까
               # 과소 추정을 방지하기 위해서 N-1로 return을 계산할 수도 있음
    mean_x = np.mean(x) # scipy 등 어떤 라이브러리를 쓰는지에 따라 바꿔야함
    mean_y = np.mean(y)

    return sum((x - mean_x) * (y - mean_y))

# scipy를 활용한 구현
import scipy as sp

sp.cov(x, y, ddof=0) # 위에서 len(N)의 경우에 해당
sp.cov(x, y, ddof=1) # 위에서 len(N-1)의 경우에 해당</code></pre>
<h2 id="3-피어슨-상관계수란">3. 피어슨 상관계수란?</h2>
<p>공분산이 최대값 1에서 최소값 -1사이가 되도록 표준화하는 것</p>
<ul>
<li>공분산 값을 x와 y의 분산의 곱에 제곱근을 씌워 나눠준다</li>
<li>일반적으로 그냥 상관계수로 부를 때 피어슨 상관계수를 뜻한다<h2 id="4-상관계수와-상관행렬-구하기">4. 상관계수와 상관행렬 구하기</h2>
<pre><code class="language-python">import scipy as sp
sp.corrcoef(x, y) # 주대각선이 1, 반 대각선이 상관계수인 행렬이 등장</code></pre>
</li>
</ul>
<h2 id="5-상관계수가-무의미할-때-확인해봐야-하는-작업">5. 상관계수가 무의미할 때 확인해봐야 하는 작업</h2>
<p>상관계수가 0인 관계를 갖는 변수들이라고 단순하게 값만 보고 판단하면 안된다</p>
<p><strong>그래프를 그려서 어떤 형태를 띄고 있길래 0인지 확인해야 한다</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[그리디 알고리즘이 속이 그렇게 그리디]]></title>
            <link>https://velog.io/@code_by_hot_pack/%EA%B7%B8%EB%A6%AC%EB%94%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%B4-%EC%86%8D%EC%9D%B4-%EA%B7%B8%EB%A0%87%EA%B2%8C-%EA%B7%B8%EB%A6%AC%EB%94%94</link>
            <guid>https://velog.io/@code_by_hot_pack/%EA%B7%B8%EB%A6%AC%EB%94%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%B4-%EC%86%8D%EC%9D%B4-%EA%B7%B8%EB%A0%87%EA%B2%8C-%EA%B7%B8%EB%A6%AC%EB%94%94</guid>
            <pubDate>Fri, 03 Feb 2023 14:29:05 GMT</pubDate>
            <description><![CDATA[<h1 id="그리디-알고리즘으로-생각하기">그리디 알고리즘으로 생각하기</h1>
<h2 id="0-학습-참고자료">0. 학습 참고자료</h2>
<ul>
<li>알고리즘 코딩테스트(파이썬) 문제33</li>
<li>백준 1715번(골드4)<h2 id="1-그리디-알고리즘식-생각의-방향">1. 그리디 알고리즘식 생각의 방향</h2>
현재 상황에서 최선의 선택을 한다. 이후 과정에서는 앞에 했던 선택이 최선의 선택이 아니었음을 깨닫더라도<h2 id="2-우선순위-큐가-그리디랑-잘-맞는-이유">2. 우선순위 큐가 그리디랑 잘 맞는 이유</h2>
아직 많은 문제를 풀어본 것은 아니라서 100% 장담은 못하겠다
하지만, 1715번 문제처럼 합치고 넣고 다시 합치고 하는 과정에서는 일반적인 리스트 구조로 문제를 푸는 것보다 효율적이라고 생각한다</li>
</ul>
<p>이 문제를 구간합 방법으로 구현해봤는데 역시나 시간오류에서 걸렸던 경험적인 근거로 설득할 수 있다</p>
<h2 id="3-코드로-문제-풀어보기">3. 코드로 문제 풀어보기</h2>
<pre><code class="language-python">import sys
input = sys.stdin.readline # 여기는 입력이 다중으로 들어로 때 빠르게 처리할 수 있는 라이브러리

from queue import PriorityQueue
myque = PriorityQueue() # 우선순위 큐를 호출하는 방법

N = int(input()) # 카드 묶음 개수

for _ in range(N):
    data = int(input())
    myque.put(data) # 이게 우선순위 큐 형태로 데이터를 넣어준다
                    # 반복인자를 생략해도 되는 점 또한 일반 리스트보다 나은 점인듯

data1 = 0 # 큐에 쌓인 데이터를 뽑으면 사라지니까 객체로 임시 저장
data2 = 0
count = 0 # 정답으로 출력할 객체

while myque.qsize() &gt; 1:
    data1 = myque.get() # get으로 가져오면 큐에는 데이터가 없음
    data2 = myque.get()
    print(&quot;data1 : &quot;, data1) # 여기 출력문은 내가 생각한 대로 진행되는지 파악하기 위한 부분, 문제 제출시에는 지워야함
    print(&quot;data2 : &quot;, data2)
    temp = data1 + data2 # 앞에 계산한 큐에 쌓인 2개의 값을 합침

    print(&quot;temp :&quot;, temp) # 이 부분도 지워야 함
    count += temp
    myque.put(temp) # 다시 넣어서 비교하는 횟수를 카운트 하기 위해서

print(count) # 답 출력</code></pre>
<h2 id="부록-우선순위큐-명령어">부록. 우선순위큐 명령어</h2>
<p><code>.get()</code> : 큐에 있는 데이터를 가져옴
<code>.put(넣어줄 값)</code> : 큐에 데이터를 넣음
<code>.qsize()</code> : 큐의 크기를 가져옴
<code>.empty()</code> : 큐가 비어있는지 확인</p>
<p>자료구조상 <code>while문</code> 하고 잘 맞는 부분이 많이보임</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[미니배치 구현해보기]]></title>
            <link>https://velog.io/@code_by_hot_pack/%EB%AF%B8%EB%8B%88%EB%B0%B0%EC%B9%98-%EA%B5%AC%ED%98%84%ED%95%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@code_by_hot_pack/%EB%AF%B8%EB%8B%88%EB%B0%B0%EC%B9%98-%EA%B5%AC%ED%98%84%ED%95%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Tue, 31 Jan 2023 19:51:28 GMT</pubDate>
            <description><![CDATA[<h1 id="클론코딩으로-미니배치-구현해보기">클론코딩으로 미니배치 구현해보기</h1>
<h2 id="0-학습-참고자료">0. 학습 참고자료</h2>
<ul>
<li>밑바닥부터 배우는 딥러닝1 (4.5.2)<h2 id="1-미니배치-학습이란">1. 미니배치 학습이란?</h2>
훈련 데이터 중 일부를 무작위로 꺼내어(꺼낸 것들이 하나의 묶음임. 그래서 미니배치) 꺼낸 미니배치에 대해서 경사법으로 매개변수를 갱신하는 것<h2 id="2-코드로-구현해보기">2. 코드로 구현해보기</h2>
<pre><code class="language-python">import numpy as np
# from keras.datasets import mnist
from dataset.mnist import load_mnist # 같은 폴더 안에 dataset이 존재해야 한다!
from two_layer_net import TwoLayerNet
</code></pre>
</li>
</ul>
<p>(X_train, y_train), (X_test, y_test) = load_mnist(normalize=True, one_hot_label=True)</p>
<p>train_loss_list = []</p>
<h1 id="하이퍼파라미터">하이퍼파라미터</h1>
<p>iters_num = 10000 # 반복 횟수
train_size = X_train.shape[0]
batch_size = 100 # 미니배치 크기
learning_rate = 0.1</p>
<p>network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)</p>
<p>for i in range(iters_num):
    # 미니배치 획득
    batch_mask = np.random.choice(train_size, batch_size)
    X_batch = X_train[batch_mask]
    y_batch = y_train[batch_mask]</p>
<pre><code># 기울기 계산
# grad = network.numerical_gradient(X_batch, y_batch)
grad = network.gradient(X_batch, y_batch) # 성능 개선판

# 매개변수 갱신
for key in (&#39;W1&#39;, &#39;b1&#39;, &#39;W2&#39;, &#39;b2&#39;):
    network.params[key] -= learning_rate * grad[key]

# 학습 경과 기록
loss = network.loss(X_batch, y_batch)
train_loss_list.append(loss)</code></pre><p>```</p>
<h2 id="3-학습결과">3. 학습결과</h2>
<p><strong>학습 횟수가 늘어가면서 손실 함수의 값이 줄어든다</strong></p>
<ul>
<li>학습이 잘 되고 있다는 뜻</li>
<li>신경망의 가중치 매개변수가 서서히 데이터에 적응한다는 뜻</li>
<li><strong>반복해서 학습함으로써 최적 가중치 매개변수에 가까워지고 있다</strong></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Gradient Descent(경사 하강법) 1부]]></title>
            <link>https://velog.io/@code_by_hot_pack/Gradient-Descent%EA%B2%BD%EC%82%AC-%ED%95%98%EA%B0%95%EB%B2%95-1%EB%B6%80</link>
            <guid>https://velog.io/@code_by_hot_pack/Gradient-Descent%EA%B2%BD%EC%82%AC-%ED%95%98%EA%B0%95%EB%B2%95-1%EB%B6%80</guid>
            <pubDate>Fri, 27 Jan 2023 18:30:09 GMT</pubDate>
            <description><![CDATA[<h1 id="경사-하강법과-친해지기">경사 하강법과 친해지기</h1>
<h2 id="0-학습-참고자료">0. 학습 참고자료</h2>
<ul>
<li>밑바닥부터 시작하는 딥러닝 1편 </li>
<li>Deep Learning Fundamental</li>
<li>Hands-on Machine Learning<h2 id="1-gd">1. GD</h2>
<img src="https://velog.velcdn.com/images/code_by_hot_pack/post/ccf99dab-c86c-4f99-aa48-4b0667399d36/image.png" alt="">
핸즈온 머신러닝에서 설명하는 내용이 와닿았는데 산에서 길을 잃었을 때 안전하게 하산하기 위해서 우리는 <strong>경사가 낮아지는 방향으로 나아가는 것처럼</strong> 딥러닝에서도 마찬가지로 예측값을 평가하는 손실함수의 값이 작아지는 방향으로 학습을 <strong>반복하여</strong> 개선하는 방법을 경사 하강법이라고 한다</li>
<li>반복한다는 부분을 의식해서 보는 것이 이후의 딥러닝 학습과정을 이해하는데 도움이 된다</li>
<li>손실함수는 비용함수로도 불리지만 책마다 표현이 조금씩 다르다<h2 id="2-경사법-표현식에서-편미분">2. 경사법 표현식에서 편미분</h2>
<img src="https://velog.velcdn.com/images/code_by_hot_pack/post/80e0e208-567f-4801-942f-2c8a5ffd3946/image.png" alt=""></li>
<li>밑바닥 딥러닝에서 설명하는 내용을 가져와보면 사실은 &quot;경사법&quot;이 더 맞는 표현이다. 하지만 일반적으로 &quot;경사 하강법&quot;으로 불릴 때가 더 많아서 경사 하강법으로 부른다</li>
<li>중요한 것은 <strong>실제값과 예측값의 차이를 줄여나가는 것</strong><h2 id="3-learning-rate학습률">3. Learning rate(학습률)</h2>
보통 <strong>에타(𝜂)로 표현</strong>하고 한 번의 학습으로 얼마만큼 학습해야 하는지 즉, 매개변수 값을 얼마나 갱신하느냐를 정해준다</li>
<li>일반적으로 0.01이나 0.001 등으로 정해진 값을 쓴다</li>
<li>학습률이 너무 크거나 작으면 학습이 제대로 이뤄지지 않는다</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[M1에서 배우는 파이토치 1편]]></title>
            <link>https://velog.io/@code_by_hot_pack/M1%EC%97%90%EC%84%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%ED%8C%8C%EC%9D%B4%ED%86%A0%EC%B9%98-1%ED%8E%B8</link>
            <guid>https://velog.io/@code_by_hot_pack/M1%EC%97%90%EC%84%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%ED%8C%8C%EC%9D%B4%ED%86%A0%EC%B9%98-1%ED%8E%B8</guid>
            <pubDate>Thu, 26 Jan 2023 21:11:06 GMT</pubDate>
            <description><![CDATA[<h1 id="pytorch와-친해지기">Pytorch와 친해지기</h1>
<h2 id="0-참고한-강의-영상">0. 참고한 강의 영상</h2>
<p><a href="https://www.youtube.com/watch?v=Adi0Iasehj8&amp;t=6130">메타코드 딥러닝 6시간완성 1편</a></p>
<p>이론 파트는 다 수강한 상태!</p>
<h2 id="1-macbook-air-m1에서-pytorch-mps윈도우에서-쓰이는-cuda-설치">1. Macbook Air M1에서 Pytorch MPS(윈도우에서 쓰이는 cuda) 설치</h2>
<ol>
<li><p>딥러닝을 공부할 개발환경에서 아래의 커멘드를 입력
<code>conda install -c pytorch pytorch</code></p>
</li>
<li><p>Python 환경에서 아래의 커멘드를 입력 후 True를 확인하기</p>
</li>
</ol>
<pre><code class="language-python">import torch

device = torch.device(&#39;mps:0&#39; if torch.backends.mps.is_available() else &#39;cpu&#39;)

print (f&quot;PyTorch version:{torch.__version__}&quot;) # 1.12.1 이상
print(f&quot;MPS 장치를 지원하도록 build 되었는지: {torch.backends.mps.is_built()}&quot;) # True 여야 합니다.
print(f&quot;MPS 장치가 사용 가능한지: {torch.backends.mps.is_available()}&quot;) # True 여야 합니다.

!python -c &#39;import platform;print(platform.platform())&#39;</code></pre>
<p>필자의 경우 아래와 같이 출력</p>
<blockquote>
<p>PyTorch version:1.12.1
MPS 장치를 지원하도록 build 되었는지: True
MPS 장치가 사용 가능한지: True
macOS-13.0-arm64-arm-64bit</p>
</blockquote>
<p>설치가 잘 됐는지는 이후 학습과정을 통해서 확인할 수 있어서 패스~</p>
<h2 id="2-클론코딩">2. 클론코딩</h2>
<h3 id="2-1-tensor와-list-비슷하지만-다르다">2-1. tensor와 list 비슷하지만 다르다</h3>
<pre><code class="language-python">ls1 = [1,2]
ls2 = [3,4]

tor1 = torch.tensor([1,2])
tor2 = torch.tensor([3,4])

print(ls1 + ls2)
print(tor1 + tor2)
print(tor1 * tor2)</code></pre>
<blockquote>
<p>[1, 2, 3, 4]
tensor([4, 6])
tensor([3, 8])</p>
</blockquote>
<p>리스트 형태의 값의 연산과 텐서 형태의 값의 연산은 다른 형태로 진행된다</p>
<h3 id="2-2-처음-마주한-matmul-함수">2-2. 처음 마주한 matmul 함수</h3>
<pre><code class="language-python">print(sum(tor1 + tor2))

print(tor1.dot(tor2))
print(torch.dot(tor1, tor2))

print(torch.matmul(tor1, tor2)) 
print(torch.matmul(tor1.view(1,-1), tor2)[0]) </code></pre>
<p> <code>matmul</code> 은 shape을 맞추고 행렬 곱을 계산하기 위한 함수</p>
<p> <code>view</code>는 <code>matmul</code>을 하기 위해 맞춰주는 함수. 최근에는 업글되서 위에 처럼 진행한다고 함.</p>
<p><strong>행렬 곱은 스칼라 곱과 다르다는 점만 안다면 이해가 쉽다</strong></p>
<h3 id="2-3-torchwhere">2-3. torch.where</h3>
<pre><code class="language-python">data = torch.randn(4,3)
print(data)
print(torch.where(data&gt;0, torch.ones(data.shape), torch.zeros(data.shape)))</code></pre>
<p>data &gt; 0이라는 조건을 넣어줬을 때 텐서의 각 원소마다 그 값이 참이면 텐서의 원소 위치에 torch.ones를 반환하고 그렇지 않으면 data의 그 위치에 torch.zeros를 보여주는 함수</p>
<blockquote>
<p>tensor([[-1.2605,  1.2107, -0.7283],
        [-1.6908,  0.4007, -2.2820],
        [-1.7402,  0.5828, -0.9733],
        [-0.4130, -0.4026,  0.2520]])
tensor([[0., 1., 0.],
        [0., 1., 0.],
        [0., 1., 0.],
        [0., 0., 1.]])</p>
</blockquote>
<h3 id="2-4-numpy와-호환이-가능하다">2-4. numpy와 호환이 가능하다</h3>
<p><code>numpy</code> 를 배우다보면 딥러닝에서 자주 쓰인다고 했는데 직접 써보니 <code>torch</code> 와 호환성이 좋아보임</p>
<pre><code class="language-python">a = torch.ones(5)
print(a)

b = a.numpy()
print(b)

a = torch.from_numpy(b)
print(a)</code></pre>
<p>텐서를 넘파이로, 넘파이를 텐서로 바꾸는 함수가 존재</p>
<h3 id="2-5-gpumps를-써보자">2-5. GPU(mps)를 써보자</h3>
<p>M1 GPU를 쓸 수 있도록 지원해준 mps를 어떻게 쓸까?</p>
<pre><code class="language-python">x = torch.tensor([1,1]).cuda()
print(x)</code></pre>
<p>위 방식대로 M1 로컬환경에서 실행하면 당연히 오류가 뜬다. 우리는 cuda가 동작하지 않아서</p>
<pre><code class="language-python">x = torch.tensor([1,1]).to(&quot;mps&quot;)
print(x)

x = x.cpu()
print(x)</code></pre>
<p>그래서 <code>cuda()</code> 대신에 <code>to(&quot;mps&quot;)</code> 를 사용한다!</p>
<ul>
<li><del>구매한지 1년이 넘어가서야 드디어 GPU를 써본다</del></li>
</ul>
<p><code>cpu()</code> 함수는 GPU 연산이 필요없는 계산에서 활용</p>
<p><strong>여기서 주의해야 할 점은 GPU로 계산한 객체와 CPU로 계산한 객체는 서로 연산이 불가능하다는 점이다.</strong></p>
<pre><code class="language-python">x = torch.tensor([1,1]).to(&quot;mps&quot;)
y = torch.tensor([0.5, 0.1])

print(x + y)</code></pre>
<blockquote>
<p>RuntimeError: Expected all tensors to be on the same device, but found at least two devices, mps:0 and cpu!</p>
</blockquote>
<p>x는 mps로 계산하고 y는 cpu로 계산한 값이기 때문에 서로 연산이 불가능</p>
<h3 id="2-5-computational-graph-오차역전파를-계산하기-위해서는">2-5. Computational Graph (오차역전파를 계산하기 위해서는?)</h3>
<p>이론상으로 노드에서 노드로 이어지는 계산을 수행한 후 예측값을 수정하기 위해 진행하는 오차역전파에서 gradient를 얻기 위해서 <code>torch</code> 에서는 설정해줘야 하는 것이 있다</p>
<pre><code class="language-python">a = torch.tensor([2.], requires_grad=True)
b = torch.tensor([1.], requires_grad=True)</code></pre>
<p>함수에서 볼 수 있는 <code>requires_grad</code> 를 True로 설정해야 한다는 것</p>
<pre><code class="language-python">a = torch.tensor([2.], requires_grad=True)
b = torch.tensor([1.], requires_grad=True)

c = a + b
d = b + 1
e = c * d

c.retain_grad() # gradient를 계산할 수 있는 자격(?)을 주고
d.retain_grad()
e.retain_grad()

e.backward(retain_graph=True) # gradient를 계산하면

print(a.grad) 
print(b.grad)
print(c.grad)
print(d.grad)
print(e.grad) # grad를 구할 수 있다</code></pre>
<p><code>retain_grad()</code> 가 없이 c, d, e 값을 확인해보면 grad를 적용할 수 없는 None값이 출력될 것</p>
<p>따라서, <code>retain_grad()</code> 를 부여하고 역전파를 실행하여 grdient를 계산하면 grad를 얻을 수 있다.</p>
<p>** 여기서 주의해야 할 점은 역전파를 계속 수행하게 되면 grad값이 너무 커지는 현상이 발생하여 좋은 학습에 방해가 된다! 따라서 grad 값을 0으로 초기화하는 작업이 필요**</p>
<pre><code class="language-python">a.grad.zero_()</code></pre>
<p>항상 <code>backward()</code> 가 끝나면 넣어주도록 하자</p>
<p>이제 grad가 필요없어진 상황에선 아래와 같이 변수에 grad 성질을 제거한다</p>
<pre><code class="language-python">a.requires_grad = False
a = a.detach()</code></pre>
<p>2가지 방법 중 아무거나 활용해도 된다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[안녕 docker 전편]]></title>
            <link>https://velog.io/@code_by_hot_pack/%EC%95%88%EB%85%95-docker-%EC%A0%84%ED%8E%B8</link>
            <guid>https://velog.io/@code_by_hot_pack/%EC%95%88%EB%85%95-docker-%EC%A0%84%ED%8E%B8</guid>
            <pubDate>Thu, 26 Jan 2023 21:09:21 GMT</pubDate>
            <description><![CDATA[<h1 id="docker를-이해해보자">Docker를 이해해보자</h1>
<h2 id="0-학습-참고자료">0. 학습 참고자료</h2>
<ul>
<li>도커 교과서<h2 id="1-도커-교과서를-통해-친해지기">1. 도커 교과서를 통해 친해지기</h2>
<h3 id="도커-컨테이너로-간단한-이미지-실행해보기">도커 컨테이너로 간단한 이미지 실행해보기</h3>
<pre><code>docker container run diamol/ch02-hello-diamol</code></pre></li>
<li>컨테이너를 실행시키는 명령어</li>
<li><code>run</code> 뒤에 언급된 이미지가 없다면 이미지를 내려받는 과정인 <strong>pull</strong> 단계를 거치고 난 후 이미지를 실행(by 컨테이너)
<img src="https://velog.velcdn.com/images/coing_by_hotpack/post/72ae2d5f-9072-4484-9417-3b873e7799ed/image.png" alt=""></li>
</ul>
<h3 id="컨테이너가-무엇인가">컨테이너가 무엇인가??</h3>
<ul>
<li>격리와 밀집의 관계를 동시에 만족시키는 방법<ul>
<li>격리: <strong>외부와 독립된 환경</strong>을 요구하는 것</li>
<li>밀집: <strong>컴퓨터 CPU와 메모리가 허용하는 최대</strong>한의 어플리케이션을 실행하는 것</li>
</ul>
</li>
</ul>
<h2 id="2-원격-컴퓨터처럼-컨테이너-활용하기">2. 원격 컴퓨터처럼 컨테이너 활용하기</h2>
<pre><code>docker container run --interactive --tty diamol/base</code></pre><ul>
<li><code>--interactive</code> 는 플래그로 컨테이너에 접속한 상태가 된다는 뜻</li>
<li><code>--tty</code> 는 플래그로 터미널 세션을 통해 컨테이너를 조작한다는 뜻</li>
<li><strong>diamol/base라는 이미지에서 상호작용을 하겠다는 의미</strong></li>
<li>빠져나올 땐 <code>quit</code> 을 입력
<img src="https://velog.velcdn.com/images/coing_by_hotpack/post/9b477d08-8be8-4c0f-a739-cffde4372b85/image.png" alt=""></li>
</ul>
<pre><code>docker container logs [컨테이너ID]</code></pre><ul>
<li>책에서는 대괄호([]) 이후의 명령어가 없으면 대상 컨테이너에서 수집된 로그를 모두 출력한다고 했지만 M1 환경에선 명령어가 오류만 보여준다<pre><code>docker container inspect [컨테이너ID]</code></pre></li>
<li>컨테이너 상태에 대한 정보를 <strong>JSON</strong> 포맷으로 제공<h2 id="3-웹-사이트를-컨테이너로-호스팅해보기">3. 웹 사이트를 컨테이너로 호스팅해보기</h2>
<pre><code>docker container run -d --publish 8088:80 diamol/ch02-hello-diamol-web</code></pre></li>
<li><code>-d(--derach)</code> 는 명령어를 실행하면 백그라운드에서 계속 동작하도록 하는 플래그</li>
<li><code>--publish</code> 는 컨테이너의 포트를 호스트 컴퓨터에 공개한다는 뜻의 플래그</li>
<li>내 컴퓨터의 8088번 포트를 도커 컨테이너의 80번 포트와 연결</li>
<li>도커 컨테이너가 동작하고 있음을 알고 싶으면 <a href="http://localhost:8088/">여기를 눌러 확인해보기</a> (단, 글에 적힌 주소와 다르면 연결이 안됨)</li>
<li><code>docker container stats</code> 명령어를 통해 동작시킨 컨테이너가 얼마만큼의 리소스를 잡아먹고 있는지 확인할 수 있다
<img src="https://velog.velcdn.com/images/coing_by_hotpack/post/d5f4757f-24e7-45ab-883f-455f7679783e/image.png" alt=""></li>
</ul>
]]></description>
        </item>
    </channel>
</rss>