<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>JH'S AI Insight</title>
    <link>https://hj-vlog.tistory.com/</link>
    <description>컴퓨터 비전, 스마트 팩토리, 로보틱스, 딥러닝을 활용한 공정 최적화, 품질 검사, 예측 유지보수 등의 최신 논문과 코드를 공유합니다.
</description>
    <language>ko</language>
    <pubDate>Sat, 20 Jun 2026 20:07:08 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>AI_JH</managingEditor>
    <item>
      <title>[Python] 자료구조</title>
      <link>https://hj-vlog.tistory.com/9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;/p&gt;
&lt;h1&gt;자료구조(Data Structure)란?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자료구조는 데이터를 저장하고 관리하는 구조적 방법을 의미합니다. 이를 통해 효율적인 데이터 처리 및 연산 수행이 가능합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 선형 자료구조 (Linear Data Structure)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.1 배열 (Array)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열은 같은 타입의 데이터를 연속된 메모리 공간에 저장하는 구조입니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Index    0   1   2   3   4
Data     10  20  30  40  50&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 특징:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;탐색: O(1) - 인덱스를 통해 빠르게 접근 가능&lt;/li&gt;
&lt;li&gt;삽입/삭제: O(n) - 중간 데이터를 추가/삭제할 때 뒤 데이터를 이동해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.2 연결 리스트 (Linked List)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결 리스트는 노드(Node)와 포인터(링크)로 연결된 자료구조입니다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;[HEAD] &amp;rarr; [10 | O] &amp;rarr; [20 | O] &amp;rarr; [30 | NULL]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결 리스트의 특징:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;탐색: O(n) - 처음부터 하나씩 탐색해야 함&lt;/li&gt;
&lt;li&gt;삽입/삭제: O(1) - 특정 위치에서 쉽게 추가/삭제 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.3 스택 (Stack)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택은 후입선출(LIFO, Last In First Out) 구조를 가지는 자료구조입니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;[TOP] &amp;rarr; 30 &amp;rarr; 20 &amp;rarr; 10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택의 연산:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;push: 데이터를 맨 위에 추가&lt;/li&gt;
&lt;li&gt;pop: 맨 위 데이터 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.4 큐 (Queue)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큐는 선입선출(FIFO, First In First Out) 구조를 가지는 자료구조입니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;[Front] 10 &amp;rarr; 20 &amp;rarr; 30 [Rear]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큐의 연산:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;enqueue: 뒤에서 추가&lt;/li&gt;
&lt;li&gt;dequeue: 앞에서 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 비선형 자료구조 (Non-Linear Data Structure)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1 트리 (Tree)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트리는 계층 구조를 가지는 자료구조입니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;       (10)
      /    \
    (5)    (15)
   /  \    /  \
 (2)  (7) (12) (20)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이진 탐색 트리 (BST)의 특징:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;왼쪽 자식 노드 &amp;lt; 부모 &amp;lt; 오른쪽 자식 노드&lt;/li&gt;
&lt;li&gt;탐색 속도: O(log n)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2 그래프 (Graph)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래프는 노드(Vertex)와 간선(Edge)으로 이루어진 자료구조입니다.&lt;/p&gt;
&lt;pre class=&quot;gherkin&quot;&gt;&lt;code&gt;A - B - C
|    |
D - E&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래프 탐색 알고리즘:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DFS (깊이 우선 탐색)&lt;/li&gt;
&lt;li&gt;BFS (너비 우선 탐색)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자료구조 선택 기준&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;자료구조&lt;/th&gt;
&lt;th&gt;삽입&lt;/th&gt;
&lt;th&gt;삭제&lt;/th&gt;
&lt;th&gt;탐색&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;배열(Array)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;연결 리스트(Linked List)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;스택(Stack)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;큐(Queue)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;트리(Tree)&lt;/td&gt;
&lt;td&gt;O(log n)&lt;/td&gt;
&lt;td&gt;O(log n)&lt;/td&gt;
&lt;td&gt;O(log n)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>[Python] Code</category>
      <author>AI_JH</author>
      <guid isPermaLink="true">https://hj-vlog.tistory.com/9</guid>
      <comments>https://hj-vlog.tistory.com/9#entry9comment</comments>
      <pubDate>Mon, 10 Feb 2025 15:39:03 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Numpy 소개</title>
      <link>https://hj-vlog.tistory.com/6</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;/p&gt;
&lt;h1&gt;NumPy 개요 및 사용법&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. NumPy란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NumPy(Numerical Python)는 &lt;b&gt;Python&lt;/b&gt;에서 수학적 연산과 다차원 배열 연산을 수행하는 대표적인 라이브러리입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빠르고 효율적인 다차원 배열(ndarray) 연산&lt;/li&gt;
&lt;li&gt;C 기반 구현으로 높은 성능 제공&lt;/li&gt;
&lt;li&gt;벡터화 연산을 통해 반복문 최소화&lt;/li&gt;
&lt;li&gt;선형 대수, 난수 생성, 푸리에 변환 등 다양한 기능 포함&lt;/li&gt;
&lt;li&gt;Pandas, SciPy, PyTorch 등의 여러 라이브러리의 기반 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. NumPy 배열(NDArray)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NumPy의 핵심 데이터 구조는 &lt;span class=&quot;highlight&quot;&gt;ndarray&lt;/span&gt; (N-dimensional array) 입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(1) 배열 생성&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(arr)
print(type(arr))&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(2) 다차원 배열&lt;/h3&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;arr2d = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2d)
print(arr2d.shape)
print(arr2d.ndim)
print(arr2d.dtype)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. NumPy 주요 기능&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(1) 배열 생성 함수&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;zeros = np.zeros((3, 3))
ones = np.ones((2, 4))
full = np.full((3, 3), 7)
identity = np.eye(4)
print(zeros)
print(ones)
print(full)
print(identity)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(2) 난수 생성&lt;/h3&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;rand_uniform = np.random.rand(3, 3)
rand_normal = np.random.randn(3, 3)
rand_int = np.random.randint(0, 10, (3, 3))
np.random.seed(42)
print(rand_uniform)
print(rand_normal)
print(rand_int)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(3) 배열 연산&lt;/h3&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b)
print(a - b)
print(a * b)
print(a / b)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(4) 행렬 연산&lt;/h3&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
C = np.dot(A, B)
print(C)
print(A.T)
A_inv = np.linalg.inv(A)
det = np.linalg.det(A)
print(A_inv)
print(det)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(5) 배열 인덱싱 및 슬라이싱&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr[0, 1])
print(arr[0, :])
print(arr[:, 0:2])&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(6) 배열 조건 처리&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;arr = np.array([1, 2, 3, 4, 5])
print(arr[arr &amp;gt; 2])
arr[arr &amp;gt; 2] = 10
print(arr)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. NumPy vs Python List 성능 비교&lt;/h2&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;import time
size = 10**6

# Python 리스트 연산 속도 비교
start = time.time()
a_list = list(range(size))
b_list = list(range(size))
c_list = [a + b for a, b in zip(a_list, b_list)]
print(&quot;Python 리스트 연산 시간:&quot;, time.time() - start)

# NumPy 배열 연산 속도 비교
start = time.time()
a_array = np.arange(size)
b_array = np.arange(size)
c_array = a_array + b_array
print(&quot;NumPy 배열 연산 시간:&quot;, time.time() - start)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. NumPy 요약&lt;/h2&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;5&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;설명&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;배열 생성&lt;/td&gt;
&lt;td&gt;np.array(), np.zeros(), np.ones(), np.eye()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;난수 생성&lt;/td&gt;
&lt;td&gt;np.random.rand(), np.random.randint()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;배열 연산&lt;/td&gt;
&lt;td&gt;+, -, *, /, np.dot()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;선형 대수&lt;/td&gt;
&lt;td&gt;np.linalg.inv(), np.linalg.det(), A.T&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;인덱싱&lt;/td&gt;
&lt;td&gt;arr[i, j], arr[:, i], Fancy Indexing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;조건 필터링&lt;/td&gt;
&lt;td&gt;arr[arr &amp;gt; 2]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>[Python] Code</category>
      <author>AI_JH</author>
      <guid isPermaLink="true">https://hj-vlog.tistory.com/6</guid>
      <comments>https://hj-vlog.tistory.com/6#entry6comment</comments>
      <pubDate>Sun, 9 Feb 2025 21:59:16 +0900</pubDate>
    </item>
    <item>
      <title>[Python] PyTorch 소개</title>
      <link>https://hj-vlog.tistory.com/5</link>
      <description>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;PyTorch 소개&lt;/title&gt;
    &lt;style&gt;
        body { font-family: Arial, sans-serif; line-height: 1.6; margin: 20px; }
        h1, h2, h3 { color: #333; }
        pre { background: #f4f4f4; padding: 10px; border-radius: 5px; }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
        th { background: #f4f4f4; }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;1. PyTorch란?&lt;/h1&gt;
    &lt;p&gt;PyTorch는 Facebook AI Research(FAIR)에서 개발한 Python 기반 오픈소스 딥러닝 프레임워크입니다.&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;NumPy와 유사한 텐서 연산 지원&lt;/li&gt;
        &lt;li&gt;GPU 가속(CUDA)로 빠른 연산 가능&lt;/li&gt;
        &lt;li&gt;동적 연산 그래프(Dynamic Computation Graph) 사용&lt;/li&gt;
        &lt;li&gt;사용이 직관적이고 디버깅이 쉬움&lt;/li&gt;
        &lt;li&gt;딥러닝, 자연어 처리(NLP), 컴퓨터 비전(CV) 등에 폭넓게 활용됨&lt;/li&gt;
    &lt;/ul&gt;
    
    &lt;h1&gt;2. PyTorch 주요 개념&lt;/h1&gt;
    &lt;h2&gt;(1) 텐서(Tensor)&lt;/h2&gt;
    &lt;p&gt;PyTorch에서 가장 기본적인 자료형은 Tensor입니다.&lt;/p&gt;
    &lt;pre&gt;
import torch

a = torch.tensor([1, 2, 3])
b = torch.tensor([[1, 2], [3, 4]])
c = torch.randn(2, 3, 4)
print(c.shape)
    &lt;/pre&gt;
    
    &lt;h2&gt;(2) NumPy 변환&lt;/h2&gt;
    &lt;pre&gt;
import numpy as np

t = torch.tensor([1, 2, 3])
n = t.numpy()
print(n, type(n))

n = np.array([4, 5, 6])
t = torch.from_numpy(n)
print(t, type(t))
    &lt;/pre&gt;
    
    &lt;h2&gt;(3) GPU 연산&lt;/h2&gt;
    &lt;pre&gt;
device = 'cuda' if torch.cuda.is_available() else 'cpu'
x = torch.randn(3, 3).to(device)
print(x.device)
    &lt;/pre&gt;
    
    &lt;h2&gt;(4) 텐서 연산&lt;/h2&gt;
    &lt;pre&gt;
x = torch.tensor([1, 2, 3])
y = torch.tensor([4, 5, 6])
print(x + y)
    &lt;/pre&gt;
    
    &lt;h1&gt;3. PyTorch 모델 만들기&lt;/h1&gt;
    &lt;h2&gt;(1) torch.nn을 이용한 모델 정의&lt;/h2&gt;
    &lt;pre&gt;
import torch.nn as nn

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.fc = nn.Linear(10, 1)
    
    def forward(self, x):
        return self.fc(x)

model = MyModel()
print(model)
    &lt;/pre&gt;
    
    &lt;h2&gt;(2) 손실 함수 및 옵티마이저&lt;/h2&gt;
    &lt;pre&gt;
import torch.optim as optim

loss_fn = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
    &lt;/pre&gt;
    
    &lt;h2&gt;(3) 학습 과정&lt;/h2&gt;
    &lt;pre&gt;
for epoch in range(10):
    optimizer.zero_grad()
    x = torch.randn(5, 10)
    y = torch.randn(5, 1)
    pred = model(x)
    loss = loss_fn(pred, y)
    loss.backward()
    optimizer.step()
    print(f&quot;Epoch {epoch+1}, Loss: {loss.item()}&quot;)
    &lt;/pre&gt;
    
    &lt;h1&gt;4. 데이터 로딩 (torch.utils.data)&lt;/h1&gt;
    &lt;pre&gt;
from torch.utils.data import Dataset, DataLoader

class MyDataset(Dataset):
    def __init__(self):
        self.data = torch.randn(100, 10)
        self.labels = torch.randint(0, 2, (100,))
    
    def __len__(self):
        return len(self.data)
    
    def __getitem__(self, idx):
        return self.data[idx], self.labels[idx]

dataset = MyDataset()
dataloader = DataLoader(dataset, batch_size=8, shuffle=True)
    &lt;/pre&gt;
    
    &lt;h1&gt;5. PyTorch 주요 기능 요약&lt;/h1&gt;
    &lt;table&gt;
        &lt;tr&gt;
            &lt;th&gt;기능&lt;/th&gt;
            &lt;th&gt;설명&lt;/th&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;텐서 연산&lt;/td&gt;
            &lt;td&gt;torch.tensor(), +, -, * 등 다양한 연산&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;GPU 연산&lt;/td&gt;
            &lt;td&gt;.to('cuda')를 이용해 GPU에서 연산 가능&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;신경망 정의&lt;/td&gt;
            &lt;td&gt;nn.Module을 상속받아 모델 생성&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;손실 함수&lt;/td&gt;
            &lt;td&gt;nn.MSELoss(), nn.CrossEntropyLoss() 등 다양한 손실 함수&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;옵티마이저&lt;/td&gt;
            &lt;td&gt;optim.SGD(), optim.Adam() 등 최적화 알고리즘&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;역전파 학습&lt;/td&gt;
            &lt;td&gt;zero_grad(), loss.backward(), step() 사용&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;데이터 로딩&lt;/td&gt;
            &lt;td&gt;Dataset, DataLoader를 활용하여 데이터 배치 로딩&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</description>
      <category>[Python] Code</category>
      <author>AI_JH</author>
      <guid isPermaLink="true">https://hj-vlog.tistory.com/5</guid>
      <comments>https://hj-vlog.tistory.com/5#entry5comment</comments>
      <pubDate>Sun, 9 Feb 2025 21:53:50 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Einops</title>
      <link>https://hj-vlog.tistory.com/4</link>
      <description>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;einops 개념 및 사용법&lt;/title&gt;
    &lt;style&gt;
        body { font-family: Arial, sans-serif; line-height: 1.6; margin: 20px; }
        h1, h2, h3 { color: #333; }
        code { background: #f4f4f4; padding: 3px 5px; border-radius: 5px; }
        pre { background: #f4f4f4; padding: 10px; border-radius: 5px; overflow-x: auto; }
        table { width: 100%; border-collapse: collapse; margin: 20px 0; }
        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
        th { background: #f4f4f4; }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;einops 개념 및 사용법&lt;/h1&gt;
    &lt;p&gt;&lt;strong&gt;einops&lt;/strong&gt;는 배열 및 텐서를 직관적으로 변환할 수 있도록 설계된 Python 라이브러리입니다.&lt;/p&gt;
    &lt;p&gt;간결한 문자열 기반 표기법을 통해 reshape, transpose, reduce 등의 연산을 쉽게 수행할 수 있습니다.&lt;/p&gt;
    &lt;p&gt;&lt;strong&gt;지원 프레임워크:&lt;/strong&gt; numpy, torch, tensorflow, jax&lt;/p&gt;

    &lt;h2&gt;1. einops가 필요한 이유&lt;/h2&gt;
    &lt;p&gt;기존의 numpy, torch, tensorflow 등의 텐서 조작(reshape, permute, transpose)은 복잡하고 가독성이 떨어질 수 있습니다.&lt;/p&gt;
    &lt;pre&gt;&lt;code&gt;import torch
x = torch.randn(16, 3, 64, 64)  # (batch, channel, height, width)
x = x.permute(0, 2, 3, 1)  # (batch, height, width, channel)&lt;/code&gt;&lt;/pre&gt;
    &lt;p&gt;einops를 사용하면 다음처럼 간결하게 표현할 수 있습니다.&lt;/p&gt;
    &lt;pre&gt;&lt;code&gt;from einops import rearrange
x = rearrange(x, 'b c h w -&gt; b h w c')&lt;/code&gt;&lt;/pre&gt;

    &lt;h2&gt;2. einops의 주요 기능&lt;/h2&gt;
    &lt;table&gt;
        &lt;tr&gt;&lt;th&gt;기능&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;th&gt;함수&lt;/th&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;재배열 (Rearrange)&lt;/td&gt;&lt;td&gt;텐서의 차원 순서 변경&lt;/td&gt;&lt;td&gt;rearrange&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;축소 (Reduce)&lt;/td&gt;&lt;td&gt;특정 차원을 줄이면서 연산 수행&lt;/td&gt;&lt;td&gt;reduce&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;재조합 (Repeat)&lt;/td&gt;&lt;td&gt;특정 차원을 복제하여 확장&lt;/td&gt;&lt;td&gt;repeat&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;

    &lt;h2&gt;3. 주요 연산 예제&lt;/h2&gt;
    &lt;h3&gt;rearrange: 텐서 변형 (reshape, transpose)&lt;/h3&gt;
    &lt;pre&gt;&lt;code&gt;from einops import rearrange
import numpy as np

x = np.random.random((2, 3, 4))
y = rearrange(x, 'b c h -&gt; b h c')
print(y.shape)  # (2, 4, 3)&lt;/code&gt;&lt;/pre&gt;

    &lt;h3&gt;reduce: 특정 차원 축소&lt;/h3&gt;
    &lt;pre&gt;&lt;code&gt;from einops import reduce
x = np.random.random((2, 3, 4))
y = reduce(x, 'b c h -&gt; b h', 'mean')
print(y.shape)  # (2, 4)&lt;/code&gt;&lt;/pre&gt;

    &lt;h3&gt;repeat: 차원 확장 (broadcasting)&lt;/h3&gt;
    &lt;pre&gt;&lt;code&gt;from einops import repeat
x = np.random.random((2, 3))
y = repeat(x, 'b f -&gt; b f 4')
print(y.shape)  # (2, 3, 4)&lt;/code&gt;&lt;/pre&gt;

    &lt;h2&gt;4. 다양한 예제&lt;/h2&gt;
    &lt;h3&gt;CNN: NCHW ↔ NHWC 변환&lt;/h3&gt;
    &lt;pre&gt;&lt;code&gt;x = np.random.random((16, 3, 64, 64))
y = rearrange(x, 'b c h w -&gt; b h w c')
print(y.shape)  # (16, 64, 64, 3)&lt;/code&gt;&lt;/pre&gt;

    &lt;h3&gt;ViT (Vision Transformer) 패치 분할&lt;/h3&gt;
    &lt;pre&gt;&lt;code&gt;img = np.random.random((1, 3, 256, 256))
patches = rearrange(img, 'b c (h p1) (w p2) -&gt; b (h w) (p1 p2 c)', p1=16, p2=16)
print(patches.shape)  # (1, 256, 768)&lt;/code&gt;&lt;/pre&gt;

    &lt;h3&gt;NLP: Transformer Multi-Head Attention에서 heads 추가&lt;/h3&gt;
    &lt;pre&gt;&lt;code&gt;q = np.random.random((32, 128))
q_heads = rearrange(q, 'b (h d) -&gt; b h d', h=8)
print(q_heads.shape)  # (32, 8, 16)&lt;/code&gt;&lt;/pre&gt;

    &lt;h2&gt;5. einops vs 기존 방법 비교&lt;/h2&gt;
    &lt;table&gt;
        &lt;tr&gt;&lt;th&gt;연산&lt;/th&gt;&lt;th&gt;기존 방법&lt;/th&gt;&lt;th&gt;einops&lt;/th&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Reshape&lt;/td&gt;&lt;td&gt;x.view()&lt;/td&gt;&lt;td&gt;rearrange(x, 'b c h w -&gt; b h w c')&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Transpose&lt;/td&gt;&lt;td&gt;x.permute()&lt;/td&gt;&lt;td&gt;rearrange(x, 'b c h w -&gt; b h w c')&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Reduce (mean)&lt;/td&gt;&lt;td&gt;x.mean(dim=1)&lt;/td&gt;&lt;td&gt;reduce(x, 'b c h -&gt; b h', 'mean')&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;Expand (repeat)&lt;/td&gt;&lt;td&gt;x.repeat()&lt;/td&gt;&lt;td&gt;repeat(x, 'b f -&gt; b f 4')&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;

    &lt;h2&gt;6. einops의 장점&lt;/h2&gt;
    &lt;ul&gt;
        &lt;li&gt;✅ &lt;strong&gt;가독성 증가:&lt;/strong&gt; 직관적인 문자열 표현&lt;/li&gt;
        &lt;li&gt;✅ &lt;strong&gt;프레임워크 독립적:&lt;/strong&gt; numpy, torch, tensorflow, jax 등에서 사용 가능&lt;/li&gt;
        &lt;li&gt;✅ &lt;strong&gt;코드 간결화:&lt;/strong&gt; reshape, permute, transpose 등을 하나의 문법으로 처리&lt;/li&gt;
        &lt;li&gt;✅ &lt;strong&gt;배치 연산 지원:&lt;/strong&gt; 다차원 연산을 쉽게 수행&lt;/li&gt;
    &lt;/ul&gt;

    &lt;h2&gt;7. einops 요약&lt;/h2&gt;
    &lt;table&gt;
        &lt;tr&gt;&lt;th&gt;기능&lt;/th&gt;&lt;th&gt;함수&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;재배열 (Rearrange)&lt;/td&gt;&lt;td&gt;rearrange(x, 'b c h w -&gt; b h w c')&lt;/td&gt;&lt;td&gt;차원 순서 변경&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;축소 (Reduce)&lt;/td&gt;&lt;td&gt;reduce(x, 'b c h -&gt; b h', 'mean')&lt;/td&gt;&lt;td&gt;특정 차원을 평균/합산으로 축소&lt;/td&gt;&lt;/tr&gt;
        &lt;tr&gt;&lt;td&gt;확장 (Repeat)&lt;/td&gt;&lt;td&gt;repeat(x, 'b f -&gt; b f 4')&lt;/td&gt;&lt;td&gt;특정 차원을 반복하여 확장&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</description>
      <category>[Python] Code</category>
      <author>AI_JH</author>
      <guid isPermaLink="true">https://hj-vlog.tistory.com/4</guid>
      <comments>https://hj-vlog.tistory.com/4#entry4comment</comments>
      <pubDate>Sun, 9 Feb 2025 21:46:07 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Einsum</title>
      <link>https://hj-vlog.tistory.com/3</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://polyfill.io/v3/polyfill.min.js?features=es6&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=TeX-MML-AM_CHTML&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;einsum 개념 및 사용법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;numpy.einsum()&lt;/code&gt;은 아인슈타인 합(아인슈타인 표기법)을 이용하여 다차원 배열의 연산을 간결하게 수행할 수 있는 함수입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 기본 개념: 아인슈타인 합 표기법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아인슈타인 합 표기법은 반복되는 인덱스를 축소(합산)하는 방법입니다. 예를 들어, 두 벡터 a, b의 내적(dot product)은 다음과 같이 표현됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ c = \sum_{i} a_{i} b_{i} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 수식을 &lt;code&gt;einsum&lt;/code&gt;으로 표현하면:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;
import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

c = np.einsum('i,i-&amp;gt;', a, b)
print(c)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과: \( 32 \) (벡터 내적 결과)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. einsum의 주요 연산 예제&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(1) 행렬 곱셈&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행렬 곱셈(행렬 A와 B의 곱)도 &lt;code&gt;einsum&lt;/code&gt;으로 쉽게 구현할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ C_{ij} = \sum_{k} A_{ik} B_{kj} $$&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;
A = np.array([[1, 2], [3, 4]])  # (2x2)
B = np.array([[5, 6], [7, 8]])  # (2x2)

C = np.einsum('ik,kj-&amp;gt;ij', A, B)
print(C)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;
[[19 22]
 [43 50]]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 일반적인 행렬 곱셈 &lt;code&gt;np.dot(A, B)&lt;/code&gt; 또는 &lt;code&gt;A @ B&lt;/code&gt;와 동일합니다.&lt;/p&gt;

&lt;h3&gt;(2) 벡터 외적 (Outer Product)&lt;/h3&gt;

&lt;p&gt;외적(outer product)은 다음과 같이 &lt;code&gt;einsum&lt;/code&gt;을 활용할 수 있습니다.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;
A = np.array([1, 2, 3])
B = np.array([4, 5, 6])

outer_product = np.einsum('i,j-&gt;ij', A, B)
print(outer_product)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;출력 결과:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;
[[ 4  5  6]
 [ 8 10 12]
 [12 15 18]]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;'i,j-&gt;ij'&lt;/code&gt;는 \( i \)와 \( j \)를 곱하여 \( (i, j) \) 형태의 2D 배열을 생성.&lt;/p&gt;

&lt;h3&gt;(3) 행렬 전치 (Transpose)&lt;/h3&gt;

&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;
A = np.array([[1, 2, 3], [4, 5, 6]])
A_T = np.einsum('ij-&gt;ji', A)
print(A_T)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;출력 결과:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;
[[1 4]
 [2 5]
 [3 6]]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;이는 &lt;code&gt;np.transpose(A)&lt;/code&gt; 또는 &lt;code&gt;A.T&lt;/code&gt;와 동일합니다.&lt;/p&gt;

&lt;h3&gt;(4) 행렬 대각합 (Trace)&lt;/h3&gt;

&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
trace = np.einsum('ii-&gt;', A)
print(trace)  # 1 + 5 + 9 = 15
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;출력 결과:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;
15
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;이는 &lt;code&gt;np.trace(A)&lt;/code&gt;와 동일한 결과입니다.&lt;/p&gt;

&lt;h3&gt;(5) 배치 행렬 곱셈 (Batch Matrix Multiplication)&lt;/h3&gt;

&lt;p&gt;3차원 이상의 행렬 곱셈도 &lt;code&gt;einsum&lt;/code&gt;을 사용하면 쉽게 구현할 수 있습니다.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;
A = np.random.rand(10, 3, 4)  # 배치 크기 10, 3x4 행렬
B = np.random.rand(10, 4, 5)  # 배치 크기 10, 4x5 행렬

C = np.einsum('ijk,ikl-&gt;ijl', A, B)
print(C.shape)  # (10, 3, 5)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;위 코드는 &lt;code&gt;np.matmul(A, B)&lt;/code&gt; 또는 &lt;code&gt;A @ B&lt;/code&gt;와 동일한 역할을 합니다.&lt;/p&gt;

&lt;h2&gt;3. einsum의 장점&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;가독성:&lt;/strong&gt; &lt;code&gt;einsum&lt;/code&gt;은 긴 루프 없이 수식을 직관적으로 표현할 수 있음.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;성능 최적화:&lt;/strong&gt; &lt;code&gt;einsum&lt;/code&gt;은 &lt;code&gt;numpy&lt;/code&gt; 내부에서 최적화되어 빠르게 동작하고, 불필요한 메모리 할당을 줄일 수 있음.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;다양한 연산 지원:&lt;/strong&gt; 내적, 외적, 전치, 대각합, 배치 연산 등 여러 수학적 연산을 하나의 함수로 수행 가능.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;4. einsum 사용 팁&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;numpy.einsum_path()&lt;/code&gt;를 사용하면 연산 최적화 경로를 확인할 수 있음.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;
optimal_path = np.einsum_path('ik,kj-&gt;ij', A, B, optimize=True)
print(optimal_path)
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;최적화된 einsum 실행:&lt;/h3&gt;

&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;
C = np.einsum('ik,kj-&gt;ij', A, B, optimize=True)
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;결론&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;einsum&lt;/code&gt;은 행렬 연산을 효율적으로 수행하는 강력한 도구.&lt;/li&gt;
  &lt;li&gt;내적, 외적, 전치, 대각합 등 다양한 연산을 하나의 함수로 표현 가능.&lt;/li&gt;
  &lt;li&gt;코드 가독성을 높이고 최적화할 때 유용.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;다양한 차원의 배열 연산을 직관적이고 효율적으로 구현하려면 &lt;code&gt;einsum&lt;/code&gt;을 적극 활용하는 것이 좋습니다!  &lt;/p&gt;</description>
      <category>[Python] Code</category>
      <author>AI_JH</author>
      <guid isPermaLink="true">https://hj-vlog.tistory.com/3</guid>
      <comments>https://hj-vlog.tistory.com/3#entry3comment</comments>
      <pubDate>Sun, 9 Feb 2025 21:16:46 +0900</pubDate>
    </item>
  </channel>
</rss>