1. CNN
CNN(Convolutional Neural Network, 합성곱 신경망)은 주로 이미지나 비정형 데이터의 패턴을 학습하고 분석하는 데 사용되는 딥러닝 모델입니다. CNN은 이미지의 공간적 구조를 효율적으로 처리하기 위해 합성곱 계층(convolutional layer)을 사용하며, 이 계층은 필터(커널)를 통해 입력 데이터에서 중요한 특징(에지, 모양 등)을 추출합니다. 이어서 풀링 계층(pooling layer)을 통해 차원을 축소하고 계산 효율을 높이며, 마지막으로 완전 연결 계층(fully connected layer)을 사용해 특정 클래스나 값을 예측합니다. CNN은 이미지 분류, 객체 탐지, 영상 처리 등 다양한 분야에서 높은 성능을 발휘하며, 이미지의 공간적 관계를 보존하면서 학습할 수 있다는 점에서 강점을 가집니다.

[메모]
특징 추출 부분이 이미지를 이해하기 위한 레이어 즉 합성곱 신경망이다 딥러닝이랑 다른게 아니라 앞에 컨벌루셔널 계층이 붙어있는거라고 보면 된다 여기서 특징을 추출한 후에 기존 딥러닝 과정을 거친다. 따라서 가장 중요한것은 컨벌루션을 통해서 2차원행렬을 그대로 받는다 즉 좌표의 이미를 가지기 때문에 이미지를 더 이해하기 좋게 된다.
분류 부분은 풀리컨넥티드 레이어라고 부름
레이어끼리 완전히 다 행렬곱을 다 하기때문에 완전 연결체라고도 한다.
영상처리에서 CNN을 사용하는 이유
영상처리에서 CNN을 사용하는 이유는 이미지를 분석하는 데 더 적합한 구조를 가지고 있기 때문입니다. CNN은 작은 필터를 사용해 이미지에서 중요한 특징(예: 선, 모양 등)을 효율적으로 추출하며, 이를 반복적으로 사용해 학습해야 할 양을 줄입니다. 또한, 이미지가 조금 이동하거나 변형되어도 특징을 잘 인식할 수 있고, 간단한 요소에서 복잡한 패턴까지 단계적으로 분석할 수 있어 DNN보다 더 적합합니다. DNN은 모든 픽셀을 개별적으로 학습하려 하기 때문에 계산이 복잡하고 이미지의 공간적 구조를 잘 반영하지 못합니다.
2. 입력 이미지
컴퓨터가 이미지를 인식하는 과정은 이미지를 숫자로 표현하는 것에서 시작됩니다. 이미지는 픽셀 값(흑백 이미지는 밝기를 0~255 사이 숫자로, 컬러 이미지는 RGB 채널 값으로)을 가진 행렬로 변환되며, 이 숫자 데이터를 기반으로 컴퓨터가 계산을 수행합니다.

(64*64)*3
12288
3. 합성곱 계층
합성곱 계층(Convolution Layer)는 CNN(Convolutional Neural Network)의 핵심 구성 요소로, 이미지에서 중요한 특징을 추출하는 역할을 합니다. 이 계층은 작은 크기의 필터(커널)를 사용해 입력 데이터(이미지)의 일부분과 합성곱 연산을 수행하며, 필터는 특정 패턴(예: 가장자리, 텍스처 등)을 감지하도록 학습됩니다. 필터는 이미지를 스캔하며 각 위치에서 특징 맵(feature map)을 생성하는데, 이는 이미지의 중요한 정보를 강조한 새로운 데이터 표현입니다. Convolution Layer는 이미지의 공간적 구조를 보존하면서 효율적으로 특징을 추출하고, 이를 다음 계층으로 전달해 점점 더 복잡한 패턴을 학습할 수 있게 합니다.
3-1. 합성곱 연산
합성곱 연산(Convolution Operation)은 합성곱 계층에서 입력 데이터(예: 이미지)와 필터(커널)를 사용해 특징을 추출하는 기본 과정입니다. 이 연산은 필터를 이미지 위에서 일정한 크기만큼 이동하며, 필터와 해당 영역의 픽셀 값을 element-wise 곱한 뒤 합산하여 하나의 값을 생성합니다. 이 과정으로 생성된 값들이 모여 새로운 특징 맵(feature map)을 만듭니다. 필터는 학습 과정에서 업데이트되며, 특정 패턴(예: 가장자리, 선, 질감 등)을 감지할 수 있도록 조정됩니다. 합성곱 연산은 이미지의 공간적 관계를 보존하면서도 중요한 정보를 강조하고, 불필요한 정보를 줄이는 데 매우 효과적입니다.
[메모]
element-wise : 합성곱 입력이 이미지라고 가정해보자 커널은 내가 설정하기 나름인데 이 커널은 이미지를 이해하기위한 가중치이다 딥러닝에서 웨이트가 초기에는 아무 값이나 정해져있지만 커널에 쓰이는 정방 행렬을 써야만하는데 그 정방행렬의 크기는 내가 정한다
보통 데이터를 이해하기위해서는 홀수의 정방행렬을 쓰도록 되어있다
출력에는 한칸에 입력의 빨간칸에 해당하는값과 커널과 같은 위치에 있는거랑 1대1로 곱한다 행렬 곱이 아님 element-wise곱임
위 과정으로 피쳐맵 즉 출력에 해당하는거에 다 채워넣게 된다 6옆의 칸은 입력에서 한칸 옆으로 박스 이동해서 6옆의 칸 채우고 그런식으로 출력을 채우고
그후에는 일반적인 딥러닝 과정으로 들어가서 나중에 오차값등을 구해서 나중에 커널값을 업데이트하게된다 기존의 W값 업데이트 하는것 처럼
간단한 이미지라면 입력에서 커널이랑 엘리먼트 와이즈 곱을 할때 아래처럼 한칸씩 이동해서 피쳐맵을 3*3으로 만드는게 아니라
2칸씩 이동하게 되면 피쳐맵이 크기가 2*2가 된다 그러면 출력인 즉 피쳐값이 작아지는데 이것이 밑에 있는 스트라이드이다.

3-2. 스트라이드
스트라이드(Stride)는 합성곱 연산에서 필터(커널)가 입력 데이터(이미지) 위를 이동하는 간격을 의미합니다. 기본적으로 스트라이드 값이 1이면 필터가 한 칸씩 움직이며 모든 위치에서 연산을 수행합니다. 스트라이드 값이 2 이상이면 필터가 더 큰 간격으로 이동하므로, 생성되는 출력 크기가 작아지고 연산량도 줄어듭니다. 스트라이드를 조절하면 특징 맵의 크기를 조정할 수 있어, 모델의 계산 효율성을 높이거나 더 큰 영역의 정보를 한 번에 처리할 수 있습니다. 다만, 스트라이드가 너무 크면 중요한 세부 정보가 손실될 수 있으므로 적절한 값을 선택하는 것이 중요합니다.

3-3. 패딩
패딩(Padding)은 합성곱 연산에서 입력 데이터(이미지)의 가장자리에 값을 추가하여 출력 크기를 조정하거나 경계 부분의 정보 손실을 방지하는 기법입니다. 일반적으로 가장자리에 0을 추가하는 제로 패딩(Zero Padding)이 많이 사용됩니다. 패딩은 두 가지 주요 목적이 있습니다: 첫째, 입력 데이터 크기를 유지하여 출력 크기를 줄이지 않고 처리할 수 있게 하며(예: "same" 패딩), 둘째, 경계 부분의 정보를 더 많이 학습할 수 있게 합니다. 패딩을 사용하지 않으면("valid" 패딩) 합성곱 연산이 진행될수록 데이터 크기가 줄어드는 문제가 발생할 수 있습니다. 이를 통해 모델이 공간 정보를 더 잘 학습할 수 있도록 돕습니다.
[메모]
출력크기를 줄이지 않고 처리하기 위해서,경계부분의 정보를 더 많이 학습할 수 있도록 하는것. 합성곱 연산이 진행될수록 데이터 크기가 줄어드는 문제를 해결하면서 가장자리 정보는 소실되지 않도록 한다.

3-4. 풀링
풀링(Pooling)은 CNN에서 특징 맵의 크기를 줄이고, 중요한 정보를 요약하여 계산 효율성을 높이는 과정입니다. 주로 사용되는 방법은 최대 풀링(Max Pooling)과 평균 풀링(Average Pooling)으로, 최대 풀링은 작은 영역에서 가장 큰 값을 선택해 주요 특징을 강조하고, 평균 풀링은 영역의 평균값을 계산하여 전체적인 정보를 요약합니다. 풀링은 데이터 크기를 줄이면서도 중요한 특징을 유지하고, 모델이 공간적 위치 변화에 덜 민감해지도록 만들어 일반화 성능을 높입니다. 이를 통해 연산량을 줄이고 과적합(overfitting)을 방지하는 데 도움을 줍니다.

[메모]
보통 Max Poolling을 많이 씀 얘도 스트라이드가 있음 풀링하는데도 스트라이드를 줄수있는데 위 사진에서는 스트라이드를 2 준것
4. DNN과 CNN
4-1. DNN의 가중치와 편향
- DNN은 완전 연결 계층(fully connected layer)으로 구성되어 있어, 각 입력 노드가 * 모든 출력 노드와 연결됩니다.
- 이 때문에 입력 노드의 수와 출력 노드의 수에 비례하여 매우 많은 가중치(weight)가 필요합니다.
- 각 연결마다 고유한 가중치를 학습하므로, 같은 값이라도 위치가 다르면 별도의 가중치를 사용합니다.
- 모든 노드에 대해 별도로 편향(bias)이 존재하며, 가중치와 함께 학습됩니다.
[메모]
fc 레이어라고 부름 기존의 딥러닝 과정을 이과정으로 이미지를 학습하면 어제처럼 각 픽셀에 대해에 가중치 즉 W값이 생기게 됨 모든 노드에 편향이 존재하게 된다
4-2. CNN의 가중치와 편향
- CNN의 합성곱 계층은 작은 크기의 필터(커널)를 사용하여 입력 데이터의 특정 영역만을 처리합니다.
- 필터는 여러 위치에서 동일하게 적용되며, 이를 가중치 공유(weight sharing)라고 합니다.
- 즉, 필터에 사용되는 가중치는 입력 데이터의 모든 영역에서 반복적으로 사용되므로, 학습해야 할 가중치 수가 크게 줄어듭니다.
- 각 필터마다 하나의 편향(bias)이 있으며, 필터가 어디에 적용되든 동일하게 사용됩니다.
- 합성곱 신경망에도 편향(bias)을 추가할 수 있습니다. 만약, 편향을 사용한다면 커널을 적용한 뒤에 더해집니다. 편향은 하나의 값만 존재하며, 커널이 적용된 결과의 모든 원소에 더해집니다.
[메모]
필터 커널 = 합성곱 연산에 쓰이는 정방 행렬 필터에 사용되는 가중치가 여러 영역에서 동일하게 사용되는데 이게 가중치 공유라고 함 편향 (bias) 아래 이미지 처럼 기존 딥러닝은 행렬곱처럼 모든 경우의 수에 가중치 w가 생기는데 합성곱 연산은 2차원으로 표현하는 데이터 즉 공간적인 데이터를 기억해야하는 학습이 필요하다면 element-wise곱 을 통해서 각 위치에 해당하는 값만 곱해서 정방행렬 안의 값을 다 더해서 필터에 넣는게 더 결과가 좋다는 것이다

아래처럼 편향이 바이어스 즉 bias인데 그거는 아래처럼 다 더해준걸로 나오게 됨

5. 다수의 채널 합성곱 연산
다수의 채널을 가진 경우(예: 컬러 이미지는 3개의 채널, RGB로 구성됨), 합성곱 연산은 각 채널별로 개별적으로 진행된 후 합산되어 최종적인 결과를 도출합니다.
- 필터의 각 채널과 입력 이미지의 대응 채널에 대해 합성곱 연산을 수행합니다. (예를 들어, 필터의 R 채널 부분과 이미지의 R 채널 부분에서 합성곱 연산을 수행합니다. 동일하게 G 채널과 B 채널에서도 각각 수행됩니다.)
- 각 채널에서 나온 합성곱 결과를 더해서 최종 값 하나를 만듭니다.
- 필터는 설정된 스트라이드에 따라 이미지 위를 이동하며 위 과정을 반복합니다. 최종적으로 각 위치에서 계산된 결과값들이 모여 하나의 출력 채널(feature map)을 형성합니다.

[메모]
채널이 개별적으로 연산되어서 학습되는것이 아님 개별적으로 채널별로 계산 된 후에 나중에 피쳐맵 특성맵을 만들때에는 결과적으로 3개의 채널이 합쳐지게 되는것이다
컴퓨터는 컬러,흑백은 의미가 없다 그냥 숫자로 확률로 구분하기 떄문에 각 픽셀의 값을 얼마나 잘 가져가는지만 중요하기 때문에 위처럼 피쳐맵은 다 합쳐지게된다
6. CNN을 구성하는 레이어
CNN은 주로 다음과 같은 레이어로 구성되며, 이미지를 단계적으로 처리해서 결과를 예측합니다. (CNN 체험하기)
- 입력 레이어
- 이미지를 숫자 행렬(예: 32×32×3, RGB 채널)로 네트워크에 전달합니다.
- 합성곱 레이어(Convolution Layer)
- 작은 필터(예: 3×3)를 사용해 이미지의 중요한 특징(예: 선, 모양 등)을 찾아냅니다.
- 필터를 여러 개 사용해 여러 가지 특징을 추출합니다.
- 활성화 함수(ReLU)
- 음수 값을 0으로 바꿔 비선형성을 추가하고, 모델이 복잡한 패턴을 학습할 수 있도록 돕습니다.
- 풀링 레이어(Pooling Layer)
- 이미지 크기를 줄이고 중요한 정보만 요약합니다.
- 예: 2×2풀링은 4개의 값 중 가장 큰 값을 선택(Max Pooling).
- 완전 연결 계층(Fully Connected Layer)
- 이미지의 모든 특징을 하나의 벡터로 평평하게 펼쳐 최종 클래스를 예측합니다.
- 예: 10개의 클래스(고양이, 개 등)에 대해 확률을 계산합니다.
- 출력 레이어(Output Layer)
- 소프트맥스(Softmax) 같은 함수를 사용해 각 클래스에 대한 확률을 출력합니다.
[메모]
- 입력레이어 : 이미지등 데이터를 넣는것
- 합성곱레이어: 작은 필터를 사용해서 이미지의 피쳐맵을 계속 뽑아서 이미지의 특징을 계속 추출
- 활성화 함수: 비선형성을 추가해서 복잡한 패턴을 학습 가능
- 풀링레이어 : 중요한 특징을 추출함 너무 많은 레이어 쌓아도 학습이 잘 안되기때문에 어느정도 피쳐맵을 만들면 풀링을 통해 데이터를 줄이는것도 중요하다 여기까지가 컨벌루셔널 레이어가 하는 역할
- 완전연결계층: 여기서부턴 기존 딥러닝 처럼 벡터로 플랫튼 시켜서 클래스 예측하고 오차값 검증해서 다시 W 갱신하고 과정 반복 실제 학습을 하거나 예측을 하는 부분이 이 과정부터라고 보면 된다\
7. 간단한 CNN 모델 만들기
import torch
import torch.nn as nn
import torch.optim as optim
# 배치크기 * 채널(1: 그레이스케일, 3: 컬러) * 너비 * 높이
inputs = torch.Tensor(1,1,28,28)# 1 배치크기 1 채널:그레이스케일(3이면 컬러 트루컬러라 함) 28 너비 28 높이
print(inputs.shape)
torch.Size([1, 1, 28, 28])
# 첫 번째 Conv2D + ReLU
# 3*3필터를 사용해서 32개 필터를 사용해서 32개의 특징맵 생성
# 출력크기와 입력 크기를 동일하게 유지(padding='same')
conv1 = nn.Sequential(
#레이어 구현
# Conv2d : 2d이미지 받아서 컨벌루셔널 처리해주는 함수
# in_channels=1 = 그레이채널이라 1
# 2차원 배열이 통째로 들어가기 때문에 컬러 그레이냐만 따라서 3이냐 1이냐로 넣음
# out_channels=32 : 32개의 필터를 사용해서 32개의 특징맵을 만듦
# kernel_size=3 : 몇바이 몇으로 커널을 쓸건지 정하는거 여기선 3*3 쓴다는것
# padding='same' : 특징맵 추출한거 결과가 넣은 데이터 값과 동일해야한다는것
#크기를 유지해야하기 때문에 패딩을 쓴다는것
nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, padding='same'),
nn.ReLU() # 활성화 함수 추가
#곡선화 시키기위해 렐루 사용
)
out = conv1(inputs)
print(out.shape)
torch.Size([1, 32, 28, 28])
#그레이 스케일로 가지고있던 채널이 특징맵 32개를 만들어서 1>32개가 되었고 특징이 어느정도 추출되어서 가장자리는 값이 패딩으로 0이 되었겠다
# 첫 번째 MaxPool2D
pool1 = nn.MaxPool2d(kernel_size=2)
# 패딩이 되어있어서 MaxPool2d 하면 테두리를 강조하게됨
# MaxPool2d는 스트라이드 기본값이 2여서 27이 아닌 14가 나옴
# 스트라이드값을 1로 설정하면 1개 줄어서 27 나옴 ,stride=1
out = pool1(out)
print(out.shape)
torch.Size([1, 32, 14, 14])
# 두 번째 Conv2D + ReLU
conv2 = nn.Sequential(
nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, padding='same'),
nn.ReLU() # 활성화 함수 추가
)
out = conv2(out)
print(out.shape)
torch.Size([1, 64, 14, 14])
# 두 번째 MaxPool2D
pool2 = nn.MaxPool2d(kernel_size=2)
out = pool2(out)
print(out.shape)
torch.Size([1, 64, 7, 7])
# Flatten
flatten = nn.Flatten()
out = flatten(out)
print(out.shape) # 64 * 7 * 7 = 3136
torch.Size([1, 3136])
fc = nn.Sequential(
nn.Dropout(0.5), # 드롭아웃 추가 (50% 확률로 뉴런 비활성화)
nn.Linear(3136, 10)
)
out = fc(out)
print(out.shape)
torch.Size([1, 10])
'인공지능 > 딥러닝' 카테고리의 다른 글
Alexnet 구현하기 (0) | 2025.03.05 |
---|---|
Multi-class Weather Dataset (0) | 2025.03.03 |
딥러닝: 퍼셉트론과 다층 퍼셉트론 (0) | 2025.03.03 |
손글씨 데이터셋 (0) | 2025.02.18 |
파이토치로 구현한 논리 회귀 (0) | 2025.02.01 |