본문 바로가기

IT/AI

인공 신경망 기초

728x90

Perceptron

Perceptron은 초기의 인공 신경망으로, 사람의 신경망을 모방하여 다수의 입력을 받아서 하나의 결과를 내보내는 알고리즘입니다. 각 입력에 가중치를 곱하여 임계치를 기준으로 정보$($데이터$)$를 전달합니다. 단층 퍼셉트론은 입력층과 출력층으로 구성되며, 다층 퍼셉트론은 입출력 사이에 은닉층이 추가되어있으며, 은닉층에서 비선형으로 만들어주는 활성화함수가 있다.

Perceptron

 

더보기

예를 들어, Perceptron을 사용하여 AND 게이트를 구현한다고 가정해보겠습니다. AND 게이트는 두 입력이 모두 참일 때만 출력이 참이 되는 논리 연산입니다. Perceptron은 두 입력에 대한 가중치를 곱하고 임계치를 적용하여 출력을 계산할 수 있습니다. 

 

def perceptron(input1, input2):
    # 가중치와 임계치 설정
    weight1, weight2, threshold = 0.5, 0.5, 0.7
    
    # 입력과 가중치를 곱하여 합산
    summation = input1 * weight1 + input2 * weight2
    
    # 임계치와 비교하여 출력 계산
    if summation >= threshold:
        return 1
    else:
        return 0

# AND 게이트 테스트
print(perceptron(0, 0))  # 0
print(perceptron(0, 1))  # 0
print(perceptron(1, 0))  # 0
print(perceptron(1, 1))  # 1

 

 

DNN $($Deep Neural Network$)$

DNN은 심층 신경망으로, 2개 이상의 은닉층을 가집니다. 다층 퍼셉트론과 구조적으로 유사하지만 더 깊은 구조를 가지고 있습니다. 손실함수와 최적화를 통해 역전파를 통해 가중치를 업데이트하며, 손실을 최소화하여 학습합니다.

더보기

예를 들어, 다층 퍼셉트론을 사용하여 손글씨 숫자를 분류하는 문제를 해결한다고 가정해보겠습니다. MNIST 데이터셋을 사용하여 숫자를 인식하는 DNN 모델을 학습할 수 있습니다.

import torch
import torch.nn as nn
import torchvision.transforms as transforms
import torchvision.datasets as datasets

# MNIST 데이터셋 로드
train_dataset = datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor())

# 데이터 로더 설정
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=64, shuffle=False)

# 모델 정의
class DNN(nn.Module):
    def __init__(self):
        super(DNN, self).__init__()
        self.fc1 = nn.Linear(784, 512)
        self.fc2 = nn.Linear(512, 256)
        self.fc3 = nn.Linear(256, 10)
        self.relu = nn.ReLU()
        self.softmax = nn.Softmax(dim=1)
        
    def forward(self, x):
        x = x.view(-1, 784)
        x = self.relu(self.fc1(x))
        x = self.relu(self.fc2(x))
        x = self.fc3(x)
        return self.softmax(x)

# 모델 학습 및 평가
model = DNN()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

# 학습 및 검증 코드 생략...

Activation Function $($활성화 함수$)$

활성화 함수는 비선형 함수로 입력된 정보를 다른 층으로 전달할지 결정하는 함수입니다. 주로 사용되는 활성화 함수에는 sigmoid, ReLU, softmax 등이 있습니다.

 


- sigmoid: 이진분류, 기울기 소실 문제 존재

- ReLU: 음수-> 0, 양수 x-> x, 연산이 빠르지만 음수가 입력으로 주어지면 기울기가 0이라서 주의가 필요함

- softmax: 다중 분류에 유용, 입력 받은 값을 0~1로 정규화하고, 출력 값의 총 합이 1이 되도록 하는 함수

 

더보기

예를 들어, ReLU$($Recitified Linear Unit$)$ 활성화 함수를 사용하여 은닉층의 비선형성을 추가한다고 가정해보겠습니다.

 

import torch
import torch.nn as nn

# ReLU 활성화 함수 정의
relu = nn.ReLU()

# 음수 값을 0으로 변환하는 예시
x = torch.tensor([-1.0, 0.0, 1.0])
output = relu(x)
print(output)  # 출력: tensor([0., 0., 1.])

'IT > AI' 카테고리의 다른 글

딥러닝 기초 핵심 개념 1  (0) 2024.03.08
머신러닝 기초  (0) 2024.03.07
[이미지] CustomDataset [Python] - cv2, PIL  (0) 2023.09.07
[이미지] 번호판 생성 [Python] - cv2, PIL  (2) 2023.09.01