250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 데이터베이스
- 장고
- 그래픽 유저 인터페이스
- yaml
- paper review
- k8s
- Deep Learning
- kubernetes
- 딥러닝
- vue.js
- Django
- GUI
- Python
- FLASK
- numpy
- Tkinter
- MariaDB
- Computer Vision
- 컴퓨터 비전
- 논문 리뷰
- Docker
- tensorflow
- OpenCV
- Web Programming
- 텐서플로우
- pytorch
- 파이토치
- 웹 프로그래밍
- 파이썬
- POD
Archives
- Today
- Total
Maxima's Lab
[Python, Pytorch] Anomaly Detection & 코드 구현 본문
728x90
SMALL
안녕하세요, 오늘은 Anomaly Detection의 개념에 대해 알아보고 Pytorch 프레임워크를 활용해서 코드를 구현해보는 방법에 대해서 알아보도록 하겠습니다.
- Anomaly Detection : 이상 감지는 이미지 또는 일련의 이미지 내에서 비정상적이거나 비정상적인 패턴, 개체 또는 이벤트를 식별하느 프로세스를 의미합니다.
이어서, Anomaly Detection Task에서 Reconstruction Loss Functions으로 자주 사용하는 Loss Functions에 대해서 알아보도록 하겠습니다.
- Mean Squared Error (MSE) : 예측 값과 실제 값 사이의 제곱 차이의 평균을 측정하는 손실 함수 입니다. 이는 재구성된 이미지와 원본 이미지의 차이를 계산하기 위해 자주 사용됩니다.
- Binary Cross-Entropy Loss (BCE) : 예측 확률과 실제 레이블 간의 차이를 측정하기 위해 이진 분류 문제에 사용되는 손실 함수입니다. 이는 이미지를 정상 또는 비정상으로 분류하기 위한 이상 감지에 사용됩니다.
- L1 Loss : Original 이미지와 재구성된 이미지와의 평균 절대 차이를 측정합니다.
- Smooth L1 Loss : L1 Loss 보다 이상치에 덜 민감하게 반응하는 손실 함수 이며, 오류 분포가 Gaussian 분포일 것으로 예상되는 경우에 주로 사용됩니다.
- Huber Loss : Smooth L1 Loss와 유사하게, L1 Loss 보다 이상치에 덜 민감하게 반응하는 손실 함수 이며, 주로 오류의 분포가 heavy-tailed의 형태일 때 주로 사용됩니다. 이는 오류의 분포가 평균에ㅓ 멀리 떨어진 값들이 더 많은 경우를 의미합니다.
- KL-Divergence : 두 확률 분포 간의 차이를 측정하는 손실 함수입니다. 잠재 변수의 사전 분포와 학습된 분포 간의 차이를 측정하기 위해 Variational Autoencoders와 같은 생성 모델에 사용됩니다.
위의 Losses 중 MSE와 L1 Loss를 Pytorch 프레임 워크로 구현하는 방법에 대해서 알아보겠습니다.
먼저, Mean Squared Error (MSE)에 대한 코드입니다.
import torch.nn as nn
mse_loss = nn.MSELoss()
loss = mse_loss(predicted_output, target_output)
이어서, Reconstruction Loss에 대한 코드입니다.
import torch.nn as nn
reconstruction_loss = nn.L1Loss()
loss = reconstruction_loss(reconstructed_image, input_image)
이어서, Reconstruction Loss 중 L1 Loss 를 사용해서 AutoEncoder 모델을 학습하는 예시 코드에 대해서 알아보겠습니다.
import torch
import torch.nn as nn
import numpy as np
class Autoencoder(nn.Module):
def __init__(self):
super(ConvAutoencoder, self).__init__()
self.encoder = nn.Sequential(
nn.Conv2d(1, 128, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(128, 256, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(256, 512, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(512, 1024, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2)
)
self.decoder = nn.Sequential(
nn.ConvTranspose2d(1024, 512, kernel_size=3, stride=2, padding=1, output_padding=1),
nn.ReLU(),
nn.ConvTranspose2d(512, 256, kernel_size=3, stride=2, padding=1, output_padding=1),
nn.ReLU(),
nn.ConvTranspose2d(256, 128, kernel_size=3, stride=2, padding=1, output_padding=1),
nn.ReLU(),
nn.ConvTranspose2d(128, 1, kernel_size=3, stride=2, padding=1, output_padding=1),
nn.Sigmoid()
)
def forward(self, x):
x = self.encoder(x)
x = self.decoder(x)
return x
위의 코드는 Autoencoder 기반 모델을 구현한 결과입니다. 이어서, Random Dataset, Model, Optimizer 등 모델을 학습하는 코드는 다음과 같습니다.
data = np.random.rand(100, 1, 256, 256).astype(np.float32)
model = ConvAutoencoder()
criterion = nn.L1Loss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
for epoch in range(10):
for i, batch in enumerate(torch.split(torch.Tensor(data), 10)):
optimizer.zero_grad()
recon = model(batch)
loss = criterion(recon, batch)
loss.backward()
optimizer.step()
print("Epoch %d loss: %.4f" % (epoch+1, loss.item()))
위의 코드에서는 np.random.rand() 함수를 통해 임의의 Random Dataset을 사용하였고, criterion은 L1 Loss, optimizer는 Adam을 사용하였습니다.
지금까지, Anomaly Detection 개념에 대해 알아보고, Autoencoder 기반의 모델에서 주로 사용되는 손실 함수들과 이를 활용해서 모델 학습을 하는 코드를 구현하는 방법에 대해 알아보았습니다.
728x90
LIST
'Python > Pytorch' 카테고리의 다른 글
[Python, Pytorch] torchvision.transforms 사용법 (0) | 2022.09.20 |
---|---|
[Python, Pytorch] Tensor, Cuda 사용법 (0) | 2022.09.01 |
[Python, Pytorch] TensorDataset & DataLoader (0) | 2022.08.31 |
[Python, Pytorch] DataLoader (데이터 불러오기) (0) | 2022.08.07 |
Comments