👉🏻 Convolutional Encoder-Decoder
- Convolutional Neural Network로 이루어진 인코더 - 디코더
- 왼쪽이 인코더 오른쪽이 디코더
- input으로는 CT 이미지
- output으로는 mask
- 폐의 영역만 하얗게 된 mask
✅ CNN
컨볼루셔널 신경망(Convolutional Neural Network, CNN)은 주로 이미지 인식 및 컴퓨터 비전 작업에 사용되는 딥러닝 아키텍처 중 하나입니다. CNN은 그 이름에서 알 수 있듯이 컨볼루션 연산을 사용하여 입력 데이터로부터 특징을 추출하고, 이를 통해 이미지의 패턴 및 구조를 학습합니다.
여러 계층으로 구성된 CNN은 주로 다음과 같은 기본 구성 요소를 포함합니다:
- 입력 계층 (Input Layer): 초기에는 원본 이미지가 입력됩니다.
- 컨볼루션 계층 (Convolutional Layer): 이 계층에서는 컨볼루션 연산을 통해 입력 이미지로부터 특징을 추출합니다. 필터(커널)라 불리는 작은 윈도우가 입력 이미지 위를 이동하면서 특징을 감지하고, 이를 특징 맵(feature map)으로 변환합니다.
- 활성화 함수 (Activation Function): 주로 ReLU(Rectified Linear Unit) 함수를 사용하여 특징 맵의 비선형성을 도입합니다. 이는 네트워크가 복잡한 비선형 관계를 학습할 수 있도록 도와줍니다.
- 풀링 계층 (Pooling Layer): 풀링은 특징 맵의 크기를 줄이는 작업으로, 공간적인 계층을 만들어 계산 비용을 줄이고, 과적합을 방지합니다. Max pooling과 Average pooling이 주로 사용됩니다.
- 완전 연결 계층 (Fully Connected Layer): 특징 맵에서 추출된 정보를 바탕으로 최종 출력을 생성하는 계층입니다. 이 계층에서는 모든 뉴런이 서로 연결되어 있습니다.
- 출력 계층 (Output Layer): 최종 예측이 이루어지는 계층으로, 분류 문제의 경우 소프트맥스 함수를 사용하여 클래스에 대한 확률 분포를 얻습니다.
CNN은 주로 이미지 인식 및 분류, 객체 감지, 세그멘테이션 등 다양한 컴퓨터 비전 작업에서 탁월한 성능을 보이고 있습니다. 이러한 구조는 가중치와 편향을 학습하여 주어진 작업에 대해 특정 특징을 추출하고, 이를 기반으로 입력 데이터를 분류하거나 예측합니다.
🧩 Encoder와 Decoder
- MaxPooling으로 차원을 축소하고
- UpSampling으로 차원을 늘려서 Output이미지를 만드는 것
- 노란색으로 표시된 시그모이드 레이어가 0과 1을 구분해줄 것
- 차원을 줄여서 핵심 정보만 뽑아낸 다음
- 다시 차원을 늘려서 마스크를 만들어낼 것
✅ Encoder
- 차원 축소를 통해 핵심 요소만 뽑아냄
Encoder(인코더)는 정보를 다른 형식이나 표현으로 변환하는 기능을 수행하는 장치나 알고리즘을 가리킵니다. 다양한 컨텍스트에서 사용되며, 특히 딥러닝 및 신경망 관련 분야에서는 특정 유형의 신경망 구조를 지칭하는 경우가 많습니다.
- 일반적인 의미에서의 Encoder:
- 통신 및 정보 이론: 메시지를 부호화하여 다른 형태로 변환하는 장치를 가리킵니다. 예를 들어, 디지털 통신에서는 아날로그 신호를 디지털 신호로 인코딩하는 과정을 의미할 수 있습니다.
- 딥러닝에서의 Encoder:
- 오토인코더(Autoencoder): 인코더는 입력 데이터를 내부 표현으로 매핑하는 역할을 합니다. 오토인코더는 입력 데이터를 압축하는데 사용되며, 학습 후에 디코더를 통해 원본 데이터를 재구성합니다. 이는 데이터의 특징을 추출하고 잠재 공간에 매핑함으로써 차원 축소나 특징 학습에 활용됩니다.
- 순환 신경망(RNN) Encoder: 시퀀스 데이터를 처리할 때 사용됩니다. 예를 들어, 기계 번역에서는 RNN을 사용하여 입력 문장을 고정된 크기의 벡터로 인코딩합니다.
- 트랜스포머 Encoder: 언어 모델링과 기계 번역 등에 사용되는 트랜스포머 모델은 세계적인 트랜스포머 인코더 계층을 사용하여 입력 시퀀스를 처리합니다.
Encoder는 주로 입력 데이터를 잘 표현하거나 특정한 특징을 추출하는 데 사용되며, 이는 다양한 응용 분야에서 활용됩니다.
✅ Decoder
- 압축된 정보로부터 차원 확장을 통해 원하는 정보로 복원
- 더 큰 정보를 뽑아내는 머신
Decoder(디코더)는 주로 Encoder(인코더)와 함께 사용되는데, Encoder에서 생성된 내부 표현이나 압축된 정보를 원래의 형태로 다시 변환하는 역할을 합니다. Decoder는 주로 딥러닝 모델에서 특히 생성 모델(Generative Models)이나 오토인코더(Autoencoder)에서 사용됩니다. 여기서는 주로 오토인코더를 기준으로 설명하겠습니다.
- 오토인코더에서의 Decoder:
- 오토인코더(Autoencoder): 이는 주어진 입력 데이터를 학습하여 내부적으로 표현하는 Encoder와, 그 내부 표현을 사용하여 원래의 입력 데이터를 재구성하는 Decoder로 이루어진 신경망 구조입니다.
- 내부 표현 복원: Encoder에서 압축된 정보를 받아 원래의 입력 데이터로 재구성하는 것이 주요 목적입니다. 학습 후에는 일반적으로 원본 데이터와 유사한 형태로 복원됩니다.
- 활성화 함수 및 레이어: Decoder는 일반적으로 인코더와 반대로 작동하는 구조를 가지며, 활성화 함수로는 주로 ReLU나 Sigmoid가 사용됩니다. Fully Connected Layer로 구성되거나, Convolutional Transpose Layer 등을 사용하여 공간적인 구조를 복원하는 데에도 활용됩니다.
- 기타 딥러닝에서의 Decoder 활용:
- 트랜스포머 Decoder: 트랜스포머 모델에서는 인코더와 디코더가 서로 다른 역할을 수행합니다. 디코더는 입력 시퀀스를 받아 출력 시퀀스로 변환하는 역할을 합니다. Self-Attention 메커니즘을 사용하여 입력의 다양한 위치에 중점을 둠으로써 번역 및 문장 생성 작업에서 탁월한 성능을 보입니다.
- RNN Decoder: 순환 신경망(RNN)은 시퀀스 데이터를 생성하는 데에 사용됩니다. 예를 들어, 기계 번역에서는 RNN 디코더가 인코더에서 생성된 컨텍스트 벡터를 받아 번역된 시퀀스를 생성합니다.
Decoder는 모델의 최종 출력을 생성하거나 원래의 입력을 재구성하는 등의 역할을 수행하며, 다양한 딥러닝 응용 분야에서 활용됩니다.
- Encoder부분은 downsampling으로
- Decoder부분은 upsampling으로 만든다
✅ Downsampling
- 방법은 여러가지가 있으나, CNN에서 주로 사용하는 방법은 Maxpooling
딥러닝에서의 downsampling은 입력 데이터의 공간적인 차원을 줄이는 과정을 말합니다. 이는 일반적으로 인코딩 단계에서 수행되며, 데이터의 특징을 추출하고 계산 비용을 줄이는 데에 도움이 됩니다. 주로 Convolutional Neural Networks (CNNs)이나 풀링(Pooling) 계층 등이 사용되어 downsampling이 이루어집니다.
다음은 downsampling이 어떻게 이루어지는지에 대한 간단한 설명입니다:
- Convolutional Layer:
- Convolutional Layer에서는 필터(커널)가 입력 이미지를 스캔하면서 특징을 감지합니다.
- 이 때, 일반적으로 사용되는 필터는 작은 영역에 집중하여 특정한 패턴이나 특징을 감지하도록 설계됩니다.
- Stride:
- Convolutional 연산에서는 필터가 이동하는 간격을 stride라고 합니다. Stride를 크게 하면 출력 크기가 줄어들게 됩니다.
- 예를 들어, stride가 2인 경우 필터가 입력 위를 2칸씩 이동하면서 특징을 추출하므로 출력의 공간적인 차원이 줄어들게 됩니다.
- Pooling Layer:
- 풀링 계층은 일반적으로 Max Pooling 또는 Average Pooling을 사용하여 특정 영역의 최댓값이나 평균값을 취하여 정보를 압축합니다.
- Pooling을 통해 공간적인 차원이 줄어들고, 특징 맵의 크기가 감소합니다.
- 인코딩 단계:
- 위에서 언급한 Convolutional Layer와 Pooling Layer를 조합하여 인코딩 단계에서 입력 데이터의 공간적인 특징을 추출하고, 동시에 공간적인 차원을 줄입니다.
- 이렇게 함으로써 모델은 입력 이미지에서 중요한 특징을 유지하면서 계산 비용을 줄이고 학습 효율을 높일 수 있습니다.
다운샘플링은 주로 이미지의 공간적인 정보를 보존하면서도 계산 비용을 줄이는 데에 활용되며, 이는 주로 컴퓨터 비전 및 이미지 처리 작업에서 중요한 역할을 합니다.
✅ Maxpooling2D
MaxPooling2D는 2D 이미지 데이터에서 적용되는 Max pooling 연산을 나타냅니다. 주로 Convolutional Neural Networks (CNNs)에서 사용되며, 입력 이미지의 공간적인 차원을 감소시키고 중요한 특징을 강조하는 데에 활용됩니다.
다음은 MaxPooling2D에 대한 간단한 설명입니다:
- 작동 방식:
- MaxPooling2D는 주로 2x2 크기의 작은 윈도우를 사용하여 입력 이미지를 스캔합니다.
- 각 윈도우에서 최댓값을 추출하여 출력 특징 맵을 생성합니다.
- Stride(이동 간격)는 일반적으로 2로 설정하여 출력의 공간적인 차원을 줄입니다.
- 예시:
- 예를 들어, 4x4 크기의 입력 이미지가 있다고 가정합니다.
2x2 크기의 MaxPooling2D를 적용하면 다음과 같이 작동합니다.
각 2x2 영역에서 최댓값을 추출하여 결과를 생성합니다.
- 특징:
- MaxPooling2D는 입력 이미지의 중요한 특징을 강조하고, 이미지의 공간적인 차원을 줄이면서 계산 비용을 절감합니다.
- 입력 이미지의 이동이나 변형에 불변성을 제공하여 CNN 모델이 입력에 대해 더 강건하게 작동하도록 합니다.
- 사용 예시:
- MaxPooling2D는 주로 CNN의 피처 맵을 다운샘플링하는 데 사용됩니다. 이는 주로 이미지 분류, 객체 감지, 세그멘테이션 등의 작업에서 활용됩니다.
MaxPooling2D는 CNN에서 공간적인 차원을 감소시키고 효과적으로 특징을 추출하는 데에 사용되는 기술 중 하나로, 학습 효율을 높이고 모델의 성능을 개선하는 데에 기여합니다.
✅ Upsampling
- 2 × 2 input이 들어간다
- upsampling을 거치면
- 4 × 4 output이 나온다
- 방법은 아래와 같이 여러가지가 있다
Upsampling은 이미지나 특징 맵의 공간적인 차원을 증가시키는 연산을 의미합니다. 이는 이미지나 특징의 해상도를 높이는데 사용되며, 일반적으로 딥러닝에서는 디코더 부분에서 사용됩니다. Upsampling의 목적은 다운샘플링 과정에서 손실된 공간적인 세부 정보를 복원하고 세분화된 결과를 얻는 것입니다.
다음은 Upsampling에 대한 간단한 설명입니다:
- 작동 방식:
- Upsampling은 보통 입력 데이터의 각 픽셀을 여러 개의 픽셀로 확장하여 공간적인 차원을 늘리는 방식입니다.
- 일반적으로는 보간(interpolation) 기법을 사용하여 새로운 픽셀 값을 추정합니다.
- Nearest Neighbor Upsampling:
- 가장 간단한 방법 중 하나로, 각 픽셀을 그 주변의 픽셀 값으로 복제합니다.
- 이 방법은 계산 비용이 낮지만, 보간된 결과의 부드러움이 떨어질 수 있습니다.
- Bilinear Upsampling:
- 이 방법은 각 픽셀을 주변 4개의 픽셀을 사용하여 선형 보간을 수행합니다.
- 픽셀 간의 가중 평균을 계산하여 부드럽게 확장된 결과를 얻을 수 있습니다.
- Transposed Convolution (Convolutional Transpose 또는 Fractionally Strided Convolution):
- Convolutional Transpose 연산은 학습 가능한 가중치를 사용하여 입력 데이터의 차원을 증가시킵니다.
- 이 방법은 훈련 중에 역전파를 통해 최적화되므로, 학습 데이터에 따라 적응적으로 공간적인 패턴을 학습할 수 있습니다.
- 사용 예시:
- 이미지 세그멘테이션에서 디코더 부분에서 Upsampling이 사용됩니다. 이전에 다운샘플링된 특징 맵을 업샘플링하여 원래 입력 이미지와 동일한 해상도로 복원하고 세분화된 결과를 얻습니다.
- 전치 합성곱(Transpose Convolution)과의 차이:
- 전치 합성곱은 학습 가능한 가중치를 사용하여 공간적인 차원을 늘리지만, 보간 방법을 사용하는 일반적인 Upsampling은 가중치를 사용하지 않고 단순히 픽셀 값을 복제하거나 선형 보간을 수행합니다.
Upsampling은 이미지 처리 및 딥러닝에서 중요한 연산으로, 공간적인 세부 정보를 복원하거나 디코더 부분에서 분할 작업을 수행하는 데에 사용됩니다.
✅ Upsampling2D
Upsampling2D는 딥러닝에서 사용되는 업샘플링 연산 중 하나로, 주로 디코더 부분에서 이미지나 특징 맵의 공간적인 차원을 증가시키는 데에 활용됩니다. 특히 Convolutional Neural Networks (CNNs)에서 사용되며, 업샘플링된 결과를 사용하여 더 높은 해상도의 출력을 생성하는 데에 기여합니다.
다음은 Upsampling2D에 대한 간단한 설명입니다:
- 작동 방식:
- Upsampling2D는 입력 데이터의 각 픽셀을 여러 개의 픽셀로 확장하여 공간적인 차원을 늘리는 방식입니다.
- 이때 사용되는 보간(interpolation) 기법에 따라 결과가 달라질 수 있습니다.
- 종류:
- 일반적으로 사용되는 업샘플링 방법에는 Nearest Neighbor Upsampling과 Bilinear Upsampling이 있습니다.
- Nearest Neighbor Upsampling은 주변 픽셀 값을 복제하는 간단한 방법입니다.
- Bilinear Upsampling은 주변 픽셀 값의 선형 보간을 통해 부드러운 결과를 생성합니다.
- 사용 예시:
- 이미지 세그멘테이션에서 디코더 부분에서 Upsampling2D가 주로 사용됩니다.
- 이전에 다운샘플링된 특징 맵을 업샘플링하여 원래 입력 이미지와 동일한 해상도로 복원하고, 세분화된 결과를 얻는 데에 활용됩니다.
- Keras에서의 사용:
- Keras에서는 UpSampling2D 레이어를 사용하여 업샘플링을 수행할 수 있습니다.
- 예를 들어, UpSampling2D(size=(2, 2))는 2배로 이미지를 확대합니다.
from tensorflow.keras.layers import UpSampling2D
# 예시: 2배로 이미지 확대
upsample_layer = UpSampling2D(size=(2, 2))
upsampled_result = upsample_layer(input_data)
Upsampling2D는 Convolutional Transpose 레이어와는 달리 학습 가능한 가중치를 사용하지 않으며, 단순히 보간을 통해 업샘플링을 수행합니다.
🧩 input과 output
✅ mask
주로 픽셀 수준에서 객체나 특정 영역을 식별하는 데 사용되는 이진(0 또는 1) 형태의 이미지를 나타냅니다. 이러한 마스크는 주로 이미지 세그멘테이션(Segmentation) 작업에서 활용되며, 특정 물체나 영역을 표시하기 위해 사용됩니다.
여기에서는 이미지 세그멘테이션에서의 마스크에 대해 자세히 알아보겠습니다:
- 이진 마스크(Binary Mask):
- 마스크는 일반적으로 0 또는 1의 값으로 이루어진 이진 이미지로 표현됩니다.
- 0은 해당 픽셀이 특정 객체 또는 영역에 속하지 않음을 나타내며, 1은 해당 픽셀이 특정 객체 또는 영역에 속함을 나타냅니다.
- 마스크 생성과 사용:
- 마스크는 주로 학습 데이터셋에서 라벨링된 정보를 기반으로 생성됩니다. 훈련 데이터에서는 원본 이미지와 해당 이미지에 대한 마스크가 함께 제공됩니다.
- 학습된 모델은 테스트 또는 새로운 이미지에 대해 객체 또는 영역을 식별하는 데 사용할 수 있는 마스크를 생성합니다.
- 세그멘테이션(Segmentation):
- 이미지 세그멘테이션은 이미지를 픽셀 수준에서 세분화하여 각 픽셀이 어떤 객체에 속하는지를 분류하는 작업입니다.
- 마스크는 이 작업에서 특히 중요한 역할을 하며, 모델은 이미지의 각 픽셀에 대한 마스크를 예측하여 객체의 경계를 식별하고 분할합니다.
- 인스턴스 세그멘테이션(Instance Segmentation):
- 인스턴스 세그멘테이션은 각 객체 인스턴스를 고유하게 식별하는 작업입니다. 한 이미지에서 여러 객체가 있을 때, 각 객체에 대한 개별적인 마스크를 생성합니다.
- 활용 분야:
- 이미지 세그멘테이션 및 마스크는 의료 영상, 자율 주행 자동차, 객체 감지 및 추적 등 다양한 분야에서 활용됩니다.
- 인공지능 시스템이 시각적으로 이해하고 분석하는 데에 중요한 역할을 합니다.
이미지 딥러닝에서의 마스크는 시각적 정보의 특정 부분을 강조하거나 식별하는 데 사용되며, 세그멘테이션과 관련된 작업에서 효과적으로 활용됩니다.
👉🏻 데이터셋
https://www.kaggle.com/datasets/kmader/finding-lungs-in-ct-data
Finding and Measuring Lungs in CT Data
A collection of CT images, manually segmented lungs and measurements in 2/3D
www.kaggle.com
- CT이미지들이 tif파일로 들어있다
- 원본을 사용해도 된다
TIF(또는 TIFF)는 "Tagged Image File Format"의 약자로, 이미지를 저장하기 위한 파일 형식 중 하나입니다. 이 형식은 높은 해상도와 품질을 유지하면서 이미지를 저장하는 데 주로 사용됩니다. TIFF는 여러 가지 특징과 설정을 가진 여러 하위 형식을 지원하며, 색상 깊이, 압축 방법, 다중 페이지 지원 등 다양한 옵션을 제공합니다.
주요 특징과 정보:
- 무손실 압축 지원: TIFF는 무손실 압축을 지원하여 이미지 품질을 유지하면서 파일 크기를 줄일 수 있습니다.
- 다양한 색상 모델 지원: 흑백 이미지부터 RGB, CMYK 등 다양한 색상 모델을 지원합니다.
- 다양한 비트 깊이: 1비트부터 64비트까지 다양한 비트 깊이를 지원하여 이미지의 세부 정보를 효과적으로 저장할 수 있습니다.
- 다중 페이지 TIFF: 여러 페이지를 하나의 TIFF 파일에 저장할 수 있어 문서 스캐너 등에서 사용되는 다중 페이지 문서를 표현할 수 있습니다.
- 메타데이터 지원: TIFF 파일은 각각의 이미지에 대한 메타데이터를 저장할 수 있는 태그를 지원합니다.
- 크로스 플랫폼 호환성: TIFF는 여러 플랫폼에서 지원되며, 다양한 응용 프로그램과 장비에서 사용됩니다.
TIF 파일은 주로 고해상도 이미지, 사진, 문서 스캔 결과, 지오리퍼런싱 데이터 등에 사용되며, 그림 소프트웨어, 출판 및 인쇄 산업, 의료 이미징 등 다양한 분야에서 활용됩니다.
https://github.com/kairess/CT_lung_segmentation/tree/master/dataset
- 강사님이 미리 가공한 데이터셋을 활용
- train set과 validation set을 미리 만들어 둠
👉🏻 코드
🧩 라이브러리 임포트
- numpy: 행렬 연산 패키지
- matplotlib: 그래프 패키지
- keras: 딥러닝 프레임워크
✅ keras
케라스(Keras)는 딥러닝 모델을 쉽게 구축하고 훈련시키기 위한 고수준의 인터페이스를 제공하는 딥러닝 라이브러리입니다. 케라스는 모델 설계, 훈련, 평가, 예측 등의 다양한 딥러닝 작업을 간단하고 직관적으로 수행할 수 있도록 설계되었습니다. 아래에서 케라스의 주요 특징과 사용 방법을 간단하게 설명하겠습니다.
주요 특징:
- 고수준 API: 케라스는 사용자 친화적인 고수준의 API를 제공하여 딥러닝 모델을 쉽게 구축할 수 있습니다. 간결한 코드로 모델을 정의하고 훈련시킬 수 있습니다.
- 모듈성과 확장성: 케라스는 모듈성이 뛰어나며 다양한 레이어, 활성화 함수, 최적화 알고리즘 등을 조합하여 모델을 구성할 수 있습니다. 또한 TensorFlow, Theano, CNTK와 같은 백엔드 엔진을 사용할 수 있어 확장성이 좋습니다.
- 다양한 레이어 지원: 케라스는 다양한 유형의 레이어를 제공하며, 이를 조합하여 복잡한 신경망을 만들 수 있습니다. 예를 들면, Dense(전결합층), Conv2D(합성곱층), LSTM(장단기 메모리) 등이 있습니다.
- 내장된 최적화 알고리즘과 손실 함수: 케라스는 다양한 최적화 알고리즘과 손실 함수를 내장하고 있어 모델의 훈련 설정을 간단하게 지정할 수 있습니다.
- 모델 저장과 불러오기: 훈련된 모델을 저장하고 나중에 다시 불러와서 사용할 수 있는 기능을 제공합니다.
1. 모델 정의
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=10, activation='softmax'))
2. 모델 컴파일
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
3. 데이터 훈련
model.fit(x_train, y_train, epochs=10, batch_size=32)
4. 모델 평가
loss_and_metrics = model.evaluate(x_test, y_test)
5. 예측
predictions = model.predict(x_new_data)
케라스는 TensorFlow 2.x에서 기본적으로 제공되므로, TensorFlow를 설치하면 케라스도 함께 사용할 수 있습니다. 케라스는 딥러닝에 입문하거나 간단한 모델부터 복잡한 모델까지 다양한 사용자층에게 적합한 도구입니다.
"keras를 backend로 tensorflow를 사용한다"
"Keras를 백엔드로 TensorFlow를 사용한다"는 말은 Keras가 딥러닝 모델을 정의하고 학습하는 인터페이스를 제공하면서, 모델의 실제 계산 작업은 TensorFlow라는 딥러닝 프레임워크를 통해 이루어진다는 것을 의미합니다. 즉, TensorFlow는 Keras의 계산 엔진으로 사용된다고 생각할 수 있습니다.
이를 좀 더 자세히 설명하면 다음과 같습니다:
- Keras와 TensorFlow:
- Keras는 딥러닝 모델을 구축하고 훈련하기 위한 고수준의 인터페이스를 제공하는 라이브러리입니다. 사용자가 간단하게 모델을 정의하고 훈련할 수 있도록 편리한 API를 제공합니다.
- TensorFlow는 Google에서 개발한 오픈 소스 딥러닝 프레임워크로, 계산 및 모델 학습에 효과적으로 사용됩니다. TensorFlow는 Keras를 포함하고 있으며, Keras는 TensorFlow 내에서 고수준 API로 제공됩니다.
- Keras를 백엔드로 TensorFlow 사용하기:
- "Keras를 백엔드로 TensorFlow를 사용한다"는 말은, Keras가 모델을 정의하고 훈련하는 고수준의 작업을 담당하면서, 이러한 작업에 필요한 실제 계산은 TensorFlow가 처리한다는 것입니다.
- 즉, Keras는 모델의 구조를 정의하고 학습 프로세스를 관리하는 역할을 하고, TensorFlow는 그러한 모델의 계산을 수행합니다.
- 예시 비유:
- 비유적으로 설명하면, Keras는 딥러닝 모델을 설계하고 구조를 정의하는 설계도를 만들고, TensorFlow는 이 설계도를 기반으로 집을 건설하고 실제로 거주할 수 있는 집을 만들어냅니다.
- Keras는 사용자에게 편의를 제공하고, TensorFlow는 이를 실행하는 실질적인 엔진 역할을 합니다.
이러한 구조는 사용자에게는 편리하고 직관적인 딥러닝 모델 개발 환경을 제공하면서, TensorFlow의 강력한 계산 엔진을 활용하여 성능을 높일 수 있도록 합니다.
🧩 데이터셋 로드
- 원본 코드
- np.load(): .npy파일을 로드한다
- x_train: CT 이미지
- y_train: 폐 영역 마스크 이미지
구글 드라이브 내 코랩에서 돌리기 위해서
- 구글 드라이브 마운트
- 경로 설정 후 변수에 넣기
- 변수에 맞게 경로 변수 넣어주기
- 트레이닝 셋: 240개
- 밸리데이션셋: 27개
- input 이미지: 256×256 사이즈
- 1을 통해 grayscale임을 알 수 있다
- 트레이닝 셋에서 input 이미지 240개
- 밸리데이션도 마찬가지
- output 이미지: 256×256 사이즈
- 1을 통해 grayscale임을 알 수 있다
- 트레이닝 셋에서 output 이미지 240개
- 밸리데이션도 마찬가지
🧩 모델 구성하기
- input은 256×256×1
- Convolution 2D Layer가 들어감,
MaxPooling으로 Downsampling (차원을 2개만큼 줄임) 의 반복
- Dense Layer 하나 추가(하니까 학습이 잘 됐다고 함)
- Downsampling을 통해 줄어든 차원의 크기를 다시 늘리기
- input과 같은 크기로 만들기 위해
- MaxPooling을 한 갯수만큼 UpSampling2D를 2배씩 해준다
Convolution을 한 번 진행 의 반복
- output이 1체널짜리로 나옴
- 마지막 activation은 sigmoid
- input과 output을 정해줌
- optimizer는 adam (잘 모르겠을 땐 adam 쓰는 것이 가장 좋다
- loss는 binary_crossentropy → 0이냐, 1이냐의 문제
✅ Convolution 2D Layer
2D 합성곱(Convolutional) 레이어는 주로 이미지와 같은 2차원 데이터에 대한 특징 추출에 사용되는 딥러닝 레이어입니다. Convolutional Neural Networks(CNNs)에서 주로 사용되며, 이미지 인식, 분류, 객체 감지 등의 작업에 효과적입니다.
주요 개념:
- 커널(Kernel) 또는 필터(Filter):
- 합성곱 연산에서 사용되는 작은 가중치 행렬.
- 입력 데이터를 훑으면서 특정 패턴이나 특징을 감지하는 역할을 함.
- 여러 개의 커널을 사용하여 다양한 특징을 동시에 추출 가능.
- 스트라이드(Stride):
- 커널이 입력 데이터를 훑을 때 이동하는 간격을 나타냄.
- 큰 스트라이드는 출력 크기를 줄이고 작은 스트라이드는 출력 크기를 유지.
- 패딩(Padding):
- 입력 데이터 주변에 추가되는 가상의 데이터.
- 주로 출력 크기를 조절하거나 경계 픽셀에 대한 정보를 유지하기 위해 사용.
- 활성화 함수(Activation Function):
- 주로 ReLU(Rectified Linear Unit)를 사용하여 비선형성을 도입.
- 음수 값에 대한 정보를 제거하고 더 복잡한 패턴을 학습할 수 있도록 함.
동작 과정:
- 입력 데이터와 커널의 합성곱 연산:
- 입력 데이터에 커널을 적용하여 특징 맵을 생성.
- 커널은 입력 데이터를 훑으면서 각 위치에서 가중치를 곱하고 모두 더함.
- 스트라이드와 패딩 적용:
- 스트라이드와 패딩을 고려하여 특징 맵의 크기를 조절.
- 활성화 함수 적용:
- 특징 맵의 각 요소에 비선형 활성화 함수를 적용하여 비선형성 도입.
- 풀링(Pooling) 레이어(Optional):
- 특징 맵을 다운샘플링하여 계산 비용을 줄이거나 특징을 강조.
코드 예시(Keras):
from keras.layers import Conv2D
# Conv2D 레이어 정의
# 필터 개수: 32, 커널 크기: (3, 3), 활성화 함수: ReLU
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(height, width, channels)))
이 코드에서 Conv2D 레이어는 입력 데이터에 3x3 크기의 32개 필터를 적용하고, ReLU 활성화 함수를 사용합니다. 입력 데이터의 크기는 (height, width, channels)로 정의되어야 합니다.
✅ Dense Layer
Dense 레이어는 딥러닝 신경망에서 가장 기본적이고 전형적으로 사용되는 레이어 중 하나입니다. 또한, Fully Connected Layer라고도 불리며, 인공 신경망의 기본 구성 요소 중 하나입니다.
주요 특징:
- Fully Connected (완전 연결):
- Dense 레이어의 각 뉴런은 이전 레이어의 모든 뉴런과 연결됩니다.
- 입력 뉴런과 출력 뉴런 간에 가중치가 존재하고, 이 가중치는 모든 입력에 대해 다르게 조절됩니다.
- 가중치와 편향:
- 각 연결에는 가중치(weight)가 할당되며, 입력과 가중치의 곱이 출력에 기여합니다.
- 편향(bias)은 각 출력 뉴런에 더해져 비선형성을 도입하고 모델이 더 복잡한 패턴을 학습할 수 있도록 도와줍니다.
- 비선형성 도입:
- Dense 레이어 다음에는 주로 비선형 활성화 함수(Activation Function)를 사용하여 모델이 복잡한 관계를 학습할 수 있도록 합니다.
- 일반적으로는 ReLU(Rectified Linear Unit) 또는 시그모이드(Sigmoid)와 같은 활성화 함수를 사용합니다.
동작 과정:
- 입력과 가중치의 곱셈:
- 입력 데이터와 각 뉴런의 가중치를 곱하여 결과를 계산합니다.
- 편향 추가:
- 각 뉴런에는 편향이 더해져 비선형성을 도입합니다.
- 활성화 함수 적용:
- 주로 비선형 활성화 함수를 사용하여 출력을 계산합니다.
- 예를 들면, ReLU 함수를 사용하여 양수 값은 그대로, 음수 값은 0으로 만듭니다.
코드 예시(Keras):
from keras.layers import Dense
# Dense 레이어 정의
# 뉴런 개수: 64, 활성화 함수: ReLU
model.add(Dense(64, activation='relu', input_shape=(input_size,)))
이 코드에서 Dense 레이어는 64개의 뉴런을 가지고 있으며, ReLU 활성화 함수를 사용합니다. input_shape는 입력 데이터의 크기를 나타냅니다. Dense 레이어는 이전 레이어의 모든 뉴런과 연결되기 때문에 입력 데이터의 크기를 지정해주어야 합니다.
✅ optimizer
옵티마이저(optimizer)는 딥러닝 모델을 훈련시킬 때 사용되는 알고리즘으로, 모델의 가중치를 업데이트하고 손실 함수를 최소화하는 방향으로 학습합니다. 딥러닝에서는 그래디언트 디센트(Gradient Descent)나 그래디언트 디센트의 변형 알고리즘을 사용하여 최적화를 수행합니다.
주요 개념:
- 그래디언트 디센트(Gradient Descent):
- 손실 함수의 그래디언트(기울기)를 사용하여 가중치를 조절하며 손실을 최소화하는 방향으로 이동합니다.
- 학습률(learning rate)은 가중치를 얼마나 크게 업데이트할지를 조절하는 하이퍼파라미터로, 적절한 값 설정이 중요합니다.
- 확률적 경사 하강법(SGD - Stochastic Gradient Descent):
- 훈련 데이터의 일부(mini-batch)를 사용하여 그래디언트를 계산하고 가중치를 업데이트합니다.
- 일부 데이터만 사용하기 때문에 계산 효율성이 높아집니다.
- Adam:
- Adaptive Moment Estimation의 약자로, RMSprop과 Momentum 방법을 결합한 최적화 알고리즘.
- 학습률을 조절하고 모멘텀을 사용하여 빠르게 수렴하면서도 안정적인 학습을 제공합니다.
- RMSprop (Root Mean Square Propagation):
- 그래디언트의 제곱에 대한 이동 평균을 사용하여 학습률을 조절하는 알고리즘.
- 가중치 업데이트가 크게 발생한 경우 학습률을 감소시켜 안정적인 훈련을 도모합니다.
- Adagrad (Adaptive Gradient Algorithm):
- 각 파라미터에 독립적인 학습률을 제공하여 자주 나타나는 특성에 대해서는 적응적인 학습률을 사용하는 알고리즘.
- Adadelta:
- Adagrad의 단점을 보완하기 위해 학습률이 감소하는 속도를 조절한 알고리즘.
- Nadam:
- Nesterov Accelerated Gradient와 Adam을 결합한 최적화 알고리즘.
코드에서의 사용:
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
✅ Adam
Adam은 Adaptive Moment Estimation의 약자로, RMSprop과 Momentum 방법을 결합한 것입니다. Adam은 다음과 같은 특징을 가지고 있습니다:
- Adaptive Learning Rates:
- 각각의 파라미터에 대해 학습률(learning rate)을 조절합니다.
- 매 시간 스텝마다 각 파라미터의 스케일에 맞춘 학습률을 사용하여 보다 안정적인 학습을 도모합니다.
- Momentum:
- 지난 그래디언트의 지수 가중 평균을 사용하여 학습을 가속화합니다.
- 지수 가중 평균을 사용하므로 지난 그래디언트에 대한 정보를 일부 유지하면서 새로운 그래디언트 정보를 반영합니다.
- Bias Correction:
- 초기 학습 단계에서 편향된 추정치를 보정하는 방법을 도입하여 초기 학습 과정을 안정화시킵니다.
코드에서의 사용:
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc', 'mse'])
✅ loss
손실 함수(loss function)은 머신러닝 및 딥러닝 모델에서 학습 중에 모델의 예측 값과 실제 값 간의 차이를 측정하는 함수입니다. 학습하는 동안 이 손실 함수의 값을 최소화하려고 노력하며, 이를 통해 모델이 원하는 목표에 가까운 예측을 수행하도록 학습됩니다.
손실 함수는 주어진 입력에 대한 모델의 출력이 실제 출력과 얼마나 일치하는지를 나타내며, 이 차이를 최소화하려고 합니다. 다양한 작업과 모델 유형에 따라 적절한 손실 함수를 선택하는 것이 중요합니다.
몇 가지 일반적인 손실 함수:
- 평균 제곱 오차 (Mean Squared Error, MSE):
- 회귀 문제에서 사용되는 손실 함수로, 예측값과 실제값 간의 제곱 오차의 평균을 계산합니다.
- mse = (1/n) * Σ(y_true - y_pred)^2
- 이진 교차 엔트로피 (Binary Crossentropy):
- 이진 분류 문제에서 주로 사용되는 손실 함수로, 두 확률 분포 간의 차이를 측정합니다.
- binary_crossentropy = -Σ(y_true * log(y_pred) + (1 - y_true) * log(1 - y_pred))
- 범주형 교차 엔트로피 (Categorical Crossentropy):
- 다중 클래스 분류 문제에서 주로 사용되는 손실 함수로, 예측값과 실제값 간의 차이를 측정합니다.
- categorical_crossentropy = -Σ(y_true * log(y_pred))
- 평균 절대 오차 (Mean Absolute Error, MAE):
- 회귀 문제에서 사용되는 손실 함수로, 예측값과 실제값 간의 절대 오차의 평균을 계산합니다.
- mae = (1/n) * Σ|y_true - y_pred|
- 훈련 손실과 검증 손실:
- 모델의 훈련 중에 손실 함수의 값은 훈련 데이터에 대한 예측의 성능을 나타냅니다.
- 모델의 일반화 성능을 평가하기 위해 별도의 검증 데이터에 대한 손실 값을 모니터링할 수 있습니다.
코드에서의 사용:
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
✅ binary_crossentropy
binary_crossentropy는 이진 분류(Binary Classification) 문제에서 사용되는 손실 함수 중 하나입니다. 이 손실 함수는 모델의 출력이 이진 클래스(0 또는 1)에 대한 확률을 나타내는 경우에 주로 활용됩니다. 모델의 출력이 Sigmoid 활성화 함수를 통과한 값이며, 이를 통해 0과 1 사이의 확률값을 얻을 수 있습니다.
이진 교차 엔트로피(Binary Crossentropy)의 개념:
- 수식:
- 이진 교차 엔트로피는 다음 수식으로 표현됩니다.
binary_crossentropy = -Σ(y_true * log(y_pred) + (1 - y_true) * log(1 - y_pred))
-
- 여기서 y_true는 실제 클래스(0 또는 1)를 나타내며, y_pred는 모델의 예측값입니다.
- 해석:
- y_true와 y_pred 사이의 차이를 계산하며, 이 값은 모델의 예측이 실제 클래스와 얼마나 일치하는지를 나타냅니다.
- 모델이 정확한 예측을 할수록 손실 값은 낮아지고, 예측이 틀릴수록 손실 값이 증가합니다.
- 목표:
- 모델이 이 손실 함수를 최소화하도록 학습됩니다.
- 최적화 과정에서 모델의 가중치가 업데이트되어 손실을 줄이고, 이에 따라 정확도가 향상됩니다.
코드에서의 사용:
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(units=1, activation='sigmoid', input_dim=features))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
✅ metrics
metrics는 모델의 성능을 측정하기 위한 지표(metric)를 설정하는 매개변수입니다. 모델이 훈련되는 동안 훈련 손실(loss) 외에도 추가적인 지표를 계산하고 모니터링하는 데 사용됩니다. 주로 테스트 데이터에 대한 모델의 성능을 평가할 때 활용됩니다.
주요 개념:
- 훈련 손실과 평가 지표:
- 모델의 훈련 중에 손실 함수를 최소화하는 것이 주요 목표입니다. 하지만 모델의 전반적인 성능을 평가하기 위해 훈련 손실 외에도 다양한 지표를 고려합니다.
- 예시 지표:
- accuracy (정확도): 올바르게 분류된 샘플의 비율을 나타냅니다.
- precision, recall, f1-score: 이진 또는 다중 클래스 분류 문제에서 클래스별 정밀도, 재현율, F1 점수 등을 나타냅니다.
- mean_squared_error, mean_absolute_error: 회귀 문제에서 사용되는 지표로, 평균 제곱 오차와 평균 절대 오차를 나타냅니다.
- 모델 평가:
- metrics를 사용하여 모델이 얼마나 잘 수행되고 있는지 모니터링합니다.
- 특히, 테스트 데이터에 대한 성능을 측정하여 모델이 새로운 데이터에서 얼마나 일반화되는지 확인합니다.
코드에서의 사용:
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
✅ acc
- 개념:
- 정확도는 모델이 전체 샘플 중에서 올바르게 분류한 샘플의 비율을 나타냅니다.
- 이진 분류에서는 다음과 같이 계산됩니다: (올바른 예측 수) / (전체 샘플 수).
- 다중 클래스 분류에서는 각 클래스에 대한 정확도를 계산하고 평균을 구합니다.
- 의미:
- 모델이 얼마나 정확하게 예측을 수행하는지를 나타냅니다.
- 높은 정확도는 모델이 높은 성능을 나타냄을 의미합니다.
✅ mse
- 개념:
- 평균 제곱 오차는 모델의 예측과 실제 값 간의 차이를 제곱한 값들의 평균을 나타냅니다.
- 회귀 문제에서 사용되며, 예측값과 실제 값의 차이를 제곱하여 오차를 측정합니다.
- 계산:
- mse = (1/n) * Σ(y_true - y_pred)^2, 여기서 n은 샘플 수, y_true는 실제 값, y_pred는 모델의 예측 값입니다.
- 의미:
- 모델의 예측값과 실제값 간의 평균적인 오차를 나타냅니다.
- 낮은 MSE는 모델이 높은 정확도로 예측을 수행함을 의미합니다.
- 256×256 input이 들어가서 MaxPooling을 한 번 통과하니까 128×128로 줄고
- 그 다음엔 64, 64로 줄고, 32, 32까지 준 것을 볼 수 있다
- 이를 다시 늘려서 64, 64로 만들고
- 128, 128 그리고 256, 256으로 늘어난 것을 볼 수 있다
- 처음도 256,256 마지막도 256,256
- input과 output의 크기를 같게 함
- convolutional encoder/decoder 완성
🧩 훈련
- model.fit(): 모델을 학습한다
- epoch: 반복학습 횟수
- Training Accuracy: 98.63%
- Validation Accuracy: 97.14%
👉🏻 그래프 그리기
- 다 history에 들어 있음
- model.fit()을 한 뒤에 history 변수에 저장된다
- matplotlib의 plot이라는 메서드 사용
- ax.plot(): 라인 그래프를 그린다
- history 오브젝트에다가 loss에 접근할 수 있고, acc에 접근할 수 있고, val_loss에 접근할 수 있고, val_acc에 접근할 수 있고 ...
- 윗줄이 training 결과
- 아래줄이 validation 결과
- loss가 내려가는 추세. 학습이 잘 됐다는 증거
- acc가 올라가는 추세. 정확도가 높아졌다는 거
👉🏻 예측하기
- model.predict(): 테스트 데이터를 예측한다
- predict() 함수를 통해 validation 데이터를 예측하기
- 예측한 것을 preds 변수에 넣음
- for문을 돌면서
- 첫 번째 열에는 CT 데이터 (validation데이터)를 넣고
- 두 번째 열에는 정답 데이터를 넣고
- 세 번째 열에는 우리가 예측한 결과값 그리기
- input 데이터 - 정답 - 우리가 예측한 데이터
- 대부분 정답과 비슷하게 잘 나옴
👉🏻 의료계에서 AI
- 딥러닝이 선행적으로 먼저 해보고
- 그 결과값을 사람이 한 번 더 체크하는 방식
👉🏻 추천
https://www.kaggle.com/datasets/paultimothymooney/chest-xray-pneumonia
Chest X-Ray Images (Pneumonia)
5,863 images, 2 categories
www.kaggle.com
https://www.kaggle.com/datasets/paultimothymooney/blood-cells
Blood Cell Images
12,500 images: 4 different cell types
www.kaggle.com
출처: https://youtu.be/z8lK69BQ0VE?si=bebTkWBX57eYf0-_