전이학습 w/ GPT
# ResNet50
ResNet50의 주요 특징
- Residual Block: ResNet의 핵심은 잔차 블록입니다. 잔차 블록은 입력을 직접 출력에 더하는 스킵 연결(skip connection)을 사용하여 기울기 소실 문제를 완화합니다. 이는 네트워크가 더 깊어지더라도 학습이 원활하게 이루어지도록 돕습니다.
- 50층 구조: ResNet50은 50개의 층(컨볼루션 층, 배치 정규화 층, ReLU 활성화 함수 등)으로 구성되어 있습니다. 이러한 깊은 구조는 복잡한 특징을 학습할 수 있게 합니다.
- 사전 학습된 가중치: ResNet50은 ImageNet 데이터셋으로 사전 학습된 가중치를 제공하여 전이 학습에 유용하게 사용됩니다. 이는 새로운 작업에 대해 빠르게 수렴하고 높은 성능을 발휘할 수 있도록 돕습니다.
ResNet50의 구조
ResNet50은 다음과 같은 층으로 구성됩니다:
- Conv1: 7x7 컨볼루션, 64 필터, 스트라이드 2
- Max Pooling: 3x3, 스트라이드 2
- Conv2_x: 3개의 잔차 블록
- Conv3_x: 4개의 잔차 블록
- Conv4_x: 6개의 잔차 블록
- Conv5_x: 3개의 잔차 블록
- Fully Connected Layer: 최종 분류를 위한 완전 연결 층
# 관련예제(출처)
에어리언, 프리데이커
# data_transforms는 내가 위에서 설정한 애로 사이즈 224,224로 재설정하고 텐서형태로 변환되어있음
# 그럼으로 새로 불러온 img1과 img2 둘다 같은 전처리를 거쳐야함
# data_transforms에는 Compose클래스가 가진 __call__이라는 스페셜 메서드가 있음으로 함수로 정하지 않았지만 ()를 붙여서 이미지를 넣으면 함수처럼 이미지가 data_transforms안에 설정된 것들이 적용됨
img1_input = data_transforms['validation'](img1)
img2_input = data_transforms['validation'](img2)
print(img1_input.shape,img2_input.shape)
# torch.Size([3, 224, 224]) torch.Size([3, 224, 224])
# 배치로 묶어서 모델에 연결
# 2,3,224,224 차원으로 img1_input와 img2_input를 쌓음
# stack : 차원을 쌓아주는 함수
test_batch = torch.stack([img1_input,img2_input])
test_batch = test_batch.to(device)
test_batch.shape
torch.Size([2, 3, 224, 224])
y_pred = model(test_batch)
y_pred
tensor([[0.1115],
[0.9516]], device='cuda:0', grad_fn=<SigmoidBackward0>)
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
axes[0].set_title(f'{(1-y_pred[0, 0])*100:.2f}% Alien, {(y_pred[0, 0])*100:.2f}% Predator')
axes[0].imshow(img1)
axes[0].axis('off')
axes[1].set_title(f'{(1-y_pred[1, 0])*100:.2f}% Alien, {(y_pred[1, 0])*100:.2f}% Predator')
axes[1].imshow(img2)
axes[1].axis('off')
plt.show()
※참고 : 이미지데이터 열기
from PIL import Image
img1 = Image.open('./data/validation/alien/19.jpg')
img2 = Image.open('./data/validation/predator/20.jpg')
fig, axes = plt.subplots(1,2,figsize=(12,6))
axes[0].imshow(img1)
axes[0].axis('off')
axes[1].imshow(img2)
axes[1].axis('off')
plt.show()
#전이학습 예,
https://datacook.tistory.com/59
1. classes = 3
의미:
- 모델의 출력 클래스 수를 나타냅니다. 즉, 분류하고자 하는 카테고리 또는 레이블의 수가 3개임을 의미합니다.
ResNet50에서의 역할:
- ResNet50은 기본적으로 ImageNet 데이터셋을 사용하여 1000개의 클래스를 분류하도록 학습되어 있습니다.
- 전이 학습(Transfer Learning)을 통해 ResNet50을 재사용할 때, 최종 출력 레이어를 해당 작업에 맞게 수정해야 합니다.
classes = 3
으로 설정함으로써, 모델의 마지막 완전히 연결된(fully connected) 층의 뉴런 수를 3개로 변경하여 3개의 클래스를 예측할 수 있도록 합니다.
2. height = 256
, width = 256
의미:
- 모델에 입력될 이미지의 세로(height)와 가로(width) 크기를 지정합니다.
- 즉, 입력 이미지가 256 픽셀 x 256 픽셀의 해상도를 가집니다.
ResNet50에서의 역할:
- ResNet50은 **합성곱 신경망(Convolutional Neural Network)**이기 때문에, 입력 이미지의 크기에 유연하게 대응할 수 있습니다.
- 하지만 사전 학습된 ResNet50 모델은 (224, 224, 3)의 입력 크기를 가정하고 있습니다.
- 입력 크기를 (256, 256, 3)으로 변경하면, 모델의 구조는 동일하지만 특성 맵(feature map)의 크기가 달라집니다.
- 대부분의 경우 입력 크기를 조정하여 모델에 적합하게 사용할 수 있습니다.
주의 사항:
- 입력 크기를 너무 크게 하면 메모리 사용량이 증가하고, 처리 시간이 길어질 수 있습니다.
- 입력 크기를 너무 작게 하면 이미지의 세부 정보가 손실되어 모델의 성능이 저하될 수 있습니다.
- 일반적으로 (224, 224) 또는 그 이상으로 설정하며, 원본 이미지의 해상도와 처리 효율을 고려하여 결정합니다.
3. channels = 3
의미:
- 입력되는 이미지의 채널 수를 나타냅니다.
- 일반적으로 **컬러 이미지(RGB)**는 채널 수가 3입니다. (R: 빨강, G: 초록, B: 파랑)
- 만약 흑백 이미지라면 채널 수는 1이 됩니다.
ResNet50에서의 역할:
- ResNet50은 3채널(RGB) 이미지를 입력으로 받도록 설계되었습니다.
- 입력 이미지의 채널 수는 모델의 **입력 층(input layer)**의 형태를 결정합니다.
channels = 3
으로 설정하면, 모델은 (height, width, 3) 형태의 입력을 받습니다.
1. 이미지 사이즈가 다름
테스트 이미지 : 각각 1개
# 코드 실행시 : 1_ResNet50_study3_GPU.py
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/resnet/resnet50v2_weights_tf_dim_ordering_tf_kernels_notop.h5
94668760/94668760 ━━━━━━━━━━━━━━━━━━━━ 4s 0us/step
Model: "sequential"
Total params: 24,617,475 (93.91 MB)
Trainable params: 1,051,651 (4.01 MB)
Non-trainable params: 23,565,824 (89.90 MB)
댓글
댓글 쓰기