전이학습 w/ GPT

 # ResNet50

ResNet50의 주요 특징

  1. Residual Block: ResNet의 핵심은 잔차 블록입니다. 잔차 블록은 입력을 직접 출력에 더하는 스킵 연결(skip connection)을 사용하여 기울기 소실 문제를 완화합니다. 이는 네트워크가 더 깊어지더라도 학습이 원활하게 이루어지도록 돕습니다.
  2. 50층 구조: ResNet50은 50개의 층(컨볼루션 층, 배치 정규화 층, ReLU 활성화 함수 등)으로 구성되어 있습니다. 이러한 깊은 구조는 복잡한 특징을 학습할 수 있게 합니다.
  3. 사전 학습된 가중치: 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(12, figsize=(126))
axes[0].set_title(f'{(1-y_pred[00])*100:.2f}% Alien, {(y_pred[00])*100:.2f}% Predator')
axes[0].imshow(img1)
axes[0].axis('off')
axes[1].set_title(f'{(1-y_pred[10])*100:.2f}% Alien, {(y_pred[10])*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 = 256width = 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. 이미지 사이즈가 다름


학습 이미지 수 : 1000ea
테스트 이미지 : 각각 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)

































































댓글

이 블로그의 인기 게시물

abaqus gpu 사용

코어와 쓰레드 개념

AMD 1700 오버클릭