• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    해결됨

ToTensor와 DataLoader관련질문드립니다!

24.03.26 15:24 작성 조회수 77

1

안녕하세요! 이론적 이해가 아직까지는 잘되나 코드에서 잘 이해가 가지않는 부분이 있어 질문드립니다~

  1. ToTensor에서 왜 0~255를 0~1값으로 스케일링 하는 이유는 무엇인가요?

  1. DataLoader 에서 데이터를 미니배치로 넘기면 가로,세로 길이가 32로 바뀌는 이유는 무엇인가요?

  2. squeeze 함수를 찾아보니 길이가 1인 차원이 없는 행 백터, 열백터, 스칼라 배열을 삭제한다고 하는데, 아래에서 사용되는 이유는 무엇인가요?

    train_features, train_labels = next(iter(train_dataloader))
    # train_features.size()는 64개로 세분화된 미니배치 크기, 채널, 가로, 세로 길이를 보여준다.
    print("Feature batch shape : {}".format(train_features.size()))
    # train_labels.size()도 미니배치 크기만큼 있는 것을 확인할 수 있다.
    print("Labels batch shape : {}".format(train_labels.size()))
    img = train_features[0].squeeze() # squeeze() 길이가 1인 차원이 없는 행 백터, 열백터, 스칼라 배열을 삭제한다.
    label = train_labels[0]
    plt.imshow(img.permute(1,2,0))
    plt.show
    print("Label : {}".format(labels_map[label.item()]))

     

     

답변 1

답변을 작성해보세요.

1

안녕하세요~

변정현입니다.

좋은 질문들 주셔서 감사합니다!

  1. ToTensor에서 왜 0~255를 0~1값으로 스케일링 하는 이유는 무엇인가요?

0~1의 범위로 스케일링하는 이유는 Activation Function (활성 함수) 의 Saturation 문제를 피하기 위해서입니다.

(Section 7에서 배울 예정) Neural Network은 Sigmoid, Hyperbolic Tangent, ReLU와 같은 Non Linear Activation Function (비선형적인 활성화 함수)를 Layer들 중간 중간에 사용합니다. Sigmoid와 Hyperbolic tangent은 x >> 0, x << 0 (즉 크기가 아주 큰 입력값)에 대해서는 Gradient가 0에 수렴해서 학습이 잘 되지 않는 문제점이 있습니다.

만약에 Sigmoid, Hyperbolic Tangent가 아니라 Saturation 문제로부터 자유로운 ReLU함수로 구성되어 있는 경우는 어떻게 될까요?

(Section 12에서 배울 예정) Layer가 출력하는 값의 범위 (즉, 출력값의 표준편차) 를 "어느정도" 일정하게 유지시켜주어야 안정적으로 학습이 됩니다. 0~255 사이의 값이 Layer를 거칠수록 (즉, 여러번 곱하게 되면) 발산하게됩니다. 따라서 이때에도 0~1 사이의 값으로 스케일링 해주어야 NN이 안정적으로 학습될 수 있습니다.

  1. DataLoader 에서 데이터를 미니배치로 넘기면 가로,세로 길이가 32로 바뀌는 이유는 무엇인가요?

Cifar10 데이터셋은 가로, 세로 길이가 원래 32입니다!

  1. squeeze 함수를 찾아보니 길이가 1인 차원이 없는 행 백터, 열백터, 스칼라 배열을 삭제한다고 하는데, 아래에서 사용되는 이유는 무엇인가요?

해당 예제에서 만들어보는 Neural Network은 Fully Connected Neural Network로 Vector 값을 입력받습니다. 여기서 Batch size에 대한 차원도 포함하면 해당 NN은 행렬 (Batch size, Hidden Feature Size) 을 입력받게 되는 셈입니다. 하지만 이미지 데이터는 기본적으로 다차원의 텐서입니다. 텐서의 크기는 (Batch size, Number of Channels, Height, Width)이기 때문에 (Number of Channels, Height, Width)에 해당되는 차원들을 하나의 Hidden Feature로 "squeeze"하여 (Batch size, Hidden Feature Size) 크기로 맞춰주는 것입니다.

nanki님의 프로필

nanki

질문자

2024.03.28

궁금증이 해소되었습니다~답변 감사드립니다~!! :D