• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    미해결

AutoEncoder 질문 드립니다.

20.05.14 14:03 작성 조회수 223

0

먼저 AutoEncoder를 학습할때 사용하는 x의 범위에 대해서 궁금합니다. 보통 딥러닝의 입력으로는 0 ~ 1 혹은 -1 ~ 1등의 정규화 과정을 하는데 그러한 정규화 과정이 학습할때는 보이지 않는 것 같습니다.

두번째 질문은 view_data를 255로 나누는 이유입니다. 학습 과정에서 따로 정규화가 없다면 입력은 0 ~ 255라고 생각을 하는데, test를 하는 데이터인 view_data만 255로 나눠도 동작을 하는 이유가 궁금합니다.

세번째 질문은 Activation위치입니다. 현재 코드에서는 Encoder는 입력이 주어지면 한개의 Hidden Layer(1)를 거쳐 Latent Vector(2)를 만들고, Decoder는 Encoder가 생성한 Latent Vector(2)를 이용하여 한개의 Hidden Layer(3)를 거쳐서 출력(4)를 생성합니다. Activation의 위치를 봐서 (1)과 (3)의 출력에 대해서 Activation이 걸리는 것 같습니다. 만약 이것이 맞나면 왜 (2)번과 (4)번에는 Activation을 사용하지 않는지 궁금합니다. 저는 아래와 같이 코드를 수정해야 한다고 생각하고 있는데 잘못된 부분이 있으면 알고 싶습니다.(입력이 0.0~1.0 으로 정규화 되었다는 가정 하에).

self.encoder = nn.Sequential(
            nn.Linear(28*28, 128),
            nn.ReLU(),
            nn.Linear(128, 64),
            nn.ReLU(),
 ) self.decoder = nn.Sequential( nn.Linear(64, 128), nn.ReLU(), nn.Linear(128, 28*28),
            nn.Sigmoid(),
)

답변 1

답변을 작성해보세요.

0

안녕하세요.

첫 번쨰 질문에 대해서는, FashionMNIST 데이터를 로드할 때 transform을 해줍니다. 이 때, ToTensor()을 이용하여 Tensor 형식으로 변환함과 동시에 0~1 사이값으로 정규화 과정이 포함되어있습니다.

두 번째 질문에 대해서는, 학습할 때 ToTensor를 이용하여 정규화과정을 진행하였기 때문에, 테스트 데이터에 대해서도 0~1 값으로 변환하기 위해 255를 나누어줍니다.

세 번쨰 질문에 대해서는, 질문자 분의 의견도 맞다고 생각됩니다. Latent Vector를 생성할 때와, Decoder 의 Output 값에 Activation Function을 이용하여도 됩니다. 보통 네트워크의 아웃풋 값에는 분류일 때는 sigmoid, softmax 등의 Activation Function을 이용하고, 회귀일 때는 Linear하게 출력하기도 하며, AutoEncoder는 생성모델이기 때문에 회귀와 유사한 성격을 갖고 있어 Linear하게 출력하였습니다. 질문자 분의 의견처럼 Encoder의 최종 출력값에 ReLU, Decoder의 최종 출력값에 Sigmoid를 출력값으로 이용하여도 괜찮습니다.