class로 모델 만드는 설명 해주실 때, linear layer 예제 알려주실 때, 파라미터로 등록하려면 nn.Parameter()로 감싸주라고 하셨는데요, 이후의 코드들을 보면 따로 감싸주는 모습이 안보여서요. 파라미터로 등록할 때 명시적으로 필요 없는 경우가 있는 건지요? 감사합니다.
list.append 와 list.extend의 차이는 append는 y_test_pred자체를 리스트에 추가를 하는 것이고, extend는 리스트의 맨 끝쪽에 y_test_pred 원소들을 하나씩 다 넣는것으로 이해를 했는데, 여기서는 append나 extend 둘 다 써도 괜찮은 것인가요? 제가 이해한 바로는 그렇습니다!
안녕하세요. 강의 잘 듣고있습니다. 다만 질문이 몇가지 있는데요. 3장 데이터 불러오기를 보던 중 LinearTensor를 정의하는 이유가 궁금합니다. ToTensor로만 해주면 되는 것 아닌가 하는 생각이 드는데, ToTensor() 이후 LinearTensor(2,5)를 해주는 이유가 무엇인가요?? LinearTensor에서 init함수와 call함수가 같이 있는데 LinearTensor(2,5)와 같이 호출하면 객체를 만드는 것이니 init을 해주는건가요? 그렇다면 call은 어느 경우에 사용하게 될까요?? 이론적으로는 init을 객체생성, call을 클래스를 함수 그자체로 사용. 하는 경우에 쓰는 것을 알고있으나 pytorch에서 실제 사용예시가 어떻게 다른지가 궁금합니다. 감사합니다.
선생님 이해가 잘 안가는 부분이 있습니다 LSTM을 보면 f, i, s~, o 전부 같은 x, h t-1의 데이터를 쓰고 있지만 각각의 다른 가중치를 쓰는 것은 이해를 했습니다 그런데 input, forget 게이트에서 얼만큼 잊고, 얼만큼 받아 드린다고 하셨는데 이 부분은 각각 따로 계산이 되는건가요? 1-x가 아니여서 비율의 합이 1이 아닌데 어떤 원리로 이것을 forget gate라고 하는건가요? (아니면 s t-1이 자체가 전의 정보를 담고 있어서 이를 시그모이드로 비례적으로 계산하는건가요...?) 그리고 마지막으로 i,s~ 는 둘다 곱해서 이를 input gate라고 하는건가요? 아니면 i_t만 input gate인가요? (i,s~ 둘다 같은 데이터인데 가중치만 달라서 혼동이 옵니다) *요약하자면 선생님 써주신 공식을 보면 그냥 같은 데이터에 다른 가중치를 계산한건데 어떤 원리로 이게 작동하는지 잘 이해가 가지 않습니다 *가능하시면 해당 수식이 해당 모형에서 어떻게 작동하는지 조금 더 알려주시면 감사하겠습니다 :)
안녕하세요 선생님 RNN에 대한 알고리즘을 공부하다가 가중치의 shape를 보면서 이해가 가지 않아서 질문을 드립니다 a(t)안에 있는 원소들의 shape들이 달라도 weight를 통해서 n*1의 형태로 만드는 것은 이해를 했는데 input과 ,h(t-1)의 행이 다른 이유는 무엇인가요? 행이 달라도 되는 이유가 I work at Google라고 할때 I, work (t시점이 work일때) i, work의 글자 수의 차이 때문에 이렇게 행이 다른건가요? 감사합니다
안녕하세요 항상 좋은 강의 해주셔서 감사합니다. df_train.corr()['SalePrice'] 를 실행했더니, ValueError: could not convert string to float: 'RL' 이런 벨류 에러가 뜹니다. 따라서 인터넷에 찾아보았더니, 'RL' 과 같은 문자열을 실수(float)으로 변환할 수 없다고 하며, 이러한 문자열이 존재하는 열은 데이터 타입이 숫자형이 아닌 문자형(object)일 가능성이 높다고 하는데, 위에서 해당 feature를 봤을 떄는 실수형이던데 왜 이런 오류가 발생하는지 아실까요?
어제 질문 답변 감사드립니다! 궁금한게 해결되었습니다..ㅎ 오늘도 질문이 좀 있어서 여쭤보고 싶습니다..! 혹시 augmentation을 한 뒤에 데이터셋을 저장하는 코드를 알 수 있을까요? 예를 들어, 1000개의 이미지 데이터가 train_set에 있고, DataLoader에서 transform을 통해 이 1000개를 변형해가며 로드할텐데, 이 로드한 데이터들을 저장하고 싶습니다! 다양한 augmentation을 통해서 기존 데이터의 3배정도인 3000개의 변형 데이터들을 저장하고 싶은데 코드를 어떻게 짜야할지 모르겠어서 질문드립니다. 요즘 예전 대회들에 있었던 불균형 이미지 데이터 분류를 연습하고 있는 중인데, 라벨이 총 10개에 어떤 라벨에는 데이터가 600개 가까이 되고, 어떤 라벨에는 데이터가 10개도 안되는 경우들이 있는 불균형이 매우 심한 데이터들입니다. 이 불균형을 weightedrandomsampler에 augmentation을 활용하여 불균형을 해소하고자 하였습니다. validation용으로 원본데이터에서 30%만큼 지정을 해 둔 뒤, train용으로 원본데이터를 weightedrandomsampler를 활용해 원본데이터를 변형하고 가중치를 주어 데이터가 적은 라벨의 데이터를 늘려 학습했습니다. 그 뒤에 아까 분리해 놓았던 validation데이터를 분류했습니다만... 평가기준인 weighted F1 score가 생각보다 낮게 나와서 고민입니다.. 제 생각에는 결국 validation 데이터에는 여전히 라벨별로 불균형이 매우 심한 상태이므로 라벨별로 동등한 양의 데이터로 학습한 모델에서는 제대로 예측을 못한것이 아닐까합니다. 그래서 위에서 질문한 코드를 통해 변형된 데이터에 원본 데이터를 합쳐서 학습을 시키고, 그 다음에 validation을 하면 약간은 나아질까 하는 생각이 듭니다만.. 호형님이라면 어떻게 하실지 궁금해서 여쭤봅니다. 질문이 너무 길고 장황해서 죄송합니다..ㅜ
imbalanced data를 처리할 때, weightedrandomsampler (replacement=True) 와 augmentation을 통해 불균형을 해소하고자 하는데, weightedrandomsampler에 있는 num_samples 파라미터에 관해 궁금한점이 있어서 질문드립니다. weightedrandomsampler가 작동하는 방법이, 샘플마다 가중치를 줘서 데이터 수가 적은 라벨에서는 더 높은 확률로 뽑히고, 데이터 수가 많은 라벨에서는 더 낮은 확률로 뽑혀서 결국 확률상 거의 같은 확률로 뽑도록 만들어서 불균형을 해소하는 걸로 알고 있습니다. 이때, 만약 num_samples를 그냥 원래 train_sets의 길이로 지정을 하면 데이터가 적은 라벨에서는 augmentation을 통해 이미지를 변형해가며 오버샘플링이 된 것 처럼 샘플수가 증가되겠지만, 반대로 원래 데이터가 많던 라벨에서는 기존에 있던 데이터들에서 일부는 뽑히지 않을 수도 있지 않나요? 예를들어 (1000,200,100)의 불균형 데이터가 있다고 했을때, 전체 데이터의 개수인 1300만큼 weightedrandomsampler에서 num_samples=1300으로 하고 추출을 한다면, 라벨별로 1300/3 = 433개씩 뽑힐텐데, 이러면 첫번째 라벨의 데이터는 1000개에서 433개를 뺀 567개는 그대로 누락되는건가요? 만약 그렇다면 num_samples를 더 큰 숫자로 해서 가지고 있는 데이터를 전부 불러오려고 한다면, 소수의 데이터를 너무 많이 재활용해서 과적합이 될까요?
# 질문 1. 아래와 같이 model 안에 x_minibatch, y_minibatch를 넣고 학습을 시키는 과정인데 결국 train_batches의 차원은 (375,128,1,28,28) # 48000/128=375 x_minibatch 의 차원은 (128,1,28,28) 여기서 model의 input의 차원은 (128,784) 가 맞을까요? 결국 한번 model 넣을 때마다 128개의 data가 학습되는 건가요? DNNModel에는 input 차원이 (784,)인 1개의 데이터가 들어가서 output으로 (10,) 데이터를 출력한다고 알고있어서 조금 개념이 충돌하는 것 같습니다. # 질문 2. train_batches의 type이 torch.utils.data 이라 shape을 알기 어려워 행렬 구조가 눈에 안들어오는데 따로 보는 방법이 있을까요? model.train() # prep model for training for x_minibatch, y_minibatch in train_batches: y_minibatch_pred = model(x_minibatch.view(x_minibatch.size(0), -1)) loss = loss_func(y_minibatch_pred, y_minibatch) optimizer.zero_grad() loss.backward() optimizer.step() train_loss += loss.item() train_loss = train_loss / len(train_batches) train_losses.append(train_loss)
- 강의 영상에 대한 질문이 있으시면, 주말/휴일 제외, 2~3일 내에 답변드립니다 - 우선 질문전에 검색을 꼭 해보세요. 저희 목표는 스스로 이슈를 해결하는 역량을 기르는 것이고, 이는 즉 검색역량을 기르는 것입니다 - 강의 영상 외적인 질문은 인프런 커뮤니티 (https://www.inflearn.com/community/questions) 도 활용해보세요~ 강사님 고생많으십니다. 강의 잘 듣고 있습니다. 한가지 의문점이 생겨서 질문드립니다. 당뇨병 환자 데이터 강의에서는 data의 범위를 설정하실때 제일 마지막 부분이 target이라서 빼신것이라고 이해했습니다. dataframe으로 출력해서 descr과 함께 확인했는데. target은 따로 되어있는것이 아닌지... 제가 잘못 보고 있는 것인지 궁금합니다. 만약 제 말이 맞다고 가정하였을때 코드를 실행해보면 target의 사이즈는 422로 나옵니다 차원값이 없는데 이부분을 unsqueeze를 해서 차원을 추가해주면 될까요 저렇게 했을때 loss값이 3000이 넘습니다. optimizer를 adam이나 learning rate를 변경해줘봐도 의미는 없는것 같습니다. 단층이라서 그런것 같은데. 위에 데이터의 범위와 차원 추가하는 방법이 맞는 것인지 궁금합니다.
코랩 실행시 에러메시지가 자주 뜹니다 ㅠㅠ 가령 보스턴 집값 예측하기(4-1)강의를 수강 중인데 첫줄부터 실행을 누르면 아래와 같이 에러메시지가 뜨고, 하위 코드도 전부 에러가 뜹니다. [Errno 2] No such file or directory: '/content/gdrive/My Drive/deeplearningbro/pytorch' /content
안녕하세요. 강의 통해 항상 도움 받고 있습니다. 다름이 아니라 현재 진행중인 프로젝트에서 모델을 학습하며 Validation 데이터셋에 대한 성능을 확인하는데, Validation 데이터셋의 shuffle을 했을 때와 안했을 때 성능에 유의미한 차이가 발생합니다. 무엇이 이유이며 Validation 및 Test Dataset은 항상 Shuffle=False로 설정해주어야 하는지 궁금합니다.
epoch를 돌리는 코드에서 loss = loss_func( y_minibatch, y_minibatch_pred) 했는데 다음과 같은 오류가 났습니다." 0D or 1D target tensor expected, multi-target not supported " 그래서 쥬피터의 원본대로 pred를 먼저하니까 정답이 나오더라구요. 구글링을 해본 결과 nn.CrossEntropyLoss()(pred, target) 계산된다고합니다. 질문1. 순서를 지켜야하는 이유가 있나요? 질문2. MSE와 BCE도 (pred, target) 순서를 지켜야하나요? 구글링을 해봤는데 정확하게 나오지는 않아서 여쭤보게 되었습니다. 감사합니다.
설명해주신대로면, min()을 사용하지 않아도 이미 clip()을 통해서 r()이 상항과 하한을 넘기면 a 혹은 b로 고정되고, 그 범위 안에 들어가면 r()이 그대로 나오는 것으로 생각됩니다. min()이 여기서 어떠한 역할을 하는지 궁금합니다. => 범위 안에 있을때 r(original) 과 r(clipped)가 달라지는 경우가 있나요?
안녕하세요, 강연자님의 자세하고 좋은 강의 잘 듣고 있습니다! 과적합 판단 방법 에 대해 몇 가지 질문 드리려고 합니다. 강의 복습 및 응용을 위해 5개의 Dense Layer로 구성된 DNN 실험을 진행해봤습니다. 데이터셋은 public하게 공개되어 있는 데이터를 사용했습니다. epoch 변화에 따른 정확도, 손실 함수 그래프를 그려봤는데, 첨부한 그래프들이 과적합에 해당하는지 잘 모르겠습니다. 그래서 제 그래프에서 과적합을 판단하는 기준 이 무엇이 될 수 있는지 궁금합니다. 저는 검증 loss가 학습 loss 보다 높을 때 과적합이라고 알고 있는데, 제가 복습을 위해서 진행해본 실험에서는 일단 그래프가 안 만나고 항상 검증 loss가 학습 loss보다 낮은데 이건 과적합이 아닌건지 궁금합니다. loss 그래프에서 학습 loss와 검증 loss가 교차되면서 검증 loss가 더 높아지는 경우에 학습을 조기 종료하는 것이 좋다고 생각하는데, 저희가 진행해본 실험에서는 그래프가 평행하게 나타납니다. 이런 경우에는 학습 및 검증 loss가 교차되지 않기 때문에 과적합이 아니라고 판단해도 되는지 , 실험을 조기 종료하지 않아도 되는지 궁금합니다. 아래의 그래프에서 validation loss와 validation accuracy가 V자로 나오는 구간 이 있습니다. 이런 경우에는 어떤 이유 때문에 나타나는 현상인지 궁금합니다. 과적합 판단 방법에는 말씀해주신 교차 검증을 이용한 판단, loss-epoch 그래프에서 validation loss값이 높아지는 부분으로 판단하는 것 외에 ‘ 편향-분산 트레이드오프 그래프 ’를 사용하는 방법도 있다고 알고 있습니다(가로축이 훈련세트크기입니다). 혹시 이 그래프는 강의에서 말씀해주신 그래프와 다른 것인지, 그리고 혹시 편향-분산 트레이드오프 그래프를 그리는 코드를 추천해주실 수 있을까요? 강의에서는 교차 검증으로 과적합을 판단할 수 있다고 하셨는데, 이를 실제로 어떻게 하는지 궁금합니다. 교차 검증의 결과로 나온 avg, accuracy 등의 값이 과적합을 판단하는데 사용이 되는건가요!? 관련해서 교차 검증을 사용해서 과적합을 판단하는 법 에 대한 보충 설명 해주시면 감사드리겠습니다! 좋은 하루 보내시길 바랍니다. 감사합니다!
강의 4:53 에 나오는 from_pretrained 함수에 관한 질문입니다. 공식 문서를 아무리 찾아봐도, 더 미궁 속으로 빠지는 듯한 느낌만 들어서(...) 질문 올립니다. from_pretrained 메소드는 huggingface에서 제공하는 그 어떠한 클래스에도 공통적으로 적용이 가능한 것인지 궁금합니다. 공식 문서에서 from_pretrained를 검색해본 결과, 각 검색 페이지마다 from_pretrained의 파라미터가 다르게 나오고, 그에 대한 설명조차도 찾을 수가 없었습니다... 예를 들어, FeatureExtractionMixin 의 from_pretrained 메소드의 파라미터는 9개인 반면, AutoTokenizer 의 from_pretrained 메소드의 파라미터는 13개 라고 서술되어 있는 경우를 볼 수 있었습니다. 또한, 강의에서 사용하였던 feature_extractor = ViTFeatureExtractor.from_pretrained("google/vit-base-patch16-224-in21k") feature_extractor 이 코드와, model = ViTForImageClassification.from_pretrained('google/vit-base-patch16-224-in21k', num_labels=10, # 10개의 클래스로 분류를 해야 함 id2label=id2label, label2id=label2id) 이 코드에서도 역시 from_pretrained 메소드가 사용되었는데, 공식 문서에서 ViTFeatureExtractor와 ViTForImageClassification을 아무리 찾아보아도 from_pretrained 메소드에 관한 설명은 볼 수가 없었으며, 각각의 경우에 적용되는 파라미터에 관한 내용 역시 찾아볼 수 없었습니다. 이런 경우, 다른 코드에 from_pretrained 메소드를 적용할 때에는 해당되는 내용을 어떻게 찾아야 하는 것인지 궁금합니다.
강의 8:30 부분에서 나오는 out = out[:, -1] 코드에 관한 질문입니다. 우선, 다음과 같이 예시를 작성해 보았습니다 이렇게 test_data를 만들고, 여기에 test_data[:, -1] 을 적용해 보았는데요, shape이 (3, 2, 4) 에서 (3, 4) 로 바뀌는 것은 확인하였지만, 이 코드가 '왜 사용되었는지' 에 관한 궁금증이 생겼습니다. 단지 shape을 맞춰주기 위해서 전체 데이터 중 일부를 slicing 하는 것이라면, view 메소드를 사용해서 shape을 맞춰주는 방법도 있을텐데요, 전체 데이터 중에서 일부를 slicing 하는 방식으로 이렇게 코드를 작성한 이유가 무엇인지 궁금합니다!
안녕하세요. 현재 코랩환경에서 파이토치 제공 Mask-RCNN을 활용하고 있습니다. 강의에서 알려주신 Hook를 활용하여 중간 레이어의 피쳐맵을 추출하고자 진행하던 과정에서 문제가 발생하여 질문드립니다ㅠㅠ 모델은 제가 가진 데이터셋에 맞춰 출력층을 바꾸어준 후에 학습을 완료한 상태입니다. 이후 for문을 통해 모델에 여러 입력 이미지들을 넣어주어 이미지별 중간 레이어의 피쳐맵을 얻으려고 하였으나, 출력결과 하나의 이미지에 대한 피쳐맵만 반복적으로 출력되는 문제가 발생합니다... 모델 학습 및 가중치 로드 후 코드는 다음과 같습니다. Hook 함수 def get_activation(name): def hook(models, input, output): activation[name] = output return hook 입력 이미지별 피쳐맵 저장 activation = {} device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") models.to(device) for i in range(1, 5): test_img = Image.open("입력 이미지 루프").convert('RGB') test_img = test_img.resize((800, 800)) test_img = tr.functional.to_tensor(test_img) test_img = test_img.reshape(1, 3, 800, 800) with torch.no_grad(): models.eval() models.backbone.fpn.extra_blocks.register_forward_hook(get_activation("fm{}".format(i))) test_img = test_img.to(device) models(test_img) 출력 결과 activation["fm1"] 부터 ["fm4"] 까지 동일한 값이 들어가 있음 아무리 찾아보고 여러 시도를 해보아도 해결이 되지않아 답답하네요ㅠㅠ 추가로 위의 코드를 한번 돌리면 런타임을 다시 시작하지 않는 이상 이후에 코드를 수정하여 hook 함수부터 다시 돌려도 적용이 되지 않는 문제도 발생합니다...