월 15,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
GPU 학습 파일 없음
GPU로 실행하려면 13_LSTM_STOCK_ADVANCE_GPU.ipynb 파일로 실행하라고 적혀 있는데, 강의 자료 다운로드 시 해당 파일이 없는 것 같아요
- 미해결처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
09.simple_actual_example_multi_label_calssification에서 loss함수에 대해서 질문이 있습니다.
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) 순서를 지켜야하나요? 구글링을 해봤는데 정확하게 나오지는 않아서 여쭤보게 되었습니다.감사합니다.
- 해결됨처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
from_pretrained 에 관한 질문입니다
강의 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 메소드를 적용할 때에는 해당되는 내용을 어떻게 찾아야 하는 것인지 궁금합니다.
- 미해결처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
out = out[:, -1] 코드에 관한 질문입니다
강의 8:30 부분에서 나오는out = out[:, -1] 코드에 관한 질문입니다. 우선, 다음과 같이 예시를 작성해 보았습니다이렇게 test_data를 만들고, 여기에 test_data[:, -1] 을 적용해 보았는데요,shape이 (3, 2, 4) 에서 (3, 4) 로 바뀌는 것은 확인하였지만, 이 코드가 '왜 사용되었는지' 에 관한 궁금증이 생겼습니다. 단지 shape을 맞춰주기 위해서 전체 데이터 중 일부를 slicing 하는 것이라면, view 메소드를 사용해서 shape을 맞춰주는 방법도 있을텐데요,전체 데이터 중에서 일부를 slicing 하는 방식으로 이렇게 코드를 작성한 이유가 무엇인지 궁금합니다!
- 해결됨처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
batch normalization과 standard scaler에 관한 질문입니다
안녕하세요, batch normalization과 standard scaler의 사용에 관해 질문드립니다! 우선, batch normalization은 학습 과정에서 각 배치 단위 별로 데이터가 다양한 분포를 가지더라도 각 배치별로 평균과 분산을 이용해 정규화하는 것을 뜻하고, 결국 평균 0, 분산 1로 데이터의 분포를 조정하는 과정으로 이해를 하였습니다. 또한, 이전에 학습하였던 standard scaler 역시 전처리 과정에서 평균 0, 분산 1로 데이터를 조정하는 역할을 한다고 이해하였는데요 batch normalization과 standard scaler의 작동 방식 자체가 조금 유사하게 느껴지는데, 이 둘은 각각 전처리 과정과 학습 과정에서 따로 사용되는 것으로 보면 되는 것인가요??
- 미해결처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
딥러닝 코드에 Batch Normalization 적용해보기 질문입니다
해당 강의 8:18 에서self.layers를 선언할 때, Layer(input_dim, 256. batch_norm, dropout),Layer(256, 256, batch_norm, dropout),Layer(256, 128, batch_norm, dropout),으로 계층들을 선언을 하는 과정에서,Layer들을 선언 했을 때, Layer 클래스 안에 있는 init 매소드만 실행이 되서 생성된 Layer 객체들 안에 self.layer에 값들이 할당이 된것인지.Layer 객체들에서 forward 매소드에서 필요한 인자 (x)를 할당받은 부분이 없기 때문에 DNNModel 클래스의 self.layers를 할당하는 과정에서는 Layer 객체들의 forward 매소드가 실행을 하지 않은 것인지 2가지 질문을 드립니다.
- 미해결처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
딥러닝으로 Regression 문제 적용해보기 (House Price Kaggle 문제) 질문입니다
해당 강의 11:25 에서standardScaler()를 X_train과 X_test에 적용을 시키는데 결과값인 y_train에는 결국 SalePrice를 구하기위해서 standardScaler()를 적용시키지 않는다고 이해를 했습니다. 여기서 질문이, 그럼 standardScaler()는 주로 input 데이터들(ex - X_train과 X_test 등) 에만 적용을 시키고 결과값(y_train 등)에는 적용을 잘 안시키나요?
- 미해결처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
Binary Classfication 딥러닝 적용해보기 질문입니다
Binary Classfication 딥러닝 적용해보기 강의 19:13초에서, y_pred_list.extend(y_test_pred.squeeze().detach().tolist())를 실행한뒤, y_pred_list = torch.tensor(y_pred_list).unsqueeze(1)을 실행하는데,y_pred_list의 size() 를 y_test_tensor의 size()와 맞추는거면predlist.extend(y_test_pred.detach().tolist())를 실행한뒤, y_pred_list = torch.tensor(y_pred_list)) 을 실행해도 같은 건가요?
- 미해결처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
torch.armax에 관한 질문입니다
Multi-Class Classification 딥러닝 적용해보기 강의 8:40 부분에서 사용된torch.argmax(x, dim=차원) 에 관한 질문입니다. torch.argmax 함수의 자세한 실행 방식이 궁금해서 pytorch 공식 문서 등을 찾아보았는데요,'dim' 파라미터에 관한 설명이 다음과 같이 나와 있었습니다.dim (int) – the dimension to reduce. If None, the argmax of the flattened input is returned. 여기서 "the dimension to reduce" 라는 표현이 정확히 무엇을 의미하는지 궁금합니다.
- 미해결처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
output_dim 에 관한 질문입니다
Multi-Class Classification 딥러닝 적용해보기 강의 5:26 부분에서0, 1, 2 Multi-Label 에 대한 확률값을 구해야 하므로, output_dim은 3이 되어야 한다고 설명해 주셨습니다반면, Binary Classification 강의에서는 0, 1 Label 에 대한 확률값을 구하면서 output_dim을 1로 설정을 하였는데요,Binary Classification 예제는확률값이 0에 가까우면 phishing, 1에 가까우면 legitimate로 분류되므로 그냥 확률값만을 담고 있는 1차원의 열벡터만 필요한 것이고,Multi-Class Classification 예제는3가지 feature에 대한 확률값이 각각 담겨야 하므로 output_dim을 3으로 설정한 것으로 이해하면 되나요??
- 미해결처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
Prepare dataset 부분에서 코드 오류가 납니다 ㅠㅠ
첨부해주신 코드를 복사 붙여넣기 했는데, 오류가 나네요.. ㅠㅠ오류명은 : ---> 21 class CustomDataset(Dataset): 22 def init(self, file_list, transform=None): 23 self.file_list = file_listTypeError: str() argument 'encoding' must be str, not tupledataset_train = CustomDataset(train_list, transform=transforms_for_train) dataset_valid = CustomDataset(val_list, transform=transforms_for_val_test) dataset_test = CustomDataset(test_list, transform=transforms_for_val_test)CustomDataset 클래스를 통해, train, valid, test를 만들어주는 과정에서, str() arguments를 받아야 한다는 것 같은데.. 왜 오류가 나는지 잘 모르겠습니다.from torchvision import transforms input_size = 224 transforms_for_train = transforms.Compose([ transforms.RandomResizedCrop(input_size, scale=(0.5, 1.0)), transforms.RandomHorizontalFlip(), transforms.RandomVerticalFlip(), transforms.RandomRotation(10), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) transforms_for_val_test = transforms.Compose([ transforms.Resize(input_size), transforms.CenterCrop(input_size), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) #class Dataset class CustomDataset(Dataset): def __init__(self, file_list, transform=None): self.file_list = file_list self.transform = transform def __len__(self): return len(self.file_list) def __getitem__(self, idx): img_path = self.file_list[idx] if img_path.split('/')[-1][-3:] == 'jpg': img = Image.open(img_path) if self.transform is not None: img_transform = self.transform(img) label = img_path.split('/')[-1].split('.')[0] if label == 'dog': label = 1 elif label == 'cat': label = 0 return img_transform, label dataset_train = CustomDataset(train_list, transform=transforms_for_train) dataset_valid = CustomDataset(val_list, transform=transforms_for_val_test) dataset_test = CustomDataset(test_list, transform=transforms_for_val_test) # from torch.utils.data import DataLoader # 데이터 로더 클래스 # # train_batches = DataLoader(dataset=dataset_train, batch_size=8, shuffle=True) # val_batches = DataLoader(dataset=dataset_valid, batch_size=8, shuffle=False) # test_batches = DataLoader(dataset=dataset_test, batch_size=8, shuffle=False)강의 내용과 같이 len(train_list), len(val_list)가 잘 출력이 됨을 볼 수 있고, Reference 항목에서 특정 img의 사이즈를 출력해볼 떄도, (500, 374) 라고 잘 출력됨을 알 수 있었습니다.train할 데이터와 test 데이터는 강의 중에 배운 os 명령어 및 with zip 명령어를 사용해서<오류 화면 입니다.>전체 작성한 코드 첨부드립니다.import zipfile Dataset = 'dogs-vs-cats-redux-kernels-edition' with zipfile.ZipFile('../BecomeProfessional/' + Dataset + ".zip", "r") as z: z.extractall(".")import pandas as pd import numpy as np import warnings warnings.filterwarnings('ignore') from PIL import Image import torch import torch.nn as nn from torch.utils.data import DataLoader, Subset from torchvision import datasets, transforms from sklearn.model_selection import train_test_split from copy import deepcopy import matplotlib.pyplot as plt import os, shutilimport random import os #device 설정 device = 'cuda' if torch.cuda.is_available() else 'cpu' print(device) seed = 42 # seed값 설정 random.seed(seed) # 파이썬 난수 생성기 os.environ['PYTHONHASHSEED'] = str(seed) # 해시 시크릿값 고정 np.random.seed(seed) # 넘파이 난수 생성기 torch.manual_seed(seed) # 파이토치 CPU 난수 생성기 torch.backends.cudnn.deterministic = True # 확정적 연산 사용 설정 torch.backends.cudnn.benchmark = False # 벤치마크 기능 사용 해제 torch.backends.cudnn.enabled = False # cudnn 기능 사용 해제 if device == 'cuda': torch.cuda.manual_seed(seed) torch.cuda.manual_seed_all(seed)original_data_path = './Dog_Cat/' os.makedirs('dogsvscats', exist_ok=True) import zipfile with zipfile.ZipFile(os.path.join(original_data_path, 'train.zip')) as train_zip: train_zip.extractall('./Dog_Cat/dogsvscats') with zipfile.ZipFile(os.path.join(original_data_path, 'test.zip')) as test_zip: test_zip.extractall('./Dog_Cat/dogsvscats')import glob print(glob.glob('./Dog_Cat/dogsvscats/train/*'))출력: ./Dog_Cat/dogsvscats/train\\cat.11346.jpg', './Dog_Cat/dogsvscats/train\\cat.11347.jpg', './Dog_Cat/dogsvscats/train\\cat.11348.jpg', './Dog_Cat/dogsvscats/train\\cat.11349.jpg', ' .... (엄청 많이 출력됩니다)train_dir = './Dog_Cat/dogsvscats/train' test_dir = './Dog_Cat/dogsvscats/test' all_train_files = glob.glob(os.path.join(train_dir, '*.jpg')) test_list = glob.glob(os.path.join(test_dir, '*.jpg')) train_labels = [path.split('/')[-1].split('.')[0] for path in all_train_files] train_list, val_list = train_test_split(all_train_files, test_size=0.1, stratify=train_labels, random_state=seed) print(len(train_list), len(val_list))출력: 22500 2500train_list[0]출력: './Dog_Cat/dogsvscats/train\\cat.4814.jpg'img = Image.open('./Dog_Cat/dogsvscats/train/cat.4814.jpg') img.size출력: (500, 374)import IPython image1 = IPython.display.Image(filename='./Dog_Cat/dogsvscats/train/cat.4814.jpg') display(image1)from torchvision import transforms input_size = 224 transforms_for_train = transforms.Compose([ transforms.RandomResizedCrop(input_size, scale=(0.5, 1.0)), transforms.RandomHorizontalFlip(), transforms.RandomVerticalFlip(), transforms.RandomRotation(10), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) transforms_for_val_test = transforms.Compose([ transforms.Resize(input_size), transforms.CenterCrop(input_size), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) #class Dataset class CustomDataset(Dataset): def __init__(self, file_list, transform=None): self.file_list = file_list self.transform = transform def __len__(self): return len(self.file_list) def __getitem__(self, idx): img_path = self.file_list[idx] if img_path.split('/')[-1][-3:] == 'jpg': img = Image.open(img_path) if self.transform is not None: img_transform = self.transform(img) label = img_path.split('/')[-1].split('.')[0] if label == 'dog': label = 1 elif label == 'cat': label = 0 return img_transform, label dataset_train = CustomDataset(train_list, transform=transforms_for_train) dataset_valid = CustomDataset(val_list, transform=transforms_for_val_test) dataset_test = CustomDataset(test_list, transform=transforms_for_val_test)오류 발생
- 미해결처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
optimizer.zero_grad()에 관한 질문입니다
"파이토치로 딥러닝 구현 패턴 이해하기" 강의 7:56 부분에서,optimizer.zero_grad()는 기존의 연산을 끊어주는 역할을 하고, 이는 강의에서 전에 작성했던 W.detach_().requires_grad_(True) b.detach_().requires_grad_(True)이 코드와 같은 역할을 한다고 설명해 주셨습니다. 설명을 듣고, pytorch 공식 문서 등에서 관련된 내용들을 찾아보니"detach는 계산된 값과 동일한 저장 공간을 사용하지만, 계산 기록은 없는 tensor를 반환하여 tensor를 과거 계산 기록으로부터 떼어내는 역할을 한다"라는 설명을 찾을 수 있었습니다. 그렇다면, 모델 파라미터의 미분값을 0으로 초기화하는 optimizer.zero_grad()는 W.detach_().requires_grad_(True)이 코드와 엄밀히 따지자면 조금 다른 동작을 하는 것으로 이해하였는데요,'기존의 연산을 끊어준다' 라는 측면에서 조금 동작에 차이가 있다고 보는 것이 맞는지 설명 듣고 싶습니다!감사합니다
- 해결됨처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
Pooling layer 사용하는 이유가 궁금합니다. (CNN 이론 부분이에요)
먼저 질문을 드린 이유는 CNN의 이미지 특징을 추출하는 과정에서 쓰이는, Convolution layer와 Pooling layer의 기능이 동일하고, Padding을 쓰는 이유에 대한 궁금증이 들었기 때문입니다.CNN 이론 강의 내용에서, CNN의 구조는 크게 (1)이미지 특징을 추출하는 부분과 (2)클래스를 분류하는 부분이 있다고 배웠습니다.(2)의 경우는 특징을 추출하고 난 뒤에 softmax나 , logsoftmax activation function을 통해, 분류하는 것이기 때문에, CNN 앞 시간에서 배웠던 1차원 형태의 데이터 처리하는 방법과 유사하다고 하셨습니다.Convolution layer는 filter(kenel)이 창문 닦듯이(알고리즘으로 보면 슬라이딩 윈도우 느낌으로) 슥슥 움직이면서 Feature Map(특성 맵)을 추출하는데, 이 부분은 칼라이미지나 흑백이미지의 경우 기존의 1차원 형태의 데이터로 바로 만들어주는 과정에 비해, 공간적/지역적 정보를 유지할 수 있으며, 특정 부분을 추출할 수 있기 때문에 해당 이미지의 특징을 확인할 수 있는 장점을 가집니다. 하지만 영상에서 설명하셨듯이, filter가 적용되면서 중복되는 부분이 발생해서 계산양이 많아지고, 무엇보다 5x5이미지의 경우 3x3필터를 사용했을 때 3x3 크기가 되기 때문에 데이터가 소실되는 문제가 발생한다고 하셨습니다. 따라서, 이를 해결하기 위해, Zero padding을 적용하여, 이미지 가장자리를 0으로 감싸줌으로써 3x3필터를 사용하더라도, 5x5의 원본 이미지의 크기가 3x3 크기가 아닌 5x5로 보존되기 때문에, 데이터 소실을 방지할 수 있다고 들었습니다.Q1:그래서 여기 까지 들었을 때, 특징을 잘 추출하기 위해 커널의 크기를 작게 했을 때, 원본 크기에 비해, output이 작아질 수도 있으니까 zero padding을 쓰는 것이 중요하구나... 하는 생각과 zero padding을 통해 원본 크기를 보존하는 것이 중요하구나 라고 생각했습니다. 혹시 맞을 까요? 그리고 나서, Pooling 설명을 들었는데, Pooling layer는 convolution layer에서 얻어진 output에서 특징을 뽑아 내는 과정이기 때문에, 얻어진 feature map의 사이즈가 줄어드는 현상이 발생하는데, 특징을 뽑아내는 것도 이해는 가지만, 데이터가 소실되는 문제가 발생할 수 있지 않을까...? 하는 생각이 들었습니다.CNN의 구조가 Convolution layer와 pooling layer가 같이 순서쌍으로 동작하기 때문에, 각각의 기능에 대해서 특징을 추출하는 과정이다는 부분에는 이해는 갔지만, padding의 기능때문에, 특징 맵의 크기를 보존하는 것이 원래 input가 비슷하게 보존하는 것이 좋은건지, 줄여나가는 건지 헷갈립니다.
- 해결됨처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
10_ADVANCE_EXAMPLE-에서 MNIST 함수 작성할 때 index_error가 나타납니다 ㅠㅠ
항상 강의들으면서, 따라치면서, 여러번 반복해서 익히려고 하고 있습니다. 지금까지 별 문제 없이 쏙쏙 이해가 잘 가서, 지금까지 질문을 드리지 않았는데요.. 함수를 작성하는 부분에서 자꾸 인덱스 에러가 나타나서, 제가 어느 부분을 잘못 쓴 건지 모르겠습니다. 선생님께서 작성하신 코드를 그대로 복사해서 넣었는데도 index error가 호출되어서 왜 그런지 모르겠습니다...
- 미해결처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
지금까지 익힌 이론과 미니배치까지 적용된 딥러닝 코드 구현 질문입니다
해당 강의 14분 09초 쯤에 질문 입니다!y_mibibatch_pred = model(x_minibatch)에서 model에 x_minibatch가 들어가는데, 위에서 Sequential로 선언한 model의 input_dim은 10이고 x_minibatch은 크기가 torch.Size([256, 10])입니다. 코드가 내부적으로 알아서 torch.Size([10]) 으로 맞출 필요 없이, torch.Size([256, 10]) 중에서 10만 input으로 들어가게 동작하는 것인가요?
- 미해결처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
순서가 있는 데이터를 위한 딥러닝 기본 - RNN 핵심 이해 질문입니다
RNN 이 순서를 가지는 데이터를 처리하는데 적합한 신경망이라고 했는데 그럼회귀(Regression) 문제를 푸는데 적합하다고 이해를 해도 되나요?
- 미해결처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
이미지 전처리 과정에서 질문 좀 드리고 싶습니다.
dogsvscat kaggle 문제에서 아래 코드를 참조하고 있는데 만약 위 코드에서 개와 고양이 뿐만 아니라 3종류 이상의 동물을 이미지 전처리해야 할땐 어떻게 해야 될지 여쭤봅니다....저는 저 label 부분을 각 클래스 동물 마다 0,1,2,3,4 이렇게 연속해서 넣었는데 정확도가 많이 떨어집니다.
- 미해결처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
주피터노트 파일에서 이미지 빠진것 두개 있습니다.
04_UNDERSTANDING_BUILD_NEURAL_NETWORK.ipynb13_LSTM_MNIST.ipynb두개 강의노트 이미지가 다운로드 받는 파일에는 없습니다. (00_IMGS 폴더가 없습니다.)이미지 추가 요청 드립니다.
- 미해결처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
Multi-Class Classfication 딥러닝 적용해보기 (IRIS 분류 문제) - 미니배치 기반 예측 코드 질문
강사님께서 코드를 보면서 '전체 데이터를 가지고 예측을 했기 때문에 굳이 미니배치 기반으로 예측을 안해도 된다' 고 언급하신 부분이 이해가 잘 가지 않습니다.(9분 ~ 9분 20초 경)저희가 훈련 데이터로 모델을 학습할 때 미니배치 기준으로 학습을 했으니까 예측을 할 때에도 미니배치 기준으로 해야하지 않나요? 강의 내에서 아래 코드를 굳이 안해도 된다고 언급09_SIMPLE_ACTUAL_EXAMPLE_MULTI-LABEL_CLASSIFICATION.ipynby_pred_list = list() x_test_batch_list = X_test_tensor.split(minibatch_size, 0) model.eval() with torch.no_grad(): for x_minibatch in x_test_batch_list: y_test_pred = model(x_minibatch) y_test_pred = torch.argmax(y_test_pred, dim=1) y_pred_list.extend(y_test_pred.detach().tolist()) y_pred_list = torch.tensor(y_pred_list)
- 미해결처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 [데이터과학 Part3]
질문 드립니다 - 딥러닝 구현에 optimizer 추가하기 부분 -> detach 메서드
threshold = 0.1 learning_rate = 0.1 iteration_num = 0 # loss를 이용해서 gradient descent update # loss 가 threshold 밑으로 내려가면 loop 중지 while loss > threshold: iteration_num += 1 # 갱신된 미분값을 이용해서 W와 b 업데이트 W = W - learning_rate * W.grad b = b - learning_rate * b.grad print (iteration_num, loss, z, y) # detach_() : 텐서를 기존 방향성 비순환 그래프(DAG; Directed Acyclic Graph)로부터 끊음 # .requires_grad_(True) : 연결된 Tensor 로부터의 계산된 자동미분 값을, 다시 현 텐서부터 시작하도록 만듬 # 기존 그래프에서 끊어낸 후 기억한 자동 미분값을 이용해서 현 텐서부터 갱신할 수 있게 함 # 미분을 계산한 이후 DAG로 부터 왜 detach를 한 후 requires_grad를 다시 해야하는지..? 정확히 이해가 잘 안감 W.detach_().requires_grad_(True) b.detach_().requires_grad_(True) # 갱신된 미분값을 이용해서 예측값과 loss 값 갱신 => 갱신된 loss를 이용해서 미분값 다시 계산 z = torch.matmul(x, W) + b loss = F.mse_loss(z, y) loss.backward() print (iteration_num + 1, loss, z, y)detach 메소드가 깊은 복사 시 신경망으로부터 텐서를 분리하는 것은 이해가 갑니다..! W.detach_().requires_grad_(True) b.detach_().requires_grad_(True)미분을 계산한 이후 DAG로 부터 왜 detach를 한 후 requires_grad를 다시 해야하는지..?처음에 require_grad가 되어 있으니매번 미분 값 계산할 때마다 grad가 갱신되기 때문에굳이 detach로 분리를 해야하는지해당 부분이 이해가 잘 안갑니다. -> 강사님의 다음 강의를 듣고 이해했는데제가 이해한 것이 맞는지 확인받고 싶습니다매 iteration마다 loss에 대한 각각 은닉층 노드들에 대한 가중치를 계산해주는데detach를 안하면 전의 기울기 계산한 기록에 새로운 iteration 계산분이 누적된다.즉 미분 식이 누적되서 해당 iteration 값이 아닌 과거 iteration 미분식까지 가져와서 다른 미분값이 산출되어버림매 iteration마다 기울기 계산 값이 누적되지 않도록 detach를 통해 끊어내 주는 것