딥러닝 정리 2 - 전체적인 딥러닝 흐름

novice developer·2024년 2월 29일

Saltlux

목록 보기
22/22

예습 - CNN(Convolutional neural network) 주로 이미지나 영상데이터를 처리할 때 쓰임
트랜스포머가 목표 자연어랑 딥러닝 같이 하는걸로 변경
19일부터 모델 얹이는 거 연습 복습철저히 할것
20일부터 프로젝트

회귀는 시그모이드
다중분류는 소프트맥스

  1. 데이터 불러오기
    1-1 csv 불러오기, 타겟 분리 !!! 주의 !! 반.드.시 값으로 줘야해요 dataframe형태로는 텐서안됨
    x_data = df.drop('house price of unit area', axis=1).values
    y_data = df['house price of unit area'].values.reshape(-1, 1)
    1-2 # PyTorch Tensors로 변환
    x_data = torch.tensor(x_data, dtype=torch.float32)
    y_data = torch.tensor(y_data, dtype=torch.float32)
    1-3 # 데이터 분할
    X_train1, X_test, Y_train1, Y_test = train_test_split(x_data, y_data, test_size=0.3, shuffle=True)
    X_train, X_valid, Y_train, Y_valid = train_test_split(X_train1, Y_train1, test_size=0.3, shuffle=True)
    1-4 만든 분할을 텐서화
    train_dataset = TensorDataset(X_train, Y_train)
    valid_dataset = TensorDataset(X_valid, Y_valid)
    test_dataset = TensorDataset(X_test, Y_test)
    1-5 DataLoader 생성 # train_loader 만 셔플 why? 학습해야함 나머진 False
    train_loader = DataLoader(train_dataset, batch_size=100, shuffle=True)
    valid_loader = DataLoader(valid_dataset, batch_size=100, shuffle=False)
    test_loader = DataLoader(test_dataset, batch_size=len(test_dataset), shuffle=False) # 배치사이즈 test만큼이다!!
  2. model 정의

    모델 정의

class RegressionModel(nn.Module):
    def __init__(self):
        super(RegressionModel, self).__init__()
        self.layer1 = nn.Linear(5, 120)
        self.layer2 = nn.Linear(120, 100)
        self.layer3 = nn.Linear(100, 100)
        self.out_layer = nn.Linear(100, 1)

    def forward(self, x):
        x = torch.sigmoid(self.layer1(x))
        x = torch.sigmoid(self.layer2(x))
        x = torch.sigmoid(self.layer3(x))
        x = self.out_layer(x)
        return x

    2-1 모델 호출
       model = RegressionModel()

3.학습 방식 설정 : loss & optimizer 정의
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.00001)

4.모델 학습
4-1 모델 값 저장 및 에폭시 지정
num_epochs = 800
train_losses = []
valid_losses = []
4-2 모델학습
for epoch in range(num_epochs):

model.train()     # 모델을 훈련 모드로 설정
for inputs, targets in train_loader: # inputs 검증데이터의 입력을. # targets는 해당 레이블을 나타냄
    optimizer.zero_grad() # 1. 기울기 누적을 피해 0으로 설정
    outputs = model(inputs) # 순전파 시작
    loss = criterion(outputs, targets) # 예측된 출력과 실제 타겟간의 손실 계산
    loss.backward() # 역전파로 모델 기울기 계산
    optimizer.step() # 옵티마이저로 파라미터 업데이트

# Validation loss
# 모델 학습 끔 왜? 모델을 훈련할때는 기울기 추척이 필요하지만 
# 평가할땐 필요가 없다!
model.eval() 
with torch.no_grad():
    # 검증에서 가져온 각 배치에 대한 총 검증 손실 계산
    valid_loss = sum(criterion(model(inputs), targets) for inputs, targets in valid_loader)
# 200번의 에포크 마다 훈련 손실을 출력
if (epoch+1) % 200 == 0:
    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

# 분석이나 플로팅을 위해 훈련 및 검증 손실 저장
train_losses.append(loss.item())  # .item()메서드로 해당 스칼라 가져오기
valid_losses.append(valid_loss.item())

5.모델 평가
테스트 데이터로 모델 평가
model.eval()
with torch.no_grad():
for inputs, targets in test_loader:
outputs = model(inputs) # 순전파
test_loss = criterion(outputs, targets)

    print("\n Test RMSE: %.4f" % torch.sqrt(test_loss).item())

모르는 키워드
broadcasting 이란? 행렬의 생김세가 달라도 연산 가능하게 해주는 것(자동으로 맞춰줌)
필수조건 : 둘중하나는 반드시 스칼라여야 함

profile
초보개발자

0개의 댓글