ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 with as문을 통한 자동 open/colse
    프로그래밍/파이썬 기초 2022. 10. 31. 10:53
    반응형

    1. with as문이란?

    파이썬 코딩을 하다보면 생성한 객체를 다 사용하였으면 종료해주어야하는 경우들이 있다.

    대표적인예로 file이 있으며 AI분야에서는 Tensorflow.GradientTape이 있다.

    그러나 코드를 작성하다보면 일일히 해당 객체들을 종료해주는 것은 귀찮기도 하며 종종 잊기도 한다.

    따라서 파이썬에서는 with as라는 문법을 제공하여 해당 구문이 끝나면 자동으로 종료해주는 기능을 제공하고 있다.

     

    2. 활용

    2.1 file open/close

    기존의 file open/close 방식

    # 파일을 쓰기 모드로 생성
    f = open("0_test.txt","w")
    
    # 파일에 문장 삽입
    f.write('hello')
    f.write('world')
    
    # 파일 객체 종료
    f.close()

    with as문을 활용한 file open/close

    # 파일을 쓰기 모드로 생성
    with open("0_test.txt","w") as f:
        # 파일에 문장 삽입
        f.write('hello')
        f.write('world')

    2.2 Tensorflow.GradientTape

    ML/DL에서는 역전파(Backpropagation)라는 개념이 등장한다.

    입력 데이터가 여러개의 히든 레이어를 거치면서 예측값이 출력되는데,

    실제 정답값과 예측값간의 차이를 통해서 히든 레이어들의 가중치를 수정하는 행위를 역전파라고 한다.

    이때, 이 역전파를 하기 위해서는 입력된 데이터가 각 히든레이어들에서 사용된 식과 계산결과에 대한 기록들이 필요하다.

    이러한 과정들을 기록하기 위해서 Tensorflow에서는 Tensorflow.GradientTape을 제공한다.

     

    # VAE의 train 함수 중 일부
    # tf.GradientTape()를 설명하는것이기에 기타 코드에 대한 주석 미포함
    
    def train_step_condition(inputs, label):
        # GradientTape: to get gradient values
        with tf.GradientTape() as tape:
    
            # 학습이 진행되는 과정이 모두  tf.GradientTape()에 자동적으로 기록됨
            mu, logvar = condition_encoder(inputs, label) 
            z = sample(mu, logvar)
            x_recon = condition_decoder(z, label)
            reconstruction_error = tf.reduce_sum(tf.losses.binary_crossentropy(inputs, x_recon))
            kl = 0.5 * tf.reduce_sum(tf.exp(logvar) + tf.square(mu) - 1. - logvar)
            loss = (kl + reconstruction_error) / inputs.shape[0]
            vars_ = condition_encoder.trainable_variables + condition_decoder.trainable_variables 
            
            # tape.gradient(loss, vars_)에서 앞서 기록한 정보들을 기반으로 역전파 수행
            grads_ = tape.gradient(loss, vars_) 
            # gradient descent적용(모델을 업데이트함)
            optimizer.apply_gradients(zip(grads_, vars_)) 
    
        return loss, reconstruction_error, kl

     

    이 과정에 대한 자세한 내용은 아래의 링크에서 자세히 설명되어 있다. 

    https://rfriend.tistory.com/556

    R, Python 분석과 프로그래밍의 친구 (by R Friend) 블로그 포스팅 : https://rfriend.tistory.com/556

     

     

    참고문헌

    https://rfriend.tistory.com/556

     

    반응형

    댓글

Designed by Tistory.