부스트 캠프 ai tech 1주 2일차 Python Basic for AI (5)


9. 데이터 구조

  • Stack & Queue
  • Tuple & Set
  • Dictionary
  • Collection

9.1 Stack & Queue

  • Stack
    • 나중에 넣은 데이터를 먼저 반환하도록 설계된 데이터 구조
    • LIFO (Last in First Out)
    • 입력을 Push, 출력을 Pop이라고 한다
    • python의 list는 기본적으로 Stack의 구조를 가진다
  • Queue
    • 먼저 넣은 데이터가 먼저 반환하도록 설계된 데이터 구조
    • FIFO (First in First Out)
    • 입력은 Push, 출력은 get 이라고 한다
    • 보통 python의 Dequeue를 사용한다.
  • 정해진 크기를 넘어갈 경우 overflow, element가 없는데 반환을 시킬경우 underflow라고 한다.

9.2 Tuple & Set

  • Tuple
    • 값의 변경이 불가능한 리스트
    • index로 접근해서 값을 수정하는것을 막는다
    • 정의 할 때 ( )를 사용한다
    • 리스트와 동일하게 (+, *)연산, Indexing, Slicing을 사용한다
    • 사용자의 실수에 의한 에러를 사전에 방지하기 위해 변경할 필요가 없는 데이터를 저장할 때 사용한다
1
2
3
t = (1, ) # 값이 1개인 Tuple은 반드시 ,를 붙여야 함
t + t # (1, 1)
t[0] = 2 # Error 발생함
  • Set
    • 값을 순서없이 저장, 중복을 허용하지 않는 자료형(확인필요)
    • set( )을 통하여 객체를 생성한다
    • set을 이용하여 다양한 집합연산이 가능하다
      1
      2
      3
      4
      5
      6
      7
      8
      s1 = set([1, 2, 3, 4, 5])
      s2 = set([1, 3, 5, 7, 9])
      s1.union(s2) # (1, 2, 3, 4, 5, 7, 9) 합집합
      s1 | s2 # (1, 2, 3, 4, 5, 7, 9) 합집합
      s1.intersection(s2) # (1, 3, 5) 교집합
      s1 & s2 # (1, 3, 5) 교집합
      s1.difference(s2) # (2, 4) 차집합
      s1 - s2 # (2, 4) 차집합

9.3 Dictionary

  • 데이터를 저장 할 때 구분지을수 있는 값(Key)를 함께 저장
  • Hash 구조
  • Key값을 활용하여 Value를 관리한다.
  • dict( )나 { }로 객체를 생성한다
1
2
3
4
5
6
7
8
9
10
number_dic = {'one': 1, 'two': 2, 'three': 3}
number_dic['one'] # 1, Key 값으로 value 출력 가능
country_code.items() # 데이터 출력
# dict_items([('one', 1), ('two', 2), ('three', 3)])
number_dic.keys() # key만 출력
# dict_keys(['one', 'two', 'three'])
number_dic.values() # value만 출력
# dict_values([1, 2, 3])
number_dic.get(1) # None, 아닐경우 None
number_dic.get('one') # 1, key가 존재할 경우 values 값을 return

9.4 Collections

  • Python Built-in 확장 모듈

  • 편의성, 실행 효율 등을 사용자에게 제공함

  • 자주 사용되는 deque, difaultdict, Counter에 대해서만 다룰것이다

  • deque

    • Stack과 Queue의 기능을 모두 지원하는 데이터 구조
    • List에 비해 효율적인 저장방식을 지원한다
      • popleft()등 삽입 삭제에 매우 효율적임
    • Linked List의 특성(rotate, reverse)을 지원한다
    • 기존 list 형태의 함수를 모두 지원함
      1
      2
      3
      4
      5
      from collections import deque
      q = deque()
      q.append(a) # [a]
      q.appendleft(b) # [b, a]
      q.popleft() # [a]
  • defaultdict

    • Dict type값에 기본값을 지정해서 key가 존재하지 않아도 기본값으로 찾아지는 기능을 가지고 있다
    • defaultdict(datatype) 으로 기본값의 자료형을 정하면서 dict객체를 생성할 수 있다
      1
      2
      3
      4
      from collections import defaultdict
      dic = defaultdict(int)
      dic['a'] += 1 # {'a': 1}
      dic['b'] -= 1 # {'a': 1, 'b': -1}
  • Counter

    • 시퀸스 type의 data element들의 갯수를 dict형태로 변환
      1
      2
      3
      from collections import Counter
      c = Counter([1, 3, 5, 3, 2, 4, 3])
      # Counter({1: 1, 3: 3, 5: 1, 2: 1, 4: 1})

부스트 캠프 ai tech 1주 2일차 Python Basic for AI (4)


8. 문자열(string)

  • char들이 저장되어있는 시퀸스 자료형
  • 기본적으로 list와 같은 형태로 데이터를 처리한다
    • Indexing, Slicing, +, * 연산은 리스트와 동일하게 수행한다

8.1 자주 사용하는 문자열 함수

함수명 기능
len(a) 문자열의 문자 개수를 반환
a.upper() 대문자로 변환
a.lower() 소문자로 변환
a.capitalize() 첫 문자를 대문자로 변환
a.strip(input)
a.rstrip(input)
a.lstrip(input)
좌우/우/좌 input을 없앰
a.split(input) input 기준으로 문자열을 나눠서 리스트로 반환
a.isdigit()
a.islower()
a.isupper()
문자열이 숫자/소문자/대문자인지 여부 반환
a.startswith(input)
a.endswith(input)
문자열이 input으로 시작/끝 나는 문자열 여부 반환
str.join(list) list의 원소들을 str로 연결해서 하나의 문자열로 나타낸다
단 list의 원소는 모두 문자열 type 이어야 한다

8.2 다양한표현

  • \ (백슬래쉬) : 특수하게 사용하는 문자열을 표현하기위해서 사용한다
    • 백슬래쉬를 표현하기 위해서는 \\ 두번 사용하면 된다.
  • \n : 줄바꿈을 의미하는 특수문자
  • \t : TAB
  • “””문자열””” : 줄바꿈도 자유롭게 입력 가능한 문자열 표현
  • r”문자열” : 특수문자를 무시하고 그대로 출력함
    1
    2
    print(r'이건 줄바꿈 기호입니다 \n')
    # output : 이건 줄바꿈 기호입니다 \n

부스트 캠프 ai tech 1주 2일차 Python Basic for AI (3)


6. Condition (조건문)

  • 조건에 따라 특정한 동작을 하게 하는 명령어
  • python 에서는 if, elif, else의 예약어를 사용한다
  • 조건을 나타내는 기준과 실행해야하는 명령으로 구성된다
  • 조건이 참일때만 실행한다
    1
    2
    3
    4
    5
    6
    7
    8
    if age <= 13:
    print('초등학생')
    elif age <= 16:
    print('중학생')
    elif age <= 19:
    print('고등학생')
    else:
    print('성인')
비교연산자 설명
x < y x가 y보다 작은지 검사
x > y x가 y보다 큰지 검사
x == y x와 y가 같은값인지 검사
x is y x와 y의 메모리 주소가 같은지 검사
x != y x와 y가 같은값인지 검사
x is not y x와 y의 메모리 주소가 같은지 검사
x >= y x가 y이상인지 검사
x <= y x가 y이하인지 검사
  • c언어에서는 0은 False, 1은 True를 나타내지만, python에서는 성립하지 않는다
  • 존재하면 참, 없으면 거짓으로 판단한다
  • and, or, not 논리키워드와도 같이 사용한다
    1
    2
    3
    if 1 # True
    if 0 # True
    if None # False

6.1 삼항연산자(Ternary operators)

  • 참과 거짓만 존재하는 결과를 한줄에 표현 할 수 있다.
    1
    2
    a = 1
    print('number' if isinstance(a, int) else 'not number')

    isinstance(var, datatype) -> boolean

    데이터의 타입을 판단하는 함수

7. 반복문

  • 정해진 동작을 반복적으로 수행하게 하는 명령문
  • for, while 명령 키워드가 존재한다

7.1 for 문

  • iterable 한 object의 원소의 갯수 만큼 반복시켜주는 반복문
  • range, enumerate등과 연계하여 사용이 가능하다
    1
    2
    3
    4
    5
    6
    for i in range(1, 10, 2):
    print(i) # 1, 3 ... 7 ,9
    for i in range(10, 1, -1):
    print(i) # 10, 9, ... , 2, 1
    for i, x in enumerate('apple'):
    print(i, x) # 0 a, 1 p, ... , 4 e

7.2 while 문

  • 조건을 만족하는 동안 반복적으로 명령을 수행한다
    1
    2
    3
    4
    5
    i = 0
    while i < 5:
    print(i)
    i += 1
    # output 0, 1, 2, 3, 4

7.3 반복문 제어

  • break : 특정 조건에서 가장 가까운 반복문을 종료한다
  • continue : 특정 조건에서 남은 명령을 skip 하고 다음 루프로 넘어간다
  • else : 반복조건이 만족하지 않은경우 반복 종료시 1회 수행한다.
    • break로 반복문에서 탈출할 경우에는 수행하지 않음

Week1 - Day 1&2 Review


오늘 하루 한 것

  • Day1
    • 팀원들과 아이스 브레이킹
    • 강의 듣기 (python 2-4까지)
    • 노션 회고록 Template 만들기
    • 과제
      • Basic Math
      • Text Processing 1
      • Text Processing 2
  • Day2
    • 강의듣기
      • python 강의 완료
      • Ai Math 경사하강법까지 완료
    • 과제
      • Gradient Descent 하는 중
      • 기본퀴즈 1~5강
    • python 3-2강 까지 정리

피어세션에서 한것

  • Day1
    • 피어세션 그라운드 룰 만들기
  • Day2
    • python 메모리 관리에 대한 질문
    • 구조체 메모리 점유에 대한 질문

내일 할것

  • 심화과제 끝내기
  • 과제과정, 결과 + 정규식에 대해서 정리해보자

느낀점

  • 어떻게 해야 남이보기 쉽게 설명할수 있을까? 정리하는데 시간이 오래걸린다.
  • 1일차 한 내용이 많아서 하루만에 정리하기 쉽지 않았다. 예전에도 한번 시도했지만 꾸준히 정리해야 할맛나는것 같다. 쌓이면 쌓일수록 답이없다…..
  • 매일 적당한 양을 공부하고, 정리할것
  • 알아도 정리하자!

부스트 캠프 ai tech 1주 2일차 Python Basic for AI (2)

1일차 배운내용 2일차에 정리하는중…


4. Function(함수)

  • 어떤 일을 수행하는 논리적인 코드 단위
  • parameter, indentation(들여쓰기), return 등으로 구성된다
  • argument : 함수를 호출할 때 입력되는 파라미터들을 말한다
1
2
3
4
5
def im_function(im_parameter): #함수의 정의와 파라미터
im_return = im_parameter # 수행 내용
return im_return # 리턴값

result = im_function(im_argument)
  • 함수에 return 값이 존재하지 않을경우 함수는 None을 리턴한다

4.1 지역변수 & 전역변수

  • 지역변수(local variable) : 함수 내에서만 사용되는 변수
  • 전역변수(global variable) : 프로그램 전체에서 사용하는 변수
    • global을 사용하여 함수내에서 정의 할 수 있다.
1
2
3
4
5
6
def function(x):
global y
return x + y

y = 5
print(function(6)) # 11

4.2 재귀함수(recursive Function)

  • 자기자신을 호출하는 함수
  • 종료조건이 존재하여 종료조건을 만족시킬때 까지 스스로를 호출한다
  • python에서는 recursivelimit가 걸려있어서 따로 sys 모듈을 통해 한도를 늘려놓아야 한다.
  • 개인적으로 별로 안이용하고 싶음

4.3 Function type hints & Docstring

  • Function type hints
    python에서는 dynamic typinig 형식으로 작성하기 때문에 별도로 자료형을 적어두지 않기 때문에 처음 함수를 사용하는 사용자가 interface를 알기 어렵다는 단점이 있다.
    이를 해결하기 위해 type hints 기능을 제공한다.
    • parameter와 return의 type을 알려주는 type hints
1
2
def this_is_function(var_name: var_type) -> return_type:
pass
  • Docstring
    함수에 대한 상세 스펙(필요한 parameter, return, 수행하는 일 등등)을 사전에 작성한다.
    세개의 따옴표로 함수명 아래에 표시한다
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def function(x):
    """
    this is docstring
    return parameter
    x : int
    =======
    return int
    """
    return x

4.4 python 가이드 라인

  • 함수는 가능하면 짧게 작성한다
  • 함수이름에 역할, 의도를 명확하게 나타낼 수 있도록 한다
  • 하나의 함수에는 유사한 역할을 하는 코드만 포함한다
  • parameter로 받은 값 자체를 바꾸지 않는다
  • 공통 코드나 복잡한 수식은 함수로 나타낸다
  • PEP8 참고해보자

5. input & print & fommatting

  • input 함수는 콘솔창에서 문자열을 입력받는 함수이다(string 형태로 받아옴)
  • print 함수는 입력받은 값을 문자열으로 출력한다
  • , 를 사용할 경우 print문이 공백을 사이에 두고 연결된다
    1
    2
    3
    print("name :")
    name = input() # input -> 규범
    print("Hello", name) # Hello 규범
  • formatting을 통해서 출력양식의 형식을 지정할 수 있다.
type 설명
%s 문자열(string)
%c 문자 1개(character)
%d 정수 (int 형)
%f 부동소수(float 형)
%o 8진수
%x 16진수
%% % 문자 자체
  • %n.m(datatype)

    • string : n개의 문자로 맞춘다(공백으로 채운다). m 자리수까지만 나타낸다(혼용 불가)
    • int : n개의 문자로 맞춘다(공백으로 채운다). m 은 사용불가
    • float : n개의 문자로 맞춘다(공백으로 채운다). 소숫점 m자리까지 나타낸다
  • Python 3.6 이후의 PEP8에 근거한 formatting

    1
    2
    3
    name = Jone
    age = 20
    print(f'Hello, {name}. I am {age}.') # Hello, Jone. I am 20.
  • 예전방식

    1
    2
    print('%s %s' % ('one', 'two')) # one two
    print('%d %d'.format(1, 1)) # one two

부스트 캠프 ai tech 1주 1일차 Python Basic for AI (1)


1. Python의 특징

  • 독립적인 플랫폼
    운영체제에 상관없이 작동하는 언어이다.
  • 인터프리터 언어
    별도의 컴파일링 없이 컴퓨터가 바로 처리할 수 있는 언어이다. 속도는 컴파일러 언어에 비해서 느리지만 메모리가 적게 필요하다.
  • 객체지향적
    실행 순서가 아닌 단위 모듈 중심으로 프로그램이 작성된다.
  • Dynamic Typing 언어
    프로그램이 실행하는 시점에 프로그램이 사용해야하는 데이터 타입이 결정된다.

2. 변수

  • 데이터를 저장하기 위한 메모리 공간
    변수가 정의되면 변수는 메모리 주소를 할당 받고, 그 메모리 위치에 값을 저장한다. 그 외에 python에서 어떻게 변수를 할당받고 메모리를 관리하는지 알고싶으면 아래의 영상을 참고하는걸 추천한다.
  • 기본 자료형들은 +, -, *, %의 사칙연산이 가능 하다
  • Dynamic Typing을 지원하기 때문에 정의할 때에 자료형을 특정하지 않아도 된다.
    • 실행하는 시점에서 변수형을 확인하고 결정하기 때문에 타 언어보다 속도가 느리다.
    • 아래와 같이 자료형간 형 변환또한 가능하다.
1
2
3
4
5
a = 1 # int형으로 정의
int(a) # int() 로 형 변환 가능
str(a) # str로 재정의 이때의 값은 '5'
float(a) # float형으로 재정의 이때의 값은 '5.0'
bool(a) # boolean 형으로 재정이 이때의 값은 True

3. 리스트

  • 여러 데이터들을 묶어서 표현할 수 있는 자료형
  • python 에서는 리스트 내부에 여러가지 자료형이 동시에 존재할 수 있다.

1. List Indexing & Slicing

  • Indexing : 리스트에 있는 값들은 주소를 사용해 호출이 가능하다
  • index를 넣는 곳에 음수값을 넣어서 뒤에서부터 호출 할 수 있다.
  • len(object_name) : object의 길이를 반환한다
    1
    2
    3
    4
    5
    6
    color = ['red', 'blue', 'green']
    print(colors[0]) # red
    print(colors[-1]) # green
    print(len(colors)) # 3
    color[0] = 'Yellow' # ['Yellow', 'blue', 'green']

  • Slicing : list의 값들을 잘라서 부분적으로 표현할 수 있다.
  • index과 같이 음수값 통해 역순으로도 가능하다.
1
2
3
4
5
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print(numbers[0:6]) # [1, 2, 3, 4, 5, 6] index 0번부터 6개
print(numbers[:]) # [1, 2, 3, ... , 7, 8, 9] 처음부터 끝까지
print(numbers[::2]) # [1, 3, 5, 7, 9] 2칸단위로 슬라이싱
print(numbers[-5::-1]) # [6, 5, 4, 3, 2, 1] 뒤에서 5번째부터 역순으로 슬라이싱

2. List 연산

  • + : 두 리스트를 합쳐준다
  • * : 리스트를 n회 반복해서 늘린다
    1
    2
    3
    4
    num1 = [1, 2, 3]
    num2 = [3, 4, 5]
    num1 + num2 # [1, 2, 3, 3, 4, 5]
    num1 * 2 # [1, 2, 3, 1, 2, 3]
  • list.append(element) : list에 element를 추가한다
  • list.extend(iterable) : list에 iterable의 원소들을 추가한다
  • list.insert(index, element) : list의 특정 index 위치에 element를 삽입한다
  • list.remove(element) : list의 특정 element를 삭제한다
1
2
3
4
5
num = [1, 2, 3]
num.append([4, 5]) # [1, 2, 3, [4, 5]]
num.extend([1, 2]) # [1, 2, 3, [4, 5], 1, 2]
num.insert(0, 'a') # ['a', 1, 2, 3, [4, 5], 1, 2]
num.remove(1) # ['a', 2, 3, [4, 5], 2]

3. 2-dim list

  • 행렬
  • 기존의 리스트와 비슷하지만, 복사할때 주의할점이 필요하다
    리스트를 복사할때 리스트 주소가 복사되기 때문에 내부의 리스트는 동일한 주소의 값을 가져 하나의 리스트를 변경하면 다른 리스트값도 변경됨
    • python 모듈중 copy의 deepcopy를 이용하여 복사
      1
      2
      3
      4
      mat = [[1, 2, 3], [4, 5, 6]]
      mat2 = mat
      mat[1][0] = 2 # [[2, 2, 3], [4, 5, 6]]
      mat2 # [[2, 2, 3], [4, 5, 6]]

부스트 캠프 ai tech 1주 1일차 Basic


1. OS(Operating System) 운영체제

  • Application이 동작 할 수 있는 환경을 말한다.
  • 컴퓨터의 하드웨어와 App이 소통하는 창구 역할을 한다.
  • ex) 윈도우즈, MacOS, Ubuntu(Linux)
  • 자세한 내용은 CS에서 따로 정리를 하고있다.

2. File System

  • File system 이란?
    • 파일을 저장하는 트리구조의 데이터 저장체제
  • Directory 이란?
    • 아래에 정의하는 File이나 다른 Directory를 저장할수 있는 것
    • 폴더 또는 디렉토리라고 할 수 있다.
  • File 이란?
    • 의미있는 정보를 저장하는 논리적인 단위
    • run, write, read 등을 할 수 있다.
    • 파일 명과 확장자로 종류나 쓰임새를 식별 가능하다.
  • 경로란?
    • 절대경로 : root부터 현재 파일 위치까지의 경로
    • 상대경로 : 현재 활성화된 디렉토리부터 타겟 파일까지의 경로

3. Terminal

  • 키보드를 통하여 명령을 하고, 프로그램을 실행시키는 인터페이스
  • windows의 CMD, PowerShell 과 Mac, Linux의 Terminal 등이 해당한다.

10-12-TD

10/12일

WGAN을 읽으면서 아직 이해못한 부분들을 이해하기 위하여 GAN 논문의 Loss 함수부분을 중점적으로 읽어보았다.

GAN 논문 요약

  • GAN 논문은 Discriminative model $D$ 와 Generative model $G$로 이루어져서 $D$는 생성된 이미지와 원본 이미지를 구별해 내는 방향으로 학습, $G$는 $D$가 생성한 이미지와 원본 이미지를 구별하지 못하도록 학습시키는 것을 목표로 한다. -> 두 모델이 적대적으로 학습하는 방식이기 때문에 Generative Adversarial Nets(생성적 적대 신경망)이라고 이름이 붙었다.
  • 최종적으로 생성한 데이터의 분포를 실제 데이터의 분포에 가깝게 만드는것을 목표로 한다.
  • Kullback-Leibler divergence(KL divergence)를 기반으로한 Jensen Shannon Divergence(JS divergence)를 사용한다. (KL divergence는 비대칭적이기 때문에 metric으로 사용하기 부적절하다)

WGAN 논문 요약

  • 기존 GAN Loss function을 개선하여 GAN의 성능을 끌어올린 논문이다.
  • JS divergence는 두 확률분포(생성한 데이터, 실제 데이터의 확률분포)가 겹치지 않을때 상수값 $log2$를 가진다.
    • 이것은 데이터분포간의 거리가 아무리 멀거나 가깝거나 상관없이 겹치지 않으면 상수값을 가지기 때문에 학습이 제대로 이루어지지 않을 가능성이 높다.
    • 기존의 GAN 모델에서는 겹치는 부분을 만들어주기 위해 노이즈를 추가하여 데이터의 분포를 강제적으로 늘려주었다. -> 생성된 이미지가 흐려지거나 하는 문제들이 발생함
  • 그래서 WGAN에서는 Earth Mover distance 라는 거리 mertics를 제시하였다.

자세한 부분은 따로 포스트를 할 예정이다.

10-11-TD

10/11일

주말동안 stargan + Wasserstein GAN(WGAN) 논문을 정독해서 읽기 시작하였다.
multi domain image to image Translation 을 실현시킨 Stargan과 GAN의 loss함수를 Earth Move distance(EMD)로 설정을 하여 Discriminator 와 Generator 간의 불균형 문제를 해결한 WGAN에 대하여 간략하게 정리하려고 한다.(요약이 아닌 리뷰포스트는 현재 WGAN을 보면서 작성중이다.)

StarGAN논문 요약

  1. 여러 domain 간 변환을 1개의 Generator를 이용하여 변환할 수 있는것을 목표로 하는 논문이다.
  2. Discriminator는 Real/Fake를 판단하는 것 뿐만아니라 domain Classfication(이 이미지가 어떤 domain에 속해있는지)까지 학습 해야한다.
  3. 두개의 Generator를 사용하여 Cycle을 형성하여 학습하는 CycleGAN과 달리 하나의 Generator로 Fake image를 생성, Fake image와 기존 Source Image의 도메인 정보를 이용하여 다시 재구성을 하여 사이클 구조를 이룬다.
  4. 그래서 3개의 Loss function을 조합하여 Generator와 Discriminator를 학습시킨다.
    • $\mathcal{L}_{abv}$ 는 Adversarial Loss(minmax Loss) : 기본적인 GAN Loss, Cross Entropy에서 가져와 변형시켜서 만들었다. 실제로 학습시킬때는 WGAN의 EMD를 변형시켜서 Loss function 으로 사용했다.
    • Domain Classification Loss : Classfication loss(Cross Entropy Loss)
    • Reconstruction Loss : CycleGAN의 Cycle consistency loss를 사용(생성된 이미지를 다시 원래 source 이미지로 되돌렸을때 발생하는 차이에 대한 척도)

stargan
https://arxiv.org/abs/1711.09020

WGAN은 좀 더 시간이 필요할듯 하다.
막상 요약해서 쓰려고 하니까 수학적 베이스가 많이 필요한데 아직 내가 정리할 정도로 이해를 한것 같지 않다.

+오늘 공부 하면서 조금 더 조사해봐야겠다 생각되었던 부분

  • OS 어떤구조를 가지고 있는지 (Linux, Windows에 관하여 이왕이면 차이도 조사하면 좋을것 같다) : 내부의 프로세스, 스케줄링, 페이징 교체 작업 같은 세부적인건 어느정도 설명이 가능한데 os가 전체적으로 어떤 구조인지 이야기 하라고 하면 못 할것 같다.
  • 커널에 대해 지식이 부족함을 느꼈다. 대략적으로는 아는데 자세하게는 못말하는 느낌이다. 한번 자세히 조사할 필요가 있다고 생각한다.
  • 각종 Loss 함수에 대한 공부(이 함수가 어디에서 비롯되었는지 궁금해졌다.)
  • Duality 등의 WGAN에 대한 수학적 베이스에 대한 공부(Lipschitz조건, Kantorovich-Rubinstein duality)

10-07-TD

10/07일

오늘도 gitlab에서 CI/CD pipeline 구축 체험을 해보았다. (CI/CD에 대해 조금 알아보았는데 지금하는건 체험 수준)
오늘 작업을 하면서 알게된점에 대해서 적어보려한다.

gitlab에는 안전한 업데이트(?)를 위한 기능으로 protected branch, protected tags를 지원한다.

protected branch

마스터, 메인브랜치 같은 언제나 잘 작동하는 올바른 코드가 올라가 있어야 하는 브랜치를 특정 행동으로부터 보호하기 위한 조치이다.
protected branch로 설정하면 항상 올바른 커밋을 push나 merge 하기 위해 룰을 지정할 수 있다.
ex) Pull Request를 merge하기전에 항상 코드리뷰를 n명의 리뷰어에게 거쳐야 하거나, CI 테스트를 통과한 브랜치만이 merge가능하다.

protected tags

protected branch와 비슷하게 잘못해서 코드를 업데이트 하거나 삭제하는것을 예방할수 있다.
gitlab 에서 Protected tags는 삭제하는것이 불가능하다.(강제로 할 수는 있는데 권장하지 않음)
보통 CI/CD를 통과하고 release할 branch에 release version으로 tag를 단다.
직접 protected tags로 지정하거나, wildcrads를 이용하여 특정 규칙을 만족하면 protected tags로 설정하는것이 가능하다.

CI(Continuous Delivery)

CI(지속적인 통합)이라고도 한다. CI를 통하여 개발자들은 협업을 하면서 코드의 변경 사항을 공유브랜치로 병합하는 작업을 더욱 수월하게 수행할 수 있다.
개발자가 push한 변경사항이 병합될때 이 변경사항이 기존의 애플리케이션을 손상시키지 않도록 pipeline을 통한 테스트를 한다.

CD(Continuous Delivery or Deployment)

CD(지속적인 제공)는 유효한 코드를 repository에 자동으로 릴리즈한다.
CD(지속적 배포)는 repository에 릴리즈된 유효한 코드를 자동으로 실행하는것을 말한다.
애플리케이션을 배포할때 애플리케이션 전체를 한번에 실행하는것이 아닌 작은조각(모듈)으로 나누어 실행하면 좀더 리스크 관리를 하기 쉬워진다.

image

출처

RedHat - what is ci/cd