ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [생활코딩 - 머신러닝 야학] 텐서플로우 day 5/ 후기
    공부일기/머신러닝 야학 2020. 8. 27. 00:12

    1 - 18. 히든레이어

    기존의 퍼셉트론을 여러 개 사용해 연결하면 신경망을 깊게 만들 수 있다. 입력 부분인 Input Layer와 출력 부분인 Output Layer 사이에 추가돼 있는 것을 Hidden Layer라고 하는데, 밑의 사진을 기준으로 인풋과 아웃풋 사이에 하나의 층을 쌓아 모델을 구성한 것이다. 층으로 쌓은 레이어는 다섯 개의 노드를 갖고 있다. 결과를 만들기 위해서 히든레이어 모든 값들을 입력으로 하는 하나의 퍼셉트론이 필요하다. 그리고 히든레이어의 첫 번째 노드를 만들기 위해서도 하나의 퍼셉트론이 필요하다.

    [인풋레이어 - 히든레이어]를 하나의 모델로 보게 되면 13개의 입력을 받고 5개의 출력을 하는 모델이 되고, [히든레이어 - 아웃풋레이어]를 하나의 모델로 보게 되면 5개의 입력을 받고 1개의 출력을 하는 모델이 된다. 각각의 모델을 연속적으로 연결하여 하나의 거대한 신경망을 만드는 것이 딥러닝, 인공신경망이다. 

    위의 모델의 구조를 코드로 나타내 보면 이렇다. 아마 여러 계층을 쌓게 되면 H1, H2, H3 ...이런 식으로 나눌 수 있지 않을까 생각된다.라고 적고 강의를 계속 보니 여러 개 만드는 코드도 설명했다. 위에서 아래로, 왼쪽에서 오른쪽으로 순차적으로 읽는 컴퓨터 덕에 굳이 숫자를 1, 2, 3 이렇게 안 나눠도 되는 것 같다.

    X = tf.keras.layers.Input(shape=[13]) # 독립변수는 13개
    H = tf.keras.layers.Dense(5, activation='swish')(X) # X를 입력인자로 받는다. swish는 히든레이어 활성화 함수. 최근 발표된 성능이 좋은 함수라고 한다.
    H = tf.keras.layers.Dense(3, activation='swish')(H)
    H = tf.keras.layers.Dense(3, activation='swish')(H)
    Y = tf.keras.layers.Dense(1)(H) ## H를 입력인자로 받는다.
    
    model = tf.keras.models.Model(X,Y)
    model.compile(loss='mse')

     

     

    1 - 19. 히든레이어(실습)

    두 번째, 세 번째 예제였던 보스턴 집값 예측, 아이리스 품종 분류 예제로 실습을 진행했다.

    # 머신러닝을 위한 라이브러리 불러오기
    import pandas as pd
    import tensorflow as tf
    
    # 파일 읽어오기 (과거 데이터 준비)
    파일경로 = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/boston.csv'
    보스턴 = pd.read_csv(파일경로)
    
    
    # 독립 변수와 종속변수 분리 및 확인
    독립 = 보스턴[['crim', 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax',
           'ptratio', 'b', 'lstat']]
    종속 = 보스턴[['medv']]
    print(독립.shape, 종속.shape)
    
    
    # 모델 만들기
    X = tf.keras.layers.Input(shape=[13])
    H = tf.keras.layers.Dense(10, activation='swish')(X) # 히든 레이어가 추가된 부분
    Y = tf.keras.layers.Dense(1)(H)
    model = tf.keras.models.Model(X, Y)
    model.compile(loss='mse')
    
    # 학습 시키기
    model.fit(독립, 종속, epochs=1000, verbose=0)
    model.fit(독립, 종속, epochs=10)
    
    # 예측 하고 비교하기
    model.predict(독립[0:5])
    종속[0:5]
    
    # 수식 구하기
    model.get_weights()

     

    # 머신러닝을 위한 라이브러리 불러오기
    import pandas as pd
    import tensorflow as tf
    
    # 데이터 불러오고 읽기
    파일경로 = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/iris.csv'
    iris = pd.read_csv(파일경로)
    iris.head()
    
    # 분류를 위한 인코딩함수 추가 및 확인
    incod = pd.get_dummies(iris)
    incod.head()
    
    # 독립변수와 종속변수 나누기
    in_v = incod[['꽃잎길이', '꽃잎폭', '꽃받침길이', '꽃받침폭']]
    de_v = incod[['품종_setosa', '품종_versicolor', '품종_virginica']]
    
    # 모델 만들기
    X = tf.keras.layers.Input(shape=[4])
    H = tf.keras.layers.Dense(8, activation='swish')(X)
    H = tf.keras.layers.Dense(8, activation='swish')(H)
    H = tf.keras.layers.Dense(8, activation='swish')(H)
    Y = tf.keras.layers.Dense(3, activation='softmax')(H)
    model = tf.keras.models.Model(X, Y)
    model.compile(loss='categorical_crossentropy', metrics='accuracy')
    
    # 학습하기
    model.fit(in_v, de_v, epochs=100)
    
    # 모델을 이용해 예측이 맞는지 확인하기
    model.predict(in_v[-5:])
    print([de_v[-5:]])
    
    # 수식 구하기
    model.get_weights()

    많은 히든 레이어를 만들수록 정확도가 많이 올라갈까? 품종분류 예제는 거의 1에 가까운 확률을 보여줬고 정확도도 96%까지 올라가는 모습을 보여줬다. 보스턴 집값 예측의 예제도 더 많은 히든레이어를 넣어서 예측해봐야겠다.

     

     

    1 - 20. 데이터를 위한 팁

    • 원핫인코딩을 할 때 데이터 타입 문제. (품종이 0,1,2 등 숫자로 변경되었으나 여전히 범주형 데이터이다.)
    import pandas as pd
    
    file = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/iris2.csv'
    iris = pd.read_csv(file)
    iris.head()
    
    # 원핫인코딩
    incoding = pd.get_dummies(iris)
    
    print(iris.dtypes) # 각 칼럼들의 데이터 타입을 확인할 수 있다.
    # object나 category 타입인 경우만 원핫인코딩을 한다.
    
    ###### 품종 타입을 범주형으로 바꾸기.
    iris['품종'] = iris['품종'].astype('category')
    
    # 다시 원핫인코딩
    incoding = pd.get_dummies(iris)

     

    • 데이터 안의 내용 중 NA 값 때문에 발생하는 문제.
    # NA값 체크
    iris.isna().sum() # 각 칼럼에 na값이 있는 지 확인
    
    ###### NA값에 꽃잎폭 평균값을 넣어주는 방법
    mean = iris['꽃잎폭'].mean()
    아이리스['꽃잎폭'] =. 아이리스['꽃잎폭'].fillna(mean) # 꽃잎폭 칼럼의 na값에 꽃잎폭 칼럼 평균값 삽입

     

     

    1 - 21. 모델을 위한 팁(학습이 잘 되는 모델)

    X = tf.keras.layers.Input(shape=[13])
    
    H = tf.keras.layers.Dense(10)(X)
    H = tfk.keras.layers.BatchNormalization()(H)
    H = tf.keras.layers.Activation('swish')(H)
    
    H = tf.keras.layers.Dense(10)(X)
    H = tfk.keras.layers.BatchNormalization()(H)
    H = tf.keras.layers.Activation('swish')(H)
    
    H = tf.keras.layers.Dense(10)(X)
    H = tfk.keras.layers.BatchNormalization()(H)
    H = tf.keras.layers.Activation('swish')(H)
    
    Y = tf.keras.layers.Dense(1)(H)
    model = tf.keras.models.Model(X, Y)
    model.compile(loss='mse')
    
    # 분리하는 이유는 BatchNormalization을 덴스레이어와 액티베이션레이어 사이에 넣어주는게 좋기 때문이다.
    # 23정도 loss에서 학습이 완료 되던 것이 9까지 떨어지게 된다. 분류모델도 마찬가지

     

     

     

    // 생활코딩 머신러닝과 텐서플로우 수업이 끝났다. 부담스럽지 않은 길이의 강의와 쉽게 설명해 주는 덕에 거부감 없이 끝낼 수 있었다. 앞으로의 이 분야 공부방향은 파이썬을 이용해 데이터사이언스를 다루는 책을 한 권 보고, 네이버 부스트코스의 파이썬으로 시작하는 데이터사이언스, 캐글 실습으로 배우는 데이터사이언스 강의를 순차적으로 수강해야 겠다고 생각한다. 캐글에서 타이타닉 데이터를 접한 적이 있었는데, 그때 train.scv/ test.scv 식으로 데이터셋이 나눠져 있었다. 궁금해서 검색해보니 모델을 학습하는 데는 train 데이터셋만 사용하며, 학습된 모델을 이용해 평가할 땐 test 셋 혹은 validation 셋을 사용한다고 한다. test 셋과 validationt 셋의 차이 등 공부해 나갈 부분이 많다. 독학으로 진행 중이라 어떤 것을 공부해야 하는 지를 공부해야 하는 게 좀 답답하지만, 처음 수업에서 얘기했던 것처럼 차분히 필요한 부분들부터 공부를 진행해야지

Designed by Tistory.