ABOUT ME

누추한 곳을 찾아주셔서 감사합니다 이름모를 귀한 분들,,,,

Today
Yesterday
Total
  • [응용교육과정] 딥러닝 시작하기
    교육/2021 NIPA AI 온라인교육 2021. 9. 2. 23:46
    728x90

    01 퍼셉트론

    신작 드라마 수(x_1)와 확보한 여가 시간(x_2)에 따른 엘리스 코딩 학습 여부(y)를 예측하는 모델

    값을 갖는 Perceptron 함수의 결과를 출력

    학습 여부(출력값 )가 1이 나오도록 x1, x 값을 입력, 활성화 함수는 신호의 총합이 0이상이면 학습, 0미만이면 학습X

    # 학습 여부를 예측하는 퍼셉트론 함수
    def Perceptron(x_1,x_2):
        
        # 설정한 가중치값을 적용
        w_0 = -5 
        w_1 = -1
        w_2 = 5
        
        # 활성화 함수에 들어갈 값을 계산
        output = w_0+w_1*x_1+w_2*x_2
        
        # 활성화 함수 결과를 계산
        if output < 0:
            y = 0
        else:
            y = 1
        
        return y, output
    
    
    """
    1. perceptron의 예측 결과가 학습한다:1 이 나오도록
       x_1, x_2에 적절한 값을 입력하세요.
    """
    x_1 = None
    x_2 = None
    
    result, go_out = Perceptron(x_1,x_2)
    
    print("신호의 총합 : %d" % go_out)
    
    if go_out > 0:
        print("학습 여부 : %d\n ==> 학습한다!" % result)
    else:
        print("학습 여부 : %d\n ==> 학습하지 않는다!" % result)

    DIY 퍼셉트론 만들기

    구현할 퍼셉트론

    '''
    1. 신호의 총합과 그에 따른 결과 0 또는 1을
       반환하는 함수 perceptron을 완성합니다.
       
       Step01. 입력 받은 값을 이용하여
               신호의 총합을 구합니다.
               
       Step02. 신호의 총합이 0 이상이면 1을, 
               그렇지 않으면 0을 반환하는 활성화 
               함수를 작성합니다.
    '''
    def perceptron(w, x):
        
        output = w[0]
        for i in range(4):
            output+=w[i+1]*x[i]
        
        y = 1 if output>0 else 0
        
        return y, output
    
    # x_1, x_2, x_3, x_4의 값을 순서대로 list 형태로 저장
    x = [1,2,3,4]
    
    # w_0, w_1, w_2, w_3, w_4의 값을 순서대로 list 형태로 저장
    w = [2, -1, 1, 3, -2]
    
    # 퍼셉트론의 결과를 출력
    y, output = perceptron(w,x)
    
    print('output: ', output)
    print('y: ', y)

    퍼셉트론의 알맞은 가중치 찾기

    주어진 데이터를 완벽히 분리하는 퍼셉트론을 직접 구현

    단층 퍼셉트론을 직접 구현해보며 적절한 가중치(Weight)와 Bias 값을 찾아봅시다.

    import numpy as np
    
    
    def perceptron(w, x):
        
        output = w[1] * x[0] + w[2] * x[1] + w[0]
        
        if output >= 0:
            y = 1
        else:
            y = 0
        
        return y
    
    
    
    # Input 데이터
    X = [[0,0], [0,1], [1,0], [1,1]]
    
    '''
    1. perceptron 함수의 입력으로 들어갈 가중치 값을 입력해주세요.
       순서대로 w_0, w_1, w_2에 해당됩니다.
    '''
    w = [-1, 0.5, 0.5]
    
    # AND Gate를 만족하는지 출력하여 확인
    print('perceptron 출력')
    
    for x in X:
        print('Input: ',x[0], x[1], ', Output: ',perceptron(w, x))

    2장. 텐서플로우와 신경망

    텐서플로우를 활용하여 신경망 구현하기 - 데이터 전 처리

    텐서플로우를 활용하여 신경망을 구현해보는 과정을 수행

    광고 비용에 따른 수익률을 신경망을 통해서 예측

    텐서플로우 신경망 모델의 학습 데이터는 기존 데이터를 tf.data.Dataset 형식으로 변환하여 사용

    pandas의 DataFrame 형태 데이터를 Dataset으로 변환하기 위해서는 아래의 from_tensor_slices() 메서드를 사용하여 ds에 저장

    #X : feature 데이터가 저장된 DataFrame, Y : label 데이터가 저장된 Series
    #X, Y 데이터는 X.values, Y.values를 사용하여 리스트 형태로 입력
    ds = tf.data.Dataset.from_tensor_slices((X.values, Y.values))
    
    #batch적용
    ds = ds.shuffle(len(X)).batch(batch_size=5)
    #shuffle 메서드를 사용하여 데이터를 셔플,인자로는 데이터의 크기
    #batch 메서드를 사용하여 batch_size에 batch 크기를 넣게 되면 해당 크기로 batch를 수행
    #이렇게 처리한 ds에서 take()메서드를 사용하면 batch로 분리된 데이터를 확인가능
    import tensorflow as tf
    import pandas as pd
    import numpy as np
    from sklearn.model_selection import train_test_split
    
    import os
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
    
    np.random.seed(100)
    tf.random.set_seed(100)
    
    # 데이터를 DataFrame 형태로 불러 옵니다.
    df = pd.read_csv("data/Advertising.csv")
    
    # DataFrame 데이터 샘플 5개를 출력합니다.
    print('원본 데이터 샘플 :')
    print(df.head(),'\n')
    
    # 의미없는 변수는 삭제합니다.
    df = df.drop(columns=['Unnamed: 0'])
    
    """
    1. Sales 변수는 label 데이터로 Y에 저장하고 나머진 X에 저장합니다.
    """
    X = df.drop(columns=['Sales'])
    Y = df['Sales']
    
    train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.3)
    
    """
    2. 학습용 데이터를 tf.data.Dataset 형태로 변환합니다.
       from_tensor_slices 함수를 사용하여 변환하고 batch를 수행하게 합니다.
    """
    train_ds = tf.data.Dataset.from_tensor_slices((train_X.values, train_Y.values))
    train_ds = train_ds.shuffle(len(train_X)).batch(batch_size=5)
    
    # 하나의 batch를 뽑아서 feature와 label로 분리합니다.
    [(train_features_batch, label_batch)] = train_ds.take(1)
    
    # batch 데이터를 출력합니다.
    print('\nFB, TV, Newspaper batch 데이터:\n',train_features_batch)
    print('Sales batch 데이터:',label_batch)

    텐서플로우를 활용하여 신경망 구현하기 - 모델 구현

    텐서플로우와 케라스(Keras)를 활용하여 신경망 모델을 구현

    케라스는 텐서플로우 내의 신경망 모델 설계와 훈련을 위한 API, 연속적으로(Sequential) 레이어(Layer)들을 쌓아가며 모델을 생성하고, 사이킷런과 같이 한 줄의 코드로 간단하게 학습 방법 설정, 학습, 평가를 진행

    #모델 설정
    #연속적으로 층을 쌓아 만드는 Sequential모델을 위한 함수
    tf.keras.models.Sequential()
    
    #Dense레이어
    #신경망 모델의 레이어를 구성하는데 필요한 keras함수, units : 레이어 안의 노드 수
    tf.keras.layers.Dense(units)
    
    #5개의 변수에 따른 label을 예측하는 회귀분석 신경망 예시
    tf.keras.models.Sequential([
        tf.keras.layers.Dense(10, input_shape=(5,)),
        tf.keras.layers.Dense(1)
        ])
    #input_shape : (입력하는 변수의 개수,)로 입력, 회귀분석이라서 마지막 레이어 유닛 수는 1
    #아래는 input_dim인자를 사용해서 표현한 코드
    tf.keras.models.Sequential([
        tf.keras.layers.Dense(10, input_dim=5),
        tf.keras.layers.Dense(1)
        ])
    model = tf.keras.models.Sequential([
        tf.keras.layers.Dense(10,input_dim=3),
        tf.keras.layers.Dense(20,input_dim=10),
        tf.keras.layers.Dense(1)
        ])

    텐서플로우를 활용하여 신경망 구현하기 - 모델 학습

    #학습 방법 설정
    #compile() : 모델을 어떻게 학습할 지 설정
    #loss : 회귀에서는 주로 mean_squared_error(MSE), 분류는 주로 sparse_categorical_crossentropy
    model.complie(loss='mean_squared_error', optimizer='adam')
    
    #학습 수행
    #X데이터를 epoch를 100으로 하여 학습
    #verbose : 학습 시 화면에 출력되는 형태 0=표기 없음, 1=진행 바, 2=에포크 당 한 줄 출력
    model.fit(X, epochs=100, verbose=2)
    model.compile(loss='mean_squared_error', optimizer='adam')
    history = model.fit(train_ds, epochs=100, verbose=1)

    텐서플로우를 활용하여 신경망 구현하기 - 모델 평가 및 예측

    #평가 방법
    #evaluate() 메서드는 학습된 모델을 바탕으로 입력한 feature 데이터 X와 label Y의 loss 값과 metrics 값을 출력
    #분류에서는 일반적으로 accuracy를 사용하여 evaluate 사용 시, 2개의 아웃풋을 리턴
    model.evaluate(X, Y)
    
    #예측 방법
    #X데이터의 예측 label값 출력
    model.predict(X)

    신경망 모델로 분류하기

    Iris 데이터가 주어졌을 때 붓꽃의 종류를 분류하는 신경망 모델을 구현

    Iris 데이터

    #5개의 범주를 갖는 label예시
    #분류 모델에서는 마지막 레이어에 분류 데이터의 label 범주의 개수만큼 노드를 설정
    #activation인자로 softmax
    model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(10, input_dim=4),
    tf.keras.layers.Dense(5, activation='softmax')
    ])
    
    #학습 방법
    #분류에서는 일반적으로 loss를 sparse_categorical_crossentropy
    #metrics인자는 에포크마다 계산되는 평가 지표, accuracy를 입력하면 에포크마다 accuracy계산해서 출력
    model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

    03. 다양한 신경망

    MNIST 분류 CNN 모델 - 데이터 전 처리

    MNIST는 손글씨로 된 사진을 모아 둔 데이터, 신경망을 학습시키고, 학습 결과가 손글씨를 인식할 수 있는지 검증

    mnist

    이미지 데이터를 출력하고 그 형태를 확인하여 CNN 모델에 적용할 수 있도록 데이터 전 처리를 수행

    MNIST 데이터는 이미지 데이터이지만 가로 길이와 세로 길이만 존재하는 2차원 데이터

    CNN 모델은 채널(RGB 혹은 흑백)까지 고려한 3차원 데이터를 입력으로 받기에 채널 차원을 추가해 데이터의 모양(shape)을 바꿔줘야함

    [데이터 수, 가로 길이, 세로 길이] -> [데이터 수, 가로 길이, 세로 길이, 채널 수]

    #차원 추가 함수
    #Tensor 배열 데이터에서 마지막 축(axis)에 해당하는 곳에 차우너 하나를 추가하는 코드
    tf.expand_dims(data, axis)

    MNIST 분류 CNN 모델 - 모델 구현

    #keras에서 CNN모델을 만들기 위해 필요한 함수/메서드
    #1.CNN레이어 : 입력 이미지의 특징, 즉 처리할 특징 맵(map)을 추출하는 레이어
    tf.keras.layers.Conv2D(filters, kernel_size, activation, padding)
    '''
    filters : 필터(커널) 개수
    kernel_size : 필터(커널)의 크기
    activation : 활성화 함수
    padding : 이미지가 필터를 거칠 때 그 크기가 줄어드는 것을 방지하기 위해서 가장자리에 0의 값을 가지는 픽셀을 넣을 것인지 말 것인지를 결정하는 변수. ‘SAME’ 또는 ‘VALID’
    '''
    
    #2. Maxpool 레이어 : 처리할 특징 맵(map)의 크기를 줄여주는 레이어
    tf.keras.layers.MaxPool2D(padding)
    #padding : ‘SAME’ 또는 ‘VALID’
    
    #3. Faltten 레이어
    tf.keras.layers.Flatten()
    '''
    Convolution layer 또는 MaxPooling layer의 결과는 N차원의 텐서 형태
    이를 1차원으로 평평하게 만들어줌
    '''
    
    #4. Dense 레이어
    tf.keras.layers.Dense(node, activation)
    '''
    node : 노드(뉴런) 개수
    activation : 활성화 함수
    '''

    MNIST 분류 CNN 모델 - 평가 및 예측

    #평가
    model.evaluate(X, Y)
    #예측
    model.predict_classes(X)

    영화 리뷰 긍정/부정 분류 RNN 모델 - 데이터 전 처리

    #data시퀀스의 크기가 maxlen인자보다 작으면 크기에 맞게 패딩 추가
    sequence.pad_sequences(data, maxlen=300, padding='post')

    영화 리뷰 긍정/부정 분류 RNN 모델 - 모델 학습

    #Keras에서 RNN 모델을 만들기 위해 필요한 함수/라이브러리
    #임베딩레이어:들어온 문장을 단어 임베딩하는 레이어
    tf.keras.layers.Embedding(input_dim, output_dim, input_length)
    '''
    input_dim: 들어올 단어의 개수
    output_dim: 결과로 나올 임베딩 벡터의 크기(차원)
    input_length: 들어오는 단어 벡터의 크기
    '''
    #RNN레이어:단순 RNN레이어
    tf.keras.layers.SimpleRNN(units)
    #units: 레이어의 노드수

    영화 리뷰 긍정/부정 분류 RNN 모델 - 평가 및 예측

    model.evaluate(X, Y)
    model.predict(X)

    '교육 > 2021 NIPA AI 온라인교육' 카테고리의 다른 글

    댓글

Designed by Tistory.