ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 딥러닝기초 과제(3개)
    카테고리 없음 2022. 1. 24. 18:40

    Fashion-MNIST 데이터 분류하기

    정규화(Regularization)와 드롭아웃(Drop out)

    Word Embedding 이해하기

     

     

    1.      

    from __future__ import absolute_import, division, print_function, unicode_literals

     

    import tensorflow as tf

    import matplotlib.pyplot as plt

    import numpy as np

    import random

    import os

    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

     

    import elice_utils

    elice_utils = elice_utils.EliceUtils()

     

    np.random.seed(100)

    tf.random.set_seed(100)

     

    '''

    1. 다층 퍼셉트론 분류 모델을 만들고, 학습 방법을 설정해

       학습시킨 모델을 반환하는 MLP 함수를 구현하세요.

      

       Step01. 다층 퍼셉트론 분류 모델을 생성합니다.

               여러 층의 레이어를 쌓아 모델을 구성해보세요.

              

       Step02. 모델의 손실 함수, 최적화 방법, 평가 방법을 설정합니다.

      

       Step03. 모델을 학습시킵니다. epochs를 자유롭게 설정해보세요.

    '''

     

    def MLP(x_train, y_train):

       

        model = tf.keras.models.Sequential([

            tf.keras.layers.Dense(64, activation='relu'),

            tf.keras.layers.Dense(32, activation='relu'),

            tf.keras.layers.Dense(10, activation='softmax')

        ])

       

        model.compile(loss = 'sparse_categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])

       

        model.fit(x_train, y_train, epochs = 100)

       

        return model

     

    def main():

       

        x_train = np.loadtxt('./data/train_images.csv', delimiter =',', dtype = np.float32)

        y_train = np.loadtxt('./data/train_labels.csv', delimiter =',', dtype = np.float32)

        x_test = np.loadtxt('./data/test_images.csv', delimiter =',', dtype = np.float32)

        y_test = np.loadtxt('./data/test_labels.csv', delimiter =',', dtype = np.float32)

       

        # 이미지 데이터를 0~1범위의 값으로 바꾸어 줍니다.

        x_train, x_test = x_train / 255.0, x_test / 255.0

       

        model = MLP(x_train,y_train)

       

        # 학습한 모델을 test 데이터를 활용하여 평가합니다.

        loss, test_acc = model.evaluate(x_test, y_test, verbose=0)

       

        print('\nTEST 정확도 :', test_acc)

       

        # 임의의 3가지 test data의 이미지와 레이블값을 출력하고 예측된 레이블값 출력

        predictions = model.predict(x_test)

        rand_n = np.random.randint(100, size=3)

       

        for i in rand_n:

            img = x_test[i].reshape(28,28)

            plt.imshow(img,cmap="gray")

            plt.show()

            plt.savefig("test.png")

            elice_utils.send_image("test.png")

           

            print("Label: ", y_test[i])

            print("Prediction: ", np.argmax(predictions[i]))

     

    if __name__ == "__main__":

        main()

     

    2.     문제

    import numpy as np

    import tensorflow as tf

    from visual import *

    from plotter import *

    from dataloader import load_data

     

    import logging, os

    logging.disable(logging.WARNING)

    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

     

    np.random.seed(100)

     

    '''

    1. 입력층과 출력층은 그대로 사용합니다.

    '''

     

    def Develop():

       

        model = tf.keras.Sequential([

                      tf.keras.layers.Flatten(input_shape=(28, 28)),

                      tf.keras.layers.Dense(128, activation='relu', kernel_regularizer = tf.keras.regularizers.l2(0.001)),

                      tf.keras.layers.Dropout(0.2),

                      tf.keras.layers.Dense(128, activation='relu', kernel_regularizer = tf.keras.regularizers.l2(0.001)),

                      tf.keras.layers.Dropout(0.2),

                      tf.keras.layers.Dense(64, activation='relu', kernel_regularizer = tf.keras.regularizers.l2(0.001)),

                      tf.keras.layers.Dropout(0.2),

                      tf.keras.layers.Dense(32, activation='relu', kernel_regularizer = tf.keras.regularizers.l2(0.001)),

                      tf.keras.layers.Dropout(0.2),

                      tf.keras.layers.Dense(10, activation='softmax')

                      ])

       

        return model

       

        

    '''

    2. 모델을 불러온 후 학습시키고 테스트 데이터에 대해 평가합니다.

     

       Step01. Develop 함수를 이용해 두 모델을 불러옵니다.

      

       Step02. 모델의 손실 함수, 최적화 알고리즘, 평가 방법을 설정합니다.

      

       Step03. 모델의 구조를 확인하는 코드를 작성합니다.

      

       Step04. 모델을 학습시킵니다. 두 모델 모두 'epochs' 20,

               'batch_size' 500으로 설정합니다. 검증용 데이터도 설정해주세요.

      

       Step05. 모델을 테스트하고 accuracy 점수를 출력합니다.

               모델의 성능을 확인해보고, 목표값을 달성해보세요.

    '''

     

    def main():

       

        # Fashion-MNIST 데이터를 불러오고 전처리하는 부분입니다.

        (train_images, train_labels), (test_images, test_labels) = load_data()

       

        train_images = train_images / 255.0

        test_images = test_images / 255.0

       

        develop_model = Develop()

       

        develop_model.compile(loss = 'sparse_categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])

       

        develop_model.summary()

       

        history = develop_model.fit(train_images, train_labels, epochs = 50, validation_data = (test_images, test_labels), batch_size = 500, verbose = 0)

       

        scores = develop_model.evaluate(test_images, test_labels, verbose = 0)

       

        print('\naccuracy_develop: ', scores[-1])

       

        Visulaize([('Develop', history)])

       

        return history

     

    if __name__ == "__main__":

        main()

     

    3.     문제

    import logging, os

    logging.disable(logging.WARNING)

    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

    import numpy as np

    from numpy import array

    import tensorflow as tf

    import tensorflow.keras as keras

    from tensorflow.keras.preprocessing.text import one_hot

    from tensorflow.keras.preprocessing import sequence

    from tensorflow.keras.models import Sequential

    from tensorflow.keras import layers

     

    # 채점을 위한 코드입니다. 수정하지 마세요!

    np.random.seed(81)

     

    def pad_document(encoded_docs, max_length):

        '''

        단어 개수가 max_length가 되지 않는 문장을 max_length 길이로 맞추기 위해서

        인코딩된 단어 뒤에 0을 덧붙입니다.

        '''

        # 지시사항 1번을 참고하여 코드를 작성하세요.

        padded_docs = tf.keras.preprocessing.sequence.pad_sequences(encoded_docs, maxlen = max_length, padding = "post", truncating = "post", value=0.0, dtype = "int32")

       

        return padded_docs

     

    def make_embedding_model(vocab_size, max_length):

    #    model = Sequential()

        # 지시사항 2번을 참고하여 코드를 작성하세요.

        model = tf.keras.models.Sequential()

        model.add(tf.keras.layers.Embedding(input_dim = 50, output_dim = 8, input_length = max_length))

        model.add(tf.keras.layers.Flatten())

        model.add(tf.keras.layers.Dense(1, activation = 'sigmoid'))

           

        return model

     

    def main():   

        # 예시로 사용할 문장의 집합입니다.

        docs = ['Well done!',

                         'Good work',

                         'Great effort',

                         'nice work',

                         'Excellent!',

                          'Weak',

                         'Poor effort!',

                         'not good',

                         'poor work',

                         'Could have done better.']

       

        # 각 문장이 분류될 라벨입니다.

        # 긍정적인 문장에는 1, 부정적인 문장에는 0을 할당합니다.

        labels = array([1,1,1,1,1,0,0,0,0,0])

       

        # 전체 단어의 개수가 50개라고 가정합니다.

        vocab_size = 50

       

        # 한 문장은 최대 4개의 단어로 구성되어 있습니다.

        max_length = 4

       

        # docs 내의 각 문장을 one-hot 벡터로 바꿔줍니다.

        encoded_docs = [one_hot(d, vocab_size) for d in docs]

       

        padded_docs = pad_document(encoded_docs, max_length)

       

        model = make_embedding_model(vocab_size, max_length)

       

        # 지시사항 3번을 참고하여 코드를 작성하세요.

        model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])

       

        # 지시사항 4번을 참고하여 코드를 작성하세요.

        model.fit(padded_docs, labels, epochs = 500, verbose = 2)

       

        # 완성된 모델을 확인해봅니다.

        model.summary()

       

        # 지시사항 5번을 참고하여 코드를 작성하세요.

        loss, accuracy = model.evaluate(padded_docs, labels, verbose = 0)

       

        print('\n훈련된 모델의 테스트 성능은 %0.5f 입니다.\n' % accuracy)

       

        return accuracy

     

    if __name__ == '__main__':

        main()

Designed by Tistory.