ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2022_하계_모각코] 4회차(08/01)
    카테고리 없음 2022. 8. 2. 16:19

    4회차 목표

    데이콘 반도체 박막 두께 분석하기



    1. 배경

     반도체 박막을 수십~수백 층 쌓아 올리는 공정에서는 박막의 결함으로 인한 두께와 균일도가 저하되는 문제점이 발생한다. 이는 소자 구조의 변형을 야기하는 성능 하락의 주요 요인이 되기 때문에, 박막의 두께를 빠르면서도 정확히 측정하는 것이 중요하다.

     

     반도체 박막은 얇은 반도체 막으로 박막의 종류와 두께는 반도체 소자의 특성을 결정짓는 중요한 요소 중 하나이다. 이 박막의 두께를 측정하는 방법은 반사율을 측정하는 것이다.

     

    (반사율 = 반사광/입사광)

     

    2. 구조 설명

    질화규소 layer_1
    이산화규소 layer_2
    질화규소 layer_3
    이산화규소 layer_4
    규소 기판

    제공되는 train.css 파일에는 각 층의 두께와 반사율 스펙트럼이 포함되어 있다고 한다.

     

    3.  데이터 설명

    • 4층 박막의 두께(layer_1~layer_4)와 파장에 따른 반사율 스펙트럼이 주어진다.
    • 헤더 이름인 0~225는 빛의 파장에 해당하는 반사율으로, 비식별화 처리가 되어있다.

     

    4. 데이콘 baseline 코드 따라하기

    https://dacon.io/competitions/official/235554/codeshare/461?page=1&dtype=recent 

     

    반도체 박막 두께 분석 baseline code

    반도체 박막 두께 분석 경진대회

    dacon.io

    import pandas as pd
    import warnings
    from keras.models import Sequential
    from keras.layers import Dense
    
    # 데이터를 불러온다
    warnings.filterwarnings('ignore')
    train = pd.read_csv('train.csv')
    test = pd.read_csv('test.csv')
    
    # 독립변수와 종속변수 분리한다
    train_X = train.iloc[:, 4:]
    train_Y = train.iloc[:, :4]
    test_X = test.iloc[:, 1:]
    
    # 케라스를 통해 모델 생성을 시작한다
    
    model = Sequential()
    model.add(Dense(units=160, activation='relu', input_dim=226))
    model.add(Dense(units=160, activation='relu'))
    model.add(Dense(units=160, activation='relu'))
    model.add(Dense(units=4, activation='linear'))
    
    # 모델을 컴파일한다.
    model.compile(loss='mae', optimizer='adam', metrics=['mae'])
    
    # 모델을 학습한다.
    model.fit(train_X, train_Y, epochs=20, batch_size=10000, validation_split=0.05)
    
    # 예측값을 생성한다.
    pred_test = model.predict(test_X)
    
    # submission 파일을 생성한다.
    sample_sub = pd.read_csv('sample_submission.csv', index_col=0)
    submission = sample_sub+pred_test
    submission.to_csv('submission.csv')
    Epoch 1/20
    77/77 [==============================] - 16s 167ms/step - loss: 95.7348 - mae: 95.7348 - val_loss: 96.0422 - val_mae: 96.0421
    Epoch 2/20
    77/77 [==============================] - 10s 134ms/step - loss: 74.7934 - mae: 74.7934 - val_loss: 94.1047 - val_mae: 94.1047
    Epoch 3/20
    77/77 [==============================] - 12s 150ms/step - loss: 73.8263 - mae: 73.8263 - val_loss: 93.0890 - val_mae: 93.0890
    Epoch 4/20
    77/77 [==============================] - 13s 165ms/step - loss: 71.3813 - mae: 71.3813 - val_loss: 92.0089 - val_mae: 92.0089
    Epoch 5/20
    77/77 [==============================] - 11s 145ms/step - loss: 67.8848 - mae: 67.8848 - val_loss: 91.0310 - val_mae: 91.0310
    Epoch 6/20
    77/77 [==============================] - 10s 135ms/step - loss: 65.9423 - mae: 65.9423 - val_loss: 88.9058 - val_mae: 88.9058
    Epoch 7/20
    77/77 [==============================] - 10s 136ms/step - loss: 64.4981 - mae: 64.4981 - val_loss: 87.7330 - val_mae: 87.7330
    Epoch 8/20
    77/77 [==============================] - 9s 115ms/step - loss: 62.9887 - mae: 62.9887 - val_loss: 84.4211 - val_mae: 84.4211
    Epoch 9/20
    77/77 [==============================] - 9s 113ms/step - loss: 61.7818 - mae: 61.7818 - val_loss: 80.7816 - val_mae: 80.7816
    Epoch 10/20
    77/77 [==============================] - 9s 113ms/step - loss: 60.5990 - mae: 60.5990 - val_loss: 78.1818 - val_mae: 78.1818
    Epoch 11/20
    77/77 [==============================] - 7s 95ms/step - loss: 59.2792 - mae: 59.2792 - val_loss: 75.7698 - val_mae: 75.7698
    Epoch 12/20
    77/77 [==============================] - 7s 90ms/step - loss: 58.0608 - mae: 58.0608 - val_loss: 74.9228 - val_mae: 74.9228
    Epoch 13/20
    77/77 [==============================] - 8s 100ms/step - loss: 57.2851 - mae: 57.2851 - val_loss: 74.4456 - val_mae: 74.4456
    Epoch 14/20
    77/77 [==============================] - 7s 92ms/step - loss: 56.6848 - mae: 56.6848 - val_loss: 74.2582 - val_mae: 74.2582
    Epoch 15/20
    77/77 [==============================] - 9s 111ms/step - loss: 56.0935 - mae: 56.0935 - val_loss: 73.6912 - val_mae: 73.6912
    Epoch 16/20
    77/77 [==============================] - 9s 122ms/step - loss: 55.5210 - mae: 55.5210 - val_loss: 73.4022 - val_mae: 73.4022
    Epoch 17/20
    77/77 [==============================] - 9s 114ms/step - loss: 54.9302 - mae: 54.9302 - val_loss: 71.8129 - val_mae: 71.8129
    Epoch 18/20
    77/77 [==============================] - 9s 122ms/step - loss: 54.3998 - mae: 54.3998 - val_loss: 72.6745 - val_mae: 72.6745
    Epoch 19/20
    77/77 [==============================] - 10s 125ms/step - loss: 53.8538 - mae: 53.8538 - val_loss: 71.7000 - val_mae: 71.7000
    Epoch 20/20
    77/77 [==============================] - 9s 117ms/step - loss: 53.2845 - mae: 53.2845 - val_loss: 71.6296 - val_mae: 71.6296
    313/313 [==============================] - 2s 3ms/step

     

    5. EDA

    library import & load data

    import pandas as pd
    import warnings
    import missingno as msno
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    warnings.filterwarnings('ignore')
    
    train = pd.read_csv('train.csv')
    test = pd.read_csv('test.csv')
    
    print(train.columns)
    print(test.columns)
    print(train.shape)
    print(test.shape)
    Index(['layer_1', 'layer_2', 'layer_3', 'layer_4', '0', '1', '2', '3', '4',
           '5',
           ...
           '216', '217', '218', '219', '220', '221', '222', '223', '224', '225'],
          dtype='object', length=230)
    Index(['id', '0', '1', '2', '3', '4', '5', '6', '7', '8',
           ...
           '216', '217', '218', '219', '220', '221', '222', '223', '224', '225'],
          dtype='object', length=227)
    (810000, 230)
    (10000, 227)

    각 파장별 요약값 확인

    pd.set_option('display.max_columns', 230)
    train.describe()

    결측치 확인

    msno.matrix(train)

    박막의 두께별 빛의 파장에 따른 반사율 평균 비교

    figure, ((ax1, ax2, ax3, ax4)) = plt.subplots(nrows = 4,ncols = 1)
    figure.set_size_inches(15,30)
    
    train_layer1 = train.drop(['layer_2','layer_3','layer_4'],axis=1).groupby(['layer_1']).mean()
    train_layer2 = train.drop(['layer_1','layer_3','layer_4'],axis=1).groupby(['layer_2']).mean()
    train_layer3 = train.drop(['layer_1','layer_2','layer_4'],axis=1).groupby(['layer_3']).mean()
    train_layer4 = train.drop(['layer_1','layer_2','layer_3'],axis=1).groupby(['layer_4']).mean()
    
    sns.heatmap(train_layer1.T,ax = ax1)
    ax1.set_title('layer_1 heatmap',fontsize = 10)
    
    sns.heatmap(train_layer2.T,ax = ax2)
    ax2.set_title('layer_2 heatmap',fontsize = 10)
    
    sns.heatmap(train_layer3.T,ax = ax3)
    ax3.set_title('layer_3 heatmap',fontsize = 10)
    
    sns.heatmap(train_layer4.T,ax = ax4)
    ax4.set_title('layer_4 heatmap',fontsize = 10)

     

    6. 딥러닝 & DNN

    딥러닝은 연속된 층으로 표현을 학습한다는 개념으로 층 기반 표현 학습이나 계층적 표현 학습이라고도 한다.

    • feed-forward 방식
    • 1개 이상의 hidden layer를 가짐
    • fully-connected
    • bi-partie graph
    • hidden layer들을 여러 개 쌓아 상위 패턴을 인지함

    딥러닝의 목표

    정확한 값을 찾는 것

     

    딥러닝의 작동방법

    • 입력값들의 weighted sum과 bias에 대하여 활성화함수를 통해 비선형 패턴을 인지한다.
    • 처음부터 weight값을 정확하게 알아낼 수 없기 때문에 무작위 초기화를 거친 후 손실 점수가 낮아지는 방향으로 가중치를 조절해나가며 반복적으로 학습시킨다.
    • 손실 함수에서 나온 값을 피드백 신호로 사용하여 손실 점수를 낮추는 방향으로 가중치를 조금씩 조절해 나간다. 이 때 조절은 역전파 알고리즘을 구현하는 옵티마이저의 역할이다.
    # 독립변수와 종속변수를 분리한다
    train_X = train.iloc[:,4:]
    train_Y = train.iloc[:,0:4]
    test_X = test.iloc[:,1:]

    DNN의 정의

    모델의 은닉청을 많이 늘리면서 학습의 결과를 향상시키는 방법으로 은닉층을 2개 이상 갖고 있는 학습 방법

     

    DNN의 특징

    컴퓨터 스스로 학습을 반복하여 최적의 weight를 찾아 결과 도출

     

    # 케라스를 통해 모델 생성을 시작한다.
    import keras
    from keras.models import Sequential
    from keras.layers import Dense
    
    model = Sequential()  # model 초기화 
    model.add(Dense(units=160, activation='relu', input_dim=226))  # 첫 번째 은닉층  # 226개 feature, 160개 뉴런, relu 함수를 활성화 함수로 사용
    model.add(Dense(units=160, activation='relu'))   # 두 번째 은닉층  
    model.add(Dense(units=160, activation='relu'))   # 세 번째 은닉층
    model.add(Dense(units=4, activation='linear'))   # 출력층 (4개의 output을 도출해내야되기 때문에 units = 4)


    4회차 회고록 (2022.08.01)

     

    이번 모각코 시간에는 지금까지 공부한 머신러닝 지식을 바탕으로 데이콘의 반도체 박막 두께 분석하기 경진대회의 데이터를 분석해보았다. 이미 끝난 대회라 인터넷상에 자료가 많아 모르는 부분은 하나하나 찾아보고, 다른 사람들이 공유한 코드를 참고할 수 있어서 좋았다. 코드가 아니라 모듈 관련한 오류가 Pycharm에서 계속 뜨는 관계로, 계획한 것보다 많은 양을 공부하지는 못해서 아쉬웠다. 그렇지만 어떤 언어든 어떤 결과물이든 디버깅 과정을 통해서 배우는 것이 가장 많기 때문에 유익했다.

    댓글

Designed by Tistory.