ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 한국어 임베딩 gru,LSTM(ex06)
    EX 2022. 1. 20. 15:06

    https://github.com/Futuremine97/-E-06-emotionOFdata

     

    GitHub - Futuremine97/-E-06-emotionOFdata

    Contribute to Futuremine97/-E-06-emotionOFdata development by creating an account on GitHub.

    github.com

    GlobalMaxPooling1D

    1d CNN 할때 사용

     

     

     

     

    GRU

    LSTM

    2층으로 쌓으면 오류가 뜬다.

    GRU 가 더 나은듯  epoch 중간까지 이격이 있지만 곧 가까워진다

    손실함수로 KVLdivergence 썼을시 

    손실함수로 LogCosh 썼을 시 (위 사진)

    MeanSquaredLogarithmicError 썼을시

    경험적으로 binarycross 가 좋다

    batch size =10000으로 약 2배 늘렸을 때(위 사진)

     

     

    배치사이즈 6000 일 때 

     

     

    아래사진은 gru 노드를 64로 올렸을 때 (이격이 줄어드는 것으로 봐서 accuracy 를 약간 희생시키고 이익을 취하는듯)

    *******************dense 층에 정규화를 더해줌************(과적합막기위해)

    NO REgularization in dense layer 

    ------------------------------------------------------------------------------------------------------------------------

    l1 regul

    ----------------------------------------------------------------------------------------------------------------------

    l2 regularizatioin

    L2 regularization 이 vali acc 이 소폭 오르는 것을 볼 수 있다. 

    pretrained model, gru 사용시
    Bidirectional LSTM 

    Bidirectional LSTM 이 GRU 보다 성능이 더 좋음을 확인하였다

    model = keras.Sequential()
    model.add(keras.layers.Embedding(vocab_size, 
                                     word_vector_dim, 
                                     embeddings_initializer=Constant(embedding_matrix), 
                                     # 카피한 임베딩을 여기서 활용!!!
                                     input_length=maxlen, 
                                     trainable=True))   
    # trainable을 True로 주면 Fine-tuning
    #임베딩 레이어 다음에 LSTM 레이어가 오는 경우에는 임베딩 레이어에 input_length 인자를 따로 설정할 필요는 없습니다. 
    model.add(keras.layers.Bidirectional(LSTM(64, return_sequences=True)))
    model.add(keras.layers.Bidirectional(LSTM(32, return_sequences=True)))
    model.add(keras.layers.Dense(8, activation='relu'))
    model.add(keras.layers.Dense(1, activation='sigmoid'))

    LSTM stacked 은 더 부드럽게 올라간다.

    L2 normalization 했을 때 이격이 줄어들었다!

    from tensorflow.keras import regularizers
    
    tf.keras.regularizers.l2(l2=0.04)
    
    model.add(keras.layers.Dense(8, activation='relu',kernel_regularizer='l2'))

    이제 L2 의 rate 을 올려보겠다!

     

    0.06으로 조정했을때 더 이격이 줄어들었다. !!! epoch 11부터는 아주 가까워진다!

    '

     

    ************************************************************************************

    bidirectional LSTM 3층으로 stack 했을시 --> 정확도에 좋음 epoch 14 정도가 좋을 듯하다. 

    *******

    ************************************************************************************************

    실험_drop out 도 추가해서 과도하게 정규화 했을 때의 그래프. 정확도는 높게 나온다. 

    model.add(keras.layers.Bidirectional(GRU(64, return_sequences=True,dropout=0.5)))
    model.add(keras.layers.Bidirectional(LSTM(32, return_sequences=True, dropout=0.5)))
    model.add(keras.layers.Bidirectional(GRU(16, return_sequences=True,dropout=0.5)))
    model.add(keras.layers.Dense(8, activation='relu',kernel_regularizer='l2'))

    ************************************************************************************************

    실험_ dropout 1개만 살리기

    model.add(keras.layers.Bidirectional(GRU(64, return_sequences=True,dropout=0.5)))
    model.add(keras.layers.Bidirectional(LSTM(32, return_sequences=True)))
    model.add(keras.layers.Bidirectional(GRU(16, return_sequences=True)))
    model.add(keras.layers.Dense(8, activation='relu',kernel_regularizer='l2'))
    model.add(keras.layers.Dense(1, activation='sigmoid'))

    정확도가 소폭 증가..

    loss 도 좋아졌다

    ************************************************************************************************

    node 64개로 증가

     

    model.add(keras.layers.Bidirectional(GRU(64, return_sequences=True,dropout=0.5)))
    model.add(keras.layers.Bidirectional(LSTM(64, return_sequences=True)))
    model.add(keras.layers.Bidirectional(GRU(64, return_sequences=True)))
    model.add(keras.layers.Dense(8, activation='relu',kernel_regularizer='l2'))
    model.add(keras.layers.Dense(1, activation='sigmoid'))

    ************************************************************************************************

     

    자 이걸 작은 데이터에 이식해보자

     

    **********************************************************************************************************************

    실험

     

    from keras.layers import LeakyReLU
    vocab_size = 40000    # 어휘 사전의 크기입니다(10,000개의 단어)
    word_vector_dim = 40  # 워드 벡터의 차원 수 (변경 가능한 하이퍼파라미터)
    from tensorflow.keras import regularizers
    
    tf.keras.regularizers.l2(l2=0.6)
    # model 설계 - 딥러닝 모델 코드를 직접 작성해 주세요.
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Embedding(vocab_size, word_vector_dim, input_shape=(None,)))
    
    #word_vector_dim 이 값이 128이라면 단어를 128차원의 의미론적 기하공간에 나타낸다는 의미입니다.
    # model.add(tf.keras.layers.Conv1D(16, 7, activation='relu'))
    # model.add(tf.keras.layers.MaxPooling1D(3))
    model.add(keras.layers.Bidirectional(GRU(64, return_sequences=True,dropout=0.9)))
    model.add(keras.layers.Bidirectional(GRU(64, return_sequences=True,dropout=0.5)))
    model.add(keras.layers.Bidirectional(GRU(64, return_sequences=True,dropout=0.9)))
    model.add(keras.layers.Bidirectional(GRU(64, return_sequences=True,dropout=0.9)))
    model.add(keras.layers.Bidirectional(GRU(64, return_sequences=True,dropout=0.9)))
    model.add(keras.layers.Dense(8, activation='LeakyReLU', kernel_regularizer='l2'))
    model.add(keras.layers.Dense(1, activation='sigmoid'))
    
    
    model.summary()

    **********************************************************************************************************************

    회고

    높은 학습률을 가지고 있으므로 이를 수정한다면 위의실험은 더 잘 나올 것이다!

     

Designed by Tistory.