-
한국어 임베딩 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()
**********************************************************************************************************************
회고 높은 학습률을 가지고 있으므로 이를 수정한다면 위의실험은 더 잘 나올 것이다!