# 순서
* 모델 구축
* 입력값 토큰화, 임베딩
* 훈련을 정의하고 학습
* 평가
* 예측하기 위한 데이터를 토큰화, 임베딩후 predict
* 라벨 출력
import tensorflow as tf
from tensorflow.keras import Model, layers
# 인코더 입력 정의: 영문 단어가 입력, 각 단어는 4자 길이, 모든 문자의 수는 171개
enc_input = layers.Input(shape=(4, 171))
# 인코더 LSTM 정의: 모든 타임스텝의 출력을 반환하도록 설정
enc_output, state_h, state_c = layers.LSTM(128, return_sequences=True, return_state=True)(enc_input)
# 디코더 입력 정의
dec_input = layers.Input(shape=(3, 171)) # 한글 단어는 2자 길이 + <Start> 토큰, 모든 문자의 수는 171개
# 디코더 LSTM 정의: 모든 시퀀스의 출력을 반환하도록 설정
dec_lstm_output, _, _ = layers.LSTM(128, return_sequences=True, return_state=True)(dec_input, initial_state=[state_h, state_c])
# 어텐션 메커니즘 정의
context_vector = layers.Attention()([dec_lstm_output, enc_output])
# 컨텍스트 벡터와 디코더 LSTM 출력을 결합
context_and_lstm_output = layers.Concatenate()([context_vector, dec_lstm_output])
# 디코더 출력층 정의: 출력 크기는 모든 문자의 수인 171, softmax 활성화 함수를 사용
output = layers.Dense(171, activation='softmax')(context_and_lstm_output)
# 모델 정의: 인코더 입력(enc_input)과 디코더 입력(dec_input)을 모델의 입력으로, 디코더 출력을 모델의 출력으로 설정
model = Model(inputs=[enc_input, dec_input], outputs=[output])
# 모델 요약 출력
model.summary()
raw = pd.read_csv('./data/translate.csv', header=None)
eng_kor = raw.values.tolist()
print(len(eng_kor))
110
temp_eng = 'love'
temp_eng_n = [char_to_num[c] for c in temp_eng]
print(temp_eng_n)
temp_kor = '사랑'
np.eye(171)[temp_eng_n].shape
[14, 17, 24, 7]
(4, 171)
def encode(eng_kor):
enc_in = []
dec_in = []
rnn_out = [] # decoder output
for seq in eng_kor:
eng = [char_to_num[c] for c in seq[0]]
enc_in.append(np.eye(171)[eng])
kor = [char_to_num[c] for c in ('S'+seq[1])]
dec_in.append(np.eye(171)[kor])
target = [char_to_num[c] for c in (seq[1] + 'E')]
rnn_out.append(target)
enc_in = np.array(enc_in)
dec_in = np.array(dec_in)
rnn_out = np.array(rnn_out)
rnn_out = np.expand_dims(rnn_out, axis=2)
return enc_in, dec_in, rnn_out
for i in range(len(choose)):
eng = choose[i][0]
word = np.argmax(pred[i], axis=-1)
kor = ''
for j in range(2):
kor = kor + num_to_char[word[j]]
print(eng, kor)