Open danbi5228 opened 9 months ago
assign roles -s 1127 -c 1 2 3
0 | 1 | 2 | |
---|---|---|---|
member | 한단비 | 김유리 | 주선미 |
chapter | 1 | 2 | 3 |
tf.random.categorical()
함수를 사용해 모델이 추정한 확률을 기반으로 다음 글자를 무작위로 선택하는 방법 -> 다채로운 텍스트 생성 가능
categorical()
함수는 클래스의 로그 확률 (로짓) 을 전달하면 랜덤하게 클래스 인덱스를 샘플링함# 다음 글자를 선택하고 입력 텍스트에 추가
def next_char(text, temperature=1):
X_new = preprocess([text])
y_proba = model(X_new)[0. -1:, :]
rescaled_logits = tf.math.log(y_proba) / temperature
char_id = tf.random.categorical(rescaled_logits, num_samples=1) + 1
return tokenizer.seqeunces_to_texts(char_id.numpy())[0]
# 위 함수를 반복 호출하여 다음 글자를 얻고 텍스트에 추가
def complete_text(text, n_chars=50, temperature=1):
for _ in range(n_chars):
text += next_char(text, temperature)
return text
n_steps
보다 긴 패턴을 학습할 수 없음
model = keras.models.Sequential([
keras.layers.GRU(128, return_sequences=True, input_shape=[None, max_id],
dropout=0.2, recurrent_dropout=0.2),
keras.layers.GRU(128, return_sequences=True,
dropout=0.2, recurrent_dropout=0.2),
keras.layers.TimeDistributed(keras.layers.Dense(max_id, activation="softmax"))
])
model.compile(loss="sparse_categorical_crossentropy", optimizer="adam")
history = model.fit(dataset, epochs=20)
# 텍스트 주입 전 전처리
def preprocess(texts):
X = np.array(tokenizer.texts_to_sequences(texts)) - 1
return tf.one_hot(X, max_id)
# model 을 사용한 텍스트 다음 글자 예측하기
X_new = preprocess(["How are yo"])
Y_pred = np.argmax(model(X_new), axis=-1)
tokenizer.sequences_to_texts(Y_pred+1)[0][-1] # ID가 1부터 시작하므로 +1
### output: 'u' ==> 첫번째 문장의 마지막 글자
dataset = tf.data.Dataset.from_tensor_slices(encoded[:train_size])
dataset = dataset.window(window_length, shift=n_steps, drop_remainder=True)
dataset = dataset.flat_map(lambda window: window.batch(window_length))
dataset = dataset.batch(1)
dataset = dataset.map(lambda windows: (windows[:, :-1], windows[:, 1:]))
dataset = dataset.map(lambda X_batch, Y_batch: (tf.one_hot(X_batch, depth=max_id), Y_batch))
dataset = dataset.prefetch(1)
model = keras.models.Sequential([
keras.layers.GRU(128, return_sequences=True, stateful=True,
#dropout=0.2, recurrent_dropout=0.2,
dropout=0.2,
batch_input_shape=[batch_size, None, max_id]),
keras.layers.GRU(128, return_sequences=True, stateful=True,
#dropout=0.2, recurrent_dropout=0.2),
dropout=0.2),
keras.layers.TimeDistributed(keras.layers.Dense(max_id,
activation="softmax"))
])