1006 lines
149 KiB
Plaintext
1006 lines
149 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 232,
|
|
"id": "02cbdb19",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import numpy as np\n",
|
|
"import json\n",
|
|
"import random\n",
|
|
"import tensorflow as tf\n",
|
|
"from tensorflow.keras.preprocessing.text import Tokenizer\n",
|
|
"from tensorflow.keras.preprocessing.sequence import pad_sequences\n",
|
|
"from tensorflow.keras.models import Model, load_model\n",
|
|
"from tensorflow.keras.layers import (\n",
|
|
" Input,\n",
|
|
" LSTM,\n",
|
|
" Dense,\n",
|
|
" Embedding,\n",
|
|
" Bidirectional,\n",
|
|
" Concatenate,\n",
|
|
" Dropout,\n",
|
|
")\n",
|
|
"from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping\n",
|
|
"from sklearn.model_selection import train_test_split\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"import re\n",
|
|
"from rouge_score import rouge_scorer\n",
|
|
"from nltk.translate.bleu_score import sentence_bleu\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 233,
|
|
"id": "f9c0af74",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"total context 885\n",
|
|
"total question 1547\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Load data\n",
|
|
"with open(\"../dataset/valid_data.json\", \"r\") as f:\n",
|
|
" data = json.load(f)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Preprocessing function\n",
|
|
"def preprocess_text(text):\n",
|
|
" \"\"\"Melakukan preprocessing teks dasar\"\"\"\n",
|
|
" text = text.lower()\n",
|
|
" text = re.sub(r\"\\s+\", \" \", text).strip()\n",
|
|
"\n",
|
|
" return text\n",
|
|
"\n",
|
|
"\n",
|
|
"# Persiapkan data untuk model prediksi pertanyaan\n",
|
|
"def prepare_question_prediction_data(data):\n",
|
|
" \"\"\"Siapkan data untuk model prediksi pertanyaan\"\"\"\n",
|
|
" contexts = []\n",
|
|
" tokens_list = []\n",
|
|
" ner_list = []\n",
|
|
" srl_list = []\n",
|
|
" questions = []\n",
|
|
" q_types = []\n",
|
|
"\n",
|
|
" for item in data:\n",
|
|
" \n",
|
|
" for qa in item[\"qas\"]:\n",
|
|
" # if qa[\"question\"] == \"\":\n",
|
|
" # continue\n",
|
|
" context = preprocess_text(item[\"context\"])\n",
|
|
" contexts.append(context)\n",
|
|
" token = [preprocess_text(token) for token in item[\"tokens\"]]\n",
|
|
" tokens_list.append(token)\n",
|
|
" ner_list.append(item[\"ner\"])\n",
|
|
" srl_list.append(item[\"srl\"])\n",
|
|
" questions.append(preprocess_text(qa[\"question\"]))\n",
|
|
" q_types.append(qa[\"type\"])\n",
|
|
" # Tidak mengambil jawaban (answer) sebagai input\n",
|
|
" print(\"total context \", len(data))\n",
|
|
" print(\"total question \", len(questions))\n",
|
|
" return contexts, tokens_list, ner_list, srl_list, questions, q_types\n",
|
|
"\n",
|
|
"\n",
|
|
"contexts, tokens_list, ner_list, srl_list, questions, q_types = (\n",
|
|
" prepare_question_prediction_data(data)\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 234,
|
|
"id": "952f71da",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Tokenizer untuk teks (context, question)\n",
|
|
"max_vocab_size = 10000\n",
|
|
"tokenizer = Tokenizer(num_words=max_vocab_size, oov_token=\"<OOV>\")\n",
|
|
"all_texts = contexts + questions + [\" \".join(item) for item in tokens_list]\n",
|
|
"tokenizer.fit_on_texts(all_texts)\n",
|
|
"vocab_size = len(tokenizer.word_index) + 1\n",
|
|
"\n",
|
|
"# Encoding untuk NER\n",
|
|
"ner_tokenizer = Tokenizer(oov_token=\"<OOV>\")\n",
|
|
"ner_tokenizer.fit_on_texts([\" \".join(ner) for ner in ner_list])\n",
|
|
"ner_vocab_size = len(ner_tokenizer.word_index) + 1\n",
|
|
"\n",
|
|
"# Encoding untuk SRL\n",
|
|
"srl_tokenizer = Tokenizer(oov_token=\"<OOV>\")\n",
|
|
"srl_tokenizer.fit_on_texts([\" \".join(srl) for srl in srl_list])\n",
|
|
"srl_vocab_size = len(srl_tokenizer.word_index) + 1\n",
|
|
"\n",
|
|
"# Encoding untuk tipe pertanyaan\n",
|
|
"q_type_tokenizer = Tokenizer()\n",
|
|
"q_type_tokenizer.fit_on_texts(q_types)\n",
|
|
"q_type_vocab_size = len(q_type_tokenizer.word_index) + 1\n",
|
|
"\n",
|
|
"\n",
|
|
"# Konversi token, ner, srl ke sequences\n",
|
|
"def tokens_to_sequences(tokens, ner, srl):\n",
|
|
" \"\"\"Konversi token, ner, dan srl ke sequences\"\"\"\n",
|
|
" token_seqs = [tokenizer.texts_to_sequences([\" \".join(t)])[0] for t in tokens]\n",
|
|
" ner_seqs = [ner_tokenizer.texts_to_sequences([\" \".join(n)])[0] for n in ner]\n",
|
|
" srl_seqs = [srl_tokenizer.texts_to_sequences([\" \".join(s)])[0] for s in srl]\n",
|
|
" return token_seqs, ner_seqs, srl_seqs\n",
|
|
"\n",
|
|
"\n",
|
|
"# Sequences\n",
|
|
"context_seqs = tokenizer.texts_to_sequences(contexts)\n",
|
|
"question_seqs = tokenizer.texts_to_sequences(questions)\n",
|
|
"token_seqs, ner_seqs, srl_seqs = tokens_to_sequences(tokens_list, ner_list, srl_list)\n",
|
|
"\n",
|
|
"# Menentukan panjang maksimum untuk padding\n",
|
|
"max_context_len = max([len(seq) for seq in context_seqs])\n",
|
|
"max_question_len = max([len(seq) for seq in question_seqs])\n",
|
|
"max_token_len = max([len(seq) for seq in token_seqs])\n",
|
|
"\n",
|
|
"\n",
|
|
"# Pad sequences untuk memastikan semua input sama panjang\n",
|
|
"def pad_all_sequences(context_seqs, token_seqs, ner_seqs, srl_seqs, question_seqs):\n",
|
|
" \"\"\"Padding semua sequences\"\"\"\n",
|
|
" context_padded = pad_sequences(context_seqs, maxlen=max_context_len, padding=\"post\")\n",
|
|
" token_padded = pad_sequences(token_seqs, maxlen=max_token_len, padding=\"post\")\n",
|
|
" ner_padded = pad_sequences(ner_seqs, maxlen=max_token_len, padding=\"post\")\n",
|
|
" srl_padded = pad_sequences(srl_seqs, maxlen=max_token_len, padding=\"post\")\n",
|
|
" question_padded = pad_sequences(\n",
|
|
" question_seqs, maxlen=max_question_len, padding=\"post\"\n",
|
|
" )\n",
|
|
" return (\n",
|
|
" context_padded,\n",
|
|
" token_padded,\n",
|
|
" ner_padded,\n",
|
|
" srl_padded,\n",
|
|
" question_padded,\n",
|
|
" )\n",
|
|
"\n",
|
|
"\n",
|
|
"# Encode tipe pertanyaan\n",
|
|
"q_type_indices = []\n",
|
|
"for q_type in q_types:\n",
|
|
" q_type_idx = q_type_tokenizer.word_index.get(q_type, 0)\n",
|
|
" q_type_indices.append(q_type_idx)\n",
|
|
"\n",
|
|
"# Konversi ke numpy array\n",
|
|
"q_type_indices = np.array(q_type_indices)\n",
|
|
"\n",
|
|
"# One-hot encode tipe pertanyaan\n",
|
|
"q_type_categorical = tf.keras.utils.to_categorical(\n",
|
|
" q_type_indices, num_classes=q_type_vocab_size\n",
|
|
")\n",
|
|
"\n",
|
|
"# Pad sequences\n",
|
|
"context_padded, token_padded, ner_padded, srl_padded, question_padded = (\n",
|
|
" pad_all_sequences(context_seqs, token_seqs, ner_seqs, srl_seqs, question_seqs)\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 235,
|
|
"id": "37ffc0e5",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"\n",
|
|
"indices = list(range(len(context_padded)))\n",
|
|
"train_indices, test_indices = train_test_split(indices, test_size=0.1, random_state=42)\n",
|
|
"\n",
|
|
"\n",
|
|
"def get_subset(data, indices):\n",
|
|
" return np.array([data[i] for i in indices])\n",
|
|
"\n",
|
|
"\n",
|
|
"# Train data\n",
|
|
"train_context = get_subset(context_padded, train_indices)\n",
|
|
"train_token = get_subset(token_padded, train_indices)\n",
|
|
"train_ner = get_subset(ner_padded, train_indices)\n",
|
|
"train_srl = get_subset(srl_padded, train_indices)\n",
|
|
"train_q_type = get_subset(q_type_categorical, train_indices)\n",
|
|
"train_question = get_subset(question_padded, train_indices)\n",
|
|
"\n",
|
|
"# Test data\n",
|
|
"test_context = get_subset(context_padded, test_indices)\n",
|
|
"test_token = get_subset(token_padded, test_indices)\n",
|
|
"test_ner = get_subset(ner_padded, test_indices)\n",
|
|
"test_srl = get_subset(srl_padded, test_indices)\n",
|
|
"test_q_type = get_subset(q_type_categorical, test_indices)\n",
|
|
"test_question = get_subset(question_padded, test_indices)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 236,
|
|
"id": "df580682",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"functional_28\"</span>\n",
|
|
"</pre>\n"
|
|
],
|
|
"text/plain": [
|
|
"\u001b[1mModel: \"functional_28\"\u001b[0m\n"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┓\n",
|
|
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃<span style=\"font-weight: bold\"> Connected to </span>┃\n",
|
|
"┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━┩\n",
|
|
"│ context_input │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">38</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ - │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">InputLayer</span>) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ token_input │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">38</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ - │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">InputLayer</span>) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ ner_input │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">38</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ - │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">InputLayer</span>) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ srl_input │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">38</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ - │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">InputLayer</span>) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ text_embedding │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">38</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">100</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">223,000</span> │ context_input[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]… │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Embedding</span>) │ │ │ token_input[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>] │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ ner_embedding │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">38</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">50</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">1,700</span> │ ner_input[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>] │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Embedding</span>) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ srl_embedding │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">38</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">50</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">1,500</span> │ srl_input[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>] │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Embedding</span>) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ bidirectional_56 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">38</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">234,496</span> │ text_embedding[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>… │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Bidirectional</span>) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ token_features │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">38</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">200</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ text_embedding[<span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>… │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Concatenate</span>) │ │ │ ner_embedding[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]… │\n",
|
|
"│ │ │ │ srl_embedding[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]… │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ context_attention │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">38</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ bidirectional_56… │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Attention</span>) │ │ │ bidirectional_56… │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ bidirectional_57 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">38</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">336,896</span> │ token_features[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>… │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Bidirectional</span>) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ context_att_pool │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ context_attentio… │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">GlobalMaxPooling1…</span> │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ token_pool │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ bidirectional_57… │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">GlobalMaxPooling1…</span> │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ q_type_input │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">5</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ - │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">InputLayer</span>) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ all_features │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">517</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ context_att_pool… │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Concatenate</span>) │ │ │ token_pool[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>], │\n",
|
|
"│ │ │ │ q_type_input[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">…</span> │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ dense_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">265,216</span> │ all_features[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">…</span> │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ dropout_56 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ dense_1[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>] │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ dense_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">131,328</span> │ dropout_56[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>] │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ dropout_57 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ dense_2[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>] │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ decoder_input │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">65,792</span> │ dropout_57[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>] │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ repeat_vector_28 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">15</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ decoder_input[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]… │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">RepeatVector</span>) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ decoder_lstm (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">LSTM</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">15</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">525,312</span> │ repeat_vector_28… │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ time_distributed_28 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">15</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">2230</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">573,110</span> │ decoder_lstm[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">…</span> │\n",
|
|
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">TimeDistributed</span>) │ │ │ │\n",
|
|
"└─────────────────────┴───────────────────┴────────────┴───────────────────┘\n",
|
|
"</pre>\n"
|
|
],
|
|
"text/plain": [
|
|
"┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┓\n",
|
|
"┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mConnected to \u001b[0m\u001b[1m \u001b[0m┃\n",
|
|
"┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━┩\n",
|
|
"│ context_input │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m38\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ - │\n",
|
|
"│ (\u001b[38;5;33mInputLayer\u001b[0m) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ token_input │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m38\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ - │\n",
|
|
"│ (\u001b[38;5;33mInputLayer\u001b[0m) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ ner_input │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m38\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ - │\n",
|
|
"│ (\u001b[38;5;33mInputLayer\u001b[0m) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ srl_input │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m38\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ - │\n",
|
|
"│ (\u001b[38;5;33mInputLayer\u001b[0m) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ text_embedding │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m38\u001b[0m, \u001b[38;5;34m100\u001b[0m) │ \u001b[38;5;34m223,000\u001b[0m │ context_input[\u001b[38;5;34m0\u001b[0m]… │\n",
|
|
"│ (\u001b[38;5;33mEmbedding\u001b[0m) │ │ │ token_input[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ ner_embedding │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m38\u001b[0m, \u001b[38;5;34m50\u001b[0m) │ \u001b[38;5;34m1,700\u001b[0m │ ner_input[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
|
|
"│ (\u001b[38;5;33mEmbedding\u001b[0m) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ srl_embedding │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m38\u001b[0m, \u001b[38;5;34m50\u001b[0m) │ \u001b[38;5;34m1,500\u001b[0m │ srl_input[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
|
|
"│ (\u001b[38;5;33mEmbedding\u001b[0m) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ bidirectional_56 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m38\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m234,496\u001b[0m │ text_embedding[\u001b[38;5;34m0\u001b[0m… │\n",
|
|
"│ (\u001b[38;5;33mBidirectional\u001b[0m) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ token_features │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m38\u001b[0m, \u001b[38;5;34m200\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ text_embedding[\u001b[38;5;34m1\u001b[0m… │\n",
|
|
"│ (\u001b[38;5;33mConcatenate\u001b[0m) │ │ │ ner_embedding[\u001b[38;5;34m0\u001b[0m]… │\n",
|
|
"│ │ │ │ srl_embedding[\u001b[38;5;34m0\u001b[0m]… │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ context_attention │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m38\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ bidirectional_56… │\n",
|
|
"│ (\u001b[38;5;33mAttention\u001b[0m) │ │ │ bidirectional_56… │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ bidirectional_57 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m38\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m336,896\u001b[0m │ token_features[\u001b[38;5;34m0\u001b[0m… │\n",
|
|
"│ (\u001b[38;5;33mBidirectional\u001b[0m) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ context_att_pool │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ context_attentio… │\n",
|
|
"│ (\u001b[38;5;33mGlobalMaxPooling1…\u001b[0m │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ token_pool │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ bidirectional_57… │\n",
|
|
"│ (\u001b[38;5;33mGlobalMaxPooling1…\u001b[0m │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ q_type_input │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m5\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ - │\n",
|
|
"│ (\u001b[38;5;33mInputLayer\u001b[0m) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ all_features │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m517\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ context_att_pool… │\n",
|
|
"│ (\u001b[38;5;33mConcatenate\u001b[0m) │ │ │ token_pool[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m], │\n",
|
|
"│ │ │ │ q_type_input[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m…\u001b[0m │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m265,216\u001b[0m │ all_features[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m…\u001b[0m │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ dropout_56 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ dense_1[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
|
|
"│ (\u001b[38;5;33mDropout\u001b[0m) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ dense_2 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m131,328\u001b[0m │ dropout_56[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ dropout_57 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ dense_2[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
|
|
"│ (\u001b[38;5;33mDropout\u001b[0m) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ decoder_input │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m65,792\u001b[0m │ dropout_57[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m] │\n",
|
|
"│ (\u001b[38;5;33mDense\u001b[0m) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ repeat_vector_28 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m15\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │ decoder_input[\u001b[38;5;34m0\u001b[0m]… │\n",
|
|
"│ (\u001b[38;5;33mRepeatVector\u001b[0m) │ │ │ │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ decoder_lstm (\u001b[38;5;33mLSTM\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m15\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m525,312\u001b[0m │ repeat_vector_28… │\n",
|
|
"├─────────────────────┼───────────────────┼────────────┼───────────────────┤\n",
|
|
"│ time_distributed_28 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m15\u001b[0m, \u001b[38;5;34m2230\u001b[0m) │ \u001b[38;5;34m573,110\u001b[0m │ decoder_lstm[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m…\u001b[0m │\n",
|
|
"│ (\u001b[38;5;33mTimeDistributed\u001b[0m) │ │ │ │\n",
|
|
"└─────────────────────┴───────────────────┴────────────┴───────────────────┘\n"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">2,358,350</span> (9.00 MB)\n",
|
|
"</pre>\n"
|
|
],
|
|
"text/plain": [
|
|
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m2,358,350\u001b[0m (9.00 MB)\n"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">2,358,350</span> (9.00 MB)\n",
|
|
"</pre>\n"
|
|
],
|
|
"text/plain": [
|
|
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m2,358,350\u001b[0m (9.00 MB)\n"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
|
|
"</pre>\n"
|
|
],
|
|
"text/plain": [
|
|
"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"embedding_dim = 100\n",
|
|
"lstm_units = 128\n",
|
|
"ner_embedding_dim = 50\n",
|
|
"srl_embedding_dim = 50\n",
|
|
"dropout_rate = 0.3\n",
|
|
"\n",
|
|
"\n",
|
|
"# Function untuk membuat model prediksi pertanyaan\n",
|
|
"def create_question_prediction_model():\n",
|
|
" # Input layers\n",
|
|
" context_input = Input(shape=(max_context_len,), name=\"context_input\")\n",
|
|
" token_input = Input(shape=(max_token_len,), name=\"token_input\")\n",
|
|
" ner_input = Input(shape=(max_token_len,), name=\"ner_input\")\n",
|
|
" srl_input = Input(shape=(max_token_len,), name=\"srl_input\")\n",
|
|
" q_type_input = Input(shape=(q_type_vocab_size,), name=\"q_type_input\")\n",
|
|
"\n",
|
|
" # Shared embedding layer for text\n",
|
|
" text_embedding = Embedding(vocab_size, embedding_dim, name=\"text_embedding\")\n",
|
|
"\n",
|
|
" # Embedding untuk NER dan SRL\n",
|
|
" ner_embedding = Embedding(ner_vocab_size, ner_embedding_dim, name=\"ner_embedding\")(\n",
|
|
" ner_input\n",
|
|
" )\n",
|
|
" srl_embedding = Embedding(srl_vocab_size, srl_embedding_dim, name=\"srl_embedding\")(\n",
|
|
" srl_input\n",
|
|
" )\n",
|
|
"\n",
|
|
" # Apply embeddings\n",
|
|
" context_embed = text_embedding(context_input)\n",
|
|
" token_embed = text_embedding(token_input)\n",
|
|
"\n",
|
|
" # Bi-directional LSTM untuk context dan token-level features\n",
|
|
" context_lstm = Bidirectional(\n",
|
|
" LSTM(lstm_units, return_sequences=True, name=\"context_lstm\")\n",
|
|
" )(context_embed)\n",
|
|
"\n",
|
|
" # Concat token features (tokens, NER, SRL)\n",
|
|
" token_features = Concatenate(name=\"token_features\")(\n",
|
|
" [token_embed, ner_embedding, srl_embedding]\n",
|
|
" )\n",
|
|
" token_lstm = Bidirectional(\n",
|
|
" LSTM(lstm_units, return_sequences=True, name=\"token_lstm\")\n",
|
|
" )(token_features)\n",
|
|
"\n",
|
|
" # Apply attention to context LSTM\n",
|
|
" context_attention = tf.keras.layers.Attention(name=\"context_attention\")(\n",
|
|
" [context_lstm, context_lstm]\n",
|
|
" )\n",
|
|
"\n",
|
|
" # Pool attention outputs\n",
|
|
" context_att_pool = tf.keras.layers.GlobalMaxPooling1D(name=\"context_att_pool\")(\n",
|
|
" context_attention\n",
|
|
" )\n",
|
|
" token_pool = tf.keras.layers.GlobalMaxPooling1D(name=\"token_pool\")(token_lstm)\n",
|
|
"\n",
|
|
" # Concat all features (tidak ada answer feature)\n",
|
|
" all_features = Concatenate(name=\"all_features\")(\n",
|
|
" [context_att_pool, token_pool, q_type_input]\n",
|
|
" )\n",
|
|
"\n",
|
|
" # Dense layers with expanded capacity for sequence generation\n",
|
|
" x = Dense(512, activation=\"relu\", name=\"dense_1\")(all_features)\n",
|
|
" x = Dropout(dropout_rate)(x)\n",
|
|
" x = Dense(256, activation=\"relu\", name=\"dense_2\")(x)\n",
|
|
" x = Dropout(dropout_rate)(x)\n",
|
|
"\n",
|
|
" # Reshape untuk sequence decoder\n",
|
|
" decoder_dense = Dense(vocab_size, activation=\"softmax\", name=\"decoder_dense\")\n",
|
|
"\n",
|
|
" # Many-to-many architecture for sequence generation\n",
|
|
" # Decoder LSTM\n",
|
|
" decoder_lstm = LSTM(lstm_units * 2, return_sequences=True, name=\"decoder_lstm\")\n",
|
|
"\n",
|
|
" # Reshape untuk input ke decoder\n",
|
|
" decoder_input = Dense(lstm_units * 2, activation=\"relu\", name=\"decoder_input\")(x)\n",
|
|
"\n",
|
|
" # Decoder sequence with teacher forcing\n",
|
|
" # Expand dimensionality to match expected sequence length\n",
|
|
" repeated_vector = tf.keras.layers.RepeatVector(max_question_len)(decoder_input)\n",
|
|
"\n",
|
|
" # Process through decoder LSTM\n",
|
|
" decoder_outputs = decoder_lstm(repeated_vector)\n",
|
|
"\n",
|
|
" # Apply dense layer to each timestep\n",
|
|
" question_output_seq = tf.keras.layers.TimeDistributed(decoder_dense)(\n",
|
|
" decoder_outputs\n",
|
|
" )\n",
|
|
"\n",
|
|
" # Create model\n",
|
|
" model = Model(\n",
|
|
" inputs=[\n",
|
|
" context_input,\n",
|
|
" token_input,\n",
|
|
" ner_input,\n",
|
|
" srl_input,\n",
|
|
" q_type_input,\n",
|
|
" ],\n",
|
|
" outputs=question_output_seq,\n",
|
|
" )\n",
|
|
"\n",
|
|
" # Compile model with categorical crossentropy for sequence prediction\n",
|
|
" model.compile(\n",
|
|
" optimizer=\"adam\", loss=\"sparse_categorical_crossentropy\", metrics=[\"accuracy\"]\n",
|
|
" )\n",
|
|
"\n",
|
|
" return model\n",
|
|
"\n",
|
|
"\n",
|
|
"# Buat model\n",
|
|
"model = create_question_prediction_model()\n",
|
|
"model.summary()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 237,
|
|
"id": "6ba404db",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Epoch 1/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 33ms/step - accuracy: 0.5786 - loss: 3.9592 - val_accuracy: 0.6116 - val_loss: 3.1082\n",
|
|
"Epoch 2/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 31ms/step - accuracy: 0.5971 - loss: 3.1858 - val_accuracy: 0.6116 - val_loss: 3.1365\n",
|
|
"Epoch 3/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 30ms/step - accuracy: 0.5928 - loss: 3.2108 - val_accuracy: 0.6116 - val_loss: 3.1620\n",
|
|
"Epoch 4/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 30ms/step - accuracy: 0.5948 - loss: 3.1941 - val_accuracy: 0.6116 - val_loss: 3.1563\n",
|
|
"Epoch 5/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 29ms/step - accuracy: 0.5946 - loss: 3.1758 - val_accuracy: 0.6116 - val_loss: 3.1728\n",
|
|
"Epoch 6/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 29ms/step - accuracy: 0.5903 - loss: 3.2268 - val_accuracy: 0.6159 - val_loss: 2.7813\n",
|
|
"Epoch 7/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 29ms/step - accuracy: 0.5928 - loss: 2.8195 - val_accuracy: 0.6211 - val_loss: 2.6252\n",
|
|
"Epoch 8/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 30ms/step - accuracy: 0.6025 - loss: 2.5904 - val_accuracy: 0.6297 - val_loss: 2.4973\n",
|
|
"Epoch 9/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 42ms/step - accuracy: 0.6069 - loss: 2.4412 - val_accuracy: 0.6275 - val_loss: 2.4201\n",
|
|
"Epoch 10/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 39ms/step - accuracy: 0.6119 - loss: 2.3208 - val_accuracy: 0.6366 - val_loss: 2.3665\n",
|
|
"Epoch 11/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 38ms/step - accuracy: 0.6227 - loss: 2.2139 - val_accuracy: 0.6262 - val_loss: 2.4020\n",
|
|
"Epoch 12/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 38ms/step - accuracy: 0.6178 - loss: 2.2268 - val_accuracy: 0.6374 - val_loss: 2.3140\n",
|
|
"Epoch 13/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 31ms/step - accuracy: 0.6248 - loss: 2.1265 - val_accuracy: 0.6366 - val_loss: 2.3042\n",
|
|
"Epoch 14/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 32ms/step - accuracy: 0.6324 - loss: 2.0259 - val_accuracy: 0.6391 - val_loss: 2.2853\n",
|
|
"Epoch 15/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 33ms/step - accuracy: 0.6329 - loss: 2.0069 - val_accuracy: 0.6404 - val_loss: 2.3148\n",
|
|
"Epoch 16/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 37ms/step - accuracy: 0.6383 - loss: 1.9446 - val_accuracy: 0.6413 - val_loss: 2.2754\n",
|
|
"Epoch 17/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 37ms/step - accuracy: 0.6401 - loss: 1.8801 - val_accuracy: 0.6413 - val_loss: 2.2676\n",
|
|
"Epoch 18/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 38ms/step - accuracy: 0.6344 - loss: 1.9068 - val_accuracy: 0.6335 - val_loss: 2.2629\n",
|
|
"Epoch 19/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 33ms/step - accuracy: 0.6443 - loss: 1.8184 - val_accuracy: 0.6452 - val_loss: 2.2510\n",
|
|
"Epoch 20/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 33ms/step - accuracy: 0.6421 - loss: 1.8101 - val_accuracy: 0.6469 - val_loss: 2.2595\n",
|
|
"Epoch 21/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 36ms/step - accuracy: 0.6446 - loss: 1.7495 - val_accuracy: 0.6447 - val_loss: 2.2468\n",
|
|
"Epoch 22/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 43ms/step - accuracy: 0.6548 - loss: 1.6756 - val_accuracy: 0.6490 - val_loss: 2.2446\n",
|
|
"Epoch 23/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 44ms/step - accuracy: 0.6496 - loss: 1.7023 - val_accuracy: 0.6486 - val_loss: 2.2361\n",
|
|
"Epoch 24/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 42ms/step - accuracy: 0.6569 - loss: 1.6375 - val_accuracy: 0.6529 - val_loss: 2.2133\n",
|
|
"Epoch 25/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 33ms/step - accuracy: 0.6502 - loss: 1.6494 - val_accuracy: 0.6555 - val_loss: 2.2114\n",
|
|
"Epoch 26/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 35ms/step - accuracy: 0.6558 - loss: 1.5882 - val_accuracy: 0.6529 - val_loss: 2.2064\n",
|
|
"Epoch 27/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 39ms/step - accuracy: 0.6576 - loss: 1.5667 - val_accuracy: 0.6520 - val_loss: 2.1910\n",
|
|
"Epoch 28/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m8s\u001b[0m 43ms/step - accuracy: 0.6555 - loss: 1.5541 - val_accuracy: 0.6551 - val_loss: 2.2115\n",
|
|
"Epoch 29/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 42ms/step - accuracy: 0.6600 - loss: 1.5206 - val_accuracy: 0.6495 - val_loss: 2.1997\n",
|
|
"Epoch 30/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 37ms/step - accuracy: 0.6662 - loss: 1.4696 - val_accuracy: 0.6542 - val_loss: 2.1782\n",
|
|
"Epoch 31/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 31ms/step - accuracy: 0.6640 - loss: 1.4697 - val_accuracy: 0.6637 - val_loss: 2.1796\n",
|
|
"Epoch 32/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 32ms/step - accuracy: 0.6719 - loss: 1.4041 - val_accuracy: 0.6649 - val_loss: 2.1719\n",
|
|
"Epoch 33/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 33ms/step - accuracy: 0.6746 - loss: 1.3823 - val_accuracy: 0.6615 - val_loss: 2.1888\n",
|
|
"Epoch 34/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 34ms/step - accuracy: 0.6811 - loss: 1.3666 - val_accuracy: 0.6692 - val_loss: 2.1327\n",
|
|
"Epoch 35/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 38ms/step - accuracy: 0.6868 - loss: 1.3061 - val_accuracy: 0.6606 - val_loss: 2.1594\n",
|
|
"Epoch 36/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 40ms/step - accuracy: 0.6760 - loss: 1.3408 - val_accuracy: 0.6654 - val_loss: 2.1546\n",
|
|
"Epoch 37/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 40ms/step - accuracy: 0.6849 - loss: 1.2847 - val_accuracy: 0.6619 - val_loss: 2.1882\n",
|
|
"Epoch 38/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 35ms/step - accuracy: 0.6840 - loss: 1.2830 - val_accuracy: 0.6658 - val_loss: 2.1521\n",
|
|
"Epoch 39/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 34ms/step - accuracy: 0.6952 - loss: 1.2307 - val_accuracy: 0.6662 - val_loss: 2.1626\n",
|
|
"Epoch 40/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 35ms/step - accuracy: 0.6889 - loss: 1.2360 - val_accuracy: 0.6688 - val_loss: 2.1570\n",
|
|
"Epoch 41/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 41ms/step - accuracy: 0.6944 - loss: 1.1984 - val_accuracy: 0.6576 - val_loss: 2.1762\n",
|
|
"Epoch 42/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 42ms/step - accuracy: 0.6823 - loss: 1.2255 - val_accuracy: 0.6705 - val_loss: 2.1323\n",
|
|
"Epoch 43/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 42ms/step - accuracy: 0.6988 - loss: 1.1555 - val_accuracy: 0.6619 - val_loss: 2.1621\n",
|
|
"Epoch 44/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 36ms/step - accuracy: 0.6983 - loss: 1.1513 - val_accuracy: 0.6731 - val_loss: 2.1266\n",
|
|
"Epoch 45/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 33ms/step - accuracy: 0.7167 - loss: 1.0969 - val_accuracy: 0.6688 - val_loss: 2.1393\n",
|
|
"Epoch 46/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 34ms/step - accuracy: 0.7105 - loss: 1.0865 - val_accuracy: 0.6680 - val_loss: 2.1381\n",
|
|
"Epoch 47/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 40ms/step - accuracy: 0.7060 - loss: 1.0908 - val_accuracy: 0.6710 - val_loss: 2.1448\n",
|
|
"Epoch 48/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 42ms/step - accuracy: 0.7122 - loss: 1.0628 - val_accuracy: 0.6791 - val_loss: 2.1340\n",
|
|
"Epoch 49/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 41ms/step - accuracy: 0.7141 - loss: 1.0614 - val_accuracy: 0.6641 - val_loss: 2.1370\n",
|
|
"Epoch 50/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 39ms/step - accuracy: 0.7272 - loss: 1.0169 - val_accuracy: 0.6701 - val_loss: 2.1510\n",
|
|
"Epoch 51/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 33ms/step - accuracy: 0.7252 - loss: 1.0023 - val_accuracy: 0.6671 - val_loss: 2.1608\n",
|
|
"Epoch 52/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 34ms/step - accuracy: 0.7340 - loss: 0.9779 - val_accuracy: 0.6662 - val_loss: 2.1484\n",
|
|
"Epoch 53/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 37ms/step - accuracy: 0.7207 - loss: 0.9987 - val_accuracy: 0.6735 - val_loss: 2.1349\n",
|
|
"Epoch 54/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 40ms/step - accuracy: 0.7308 - loss: 0.9795 - val_accuracy: 0.6624 - val_loss: 2.1461\n",
|
|
"Epoch 55/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 40ms/step - accuracy: 0.7326 - loss: 0.9490 - val_accuracy: 0.6796 - val_loss: 2.1393\n",
|
|
"Epoch 56/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 37ms/step - accuracy: 0.7368 - loss: 0.9340 - val_accuracy: 0.6718 - val_loss: 2.1376\n",
|
|
"Epoch 57/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 32ms/step - accuracy: 0.7327 - loss: 0.9405 - val_accuracy: 0.6744 - val_loss: 2.1315\n",
|
|
"Epoch 58/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 36ms/step - accuracy: 0.7516 - loss: 0.8669 - val_accuracy: 0.6714 - val_loss: 2.1695\n",
|
|
"Epoch 59/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 41ms/step - accuracy: 0.7340 - loss: 0.9220 - val_accuracy: 0.6705 - val_loss: 2.1972\n",
|
|
"Epoch 60/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 42ms/step - accuracy: 0.7355 - loss: 0.9112 - val_accuracy: 0.6761 - val_loss: 2.1455\n",
|
|
"Epoch 61/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 42ms/step - accuracy: 0.7447 - loss: 0.8870 - val_accuracy: 0.6705 - val_loss: 2.1824\n",
|
|
"Epoch 62/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 33ms/step - accuracy: 0.7542 - loss: 0.8443 - val_accuracy: 0.6804 - val_loss: 2.1533\n",
|
|
"Epoch 63/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 34ms/step - accuracy: 0.7533 - loss: 0.8478 - val_accuracy: 0.6766 - val_loss: 2.1586\n",
|
|
"Epoch 64/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 38ms/step - accuracy: 0.7621 - loss: 0.8095 - val_accuracy: 0.6757 - val_loss: 2.1911\n",
|
|
"Epoch 65/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 41ms/step - accuracy: 0.7639 - loss: 0.8026 - val_accuracy: 0.6787 - val_loss: 2.1547\n",
|
|
"Epoch 66/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 41ms/step - accuracy: 0.7618 - loss: 0.8170 - val_accuracy: 0.6783 - val_loss: 2.1624\n",
|
|
"Epoch 67/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 36ms/step - accuracy: 0.7587 - loss: 0.8221 - val_accuracy: 0.6804 - val_loss: 2.1561\n",
|
|
"Epoch 68/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 31ms/step - accuracy: 0.7608 - loss: 0.7940 - val_accuracy: 0.6817 - val_loss: 2.1759\n",
|
|
"Epoch 69/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 32ms/step - accuracy: 0.7665 - loss: 0.7804 - val_accuracy: 0.6809 - val_loss: 2.1995\n",
|
|
"Epoch 70/70\n",
|
|
"\u001b[1m174/174\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 38ms/step - accuracy: 0.7736 - loss: 0.7478 - val_accuracy: 0.6869 - val_loss: 2.1860\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"checkpoint = ModelCheckpoint(\n",
|
|
" \"question_prediction_model.h5\",\n",
|
|
" monitor=\"val_accuracy\",\n",
|
|
" save_best_only=True,\n",
|
|
" verbose=1,\n",
|
|
")\n",
|
|
"\n",
|
|
"early_stop = EarlyStopping(monitor=\"val_accuracy\", patience=10, verbose=1)\n",
|
|
"\n",
|
|
"# Reshaping question data for sequence-to-sequence training\n",
|
|
"# We need to reshape to (samples, max_question_len, 1) for sparse categorical crossentropy\n",
|
|
"train_question_target = np.expand_dims(train_question, -1)\n",
|
|
"test_question_target = np.expand_dims(test_question, -1)\n",
|
|
"\n",
|
|
"# Training parameters\n",
|
|
"batch_size = 8\n",
|
|
"epochs = 70\n",
|
|
"\n",
|
|
"# Train model\n",
|
|
"history = model.fit(\n",
|
|
" [train_context, train_token, train_ner, train_srl, train_q_type],\n",
|
|
" train_question_target,\n",
|
|
" batch_size=batch_size,\n",
|
|
" epochs=epochs,\n",
|
|
" validation_data=(\n",
|
|
" [test_context, test_token, test_ner, test_srl, test_q_type],\n",
|
|
" test_question_target,\n",
|
|
" ),\n",
|
|
" callbacks=[\n",
|
|
" # checkpoint,\n",
|
|
" early_stop,\n",
|
|
" ],\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 238,
|
|
"id": "184209bc",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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8qOza67fxyg/akD50SnKj85NuZFyo7NxZn6kolQT4ubmRnx8PKtWrarfZrPZWLVqFX379nVqbM4WGxtLWFhYg74pLS3lhx9+uGL7xjAMJkyYwMKFC1m9ejWxsbEN9sfHx+Pq6tqgT9LS0sjOzr5i++S/2Ww2qqurm2VfXHfddezYsYOUlJT6V0JCAmPGjKl/39z65L+Vl5ezb98+wsPDm+XXSL9+/U5bJn3v3r3ExMRAM/25CjBnzhxCQkIYPnx4/bbm+PVxOVF+dHbN8ftY+dEvU36k/OhslBspNzobp+ZHF23KdLkoPvroI8NqtRpz5841du/ebTzyyCOGv7+/kZeX5+zQLrmysjJj27ZtxrZt2wzAeOGFF4xt27YZWVlZhmEYxt///nfD39/fWLx4sbF9+3bjlltuMWJjY43Kykpnh35JPProo4afn5+xZs0aIzc3t/51/Pjx+jbjx483WrZsaaxevdrYsmWL0bdvX6Nv375OjftSefLJJ421a9camZmZxvbt240nn3zSMJlMxtdff20Yzawvzubnq8sYzbBPfve73xlr1qwxMjMzjQ0bNhhDhgwxgoKCjIKCAsNohv2xadMmw8XFxfjb3/5mpKenGx988IHh6elpvP/++/VtmtvP1bq6OqNly5bG1KlTT9vX3L4+LjfKj5Qf/UT5UUPKj35Zc86PlBs1pNzozJydH6ko1QS9/PLLRsuWLQ03NzejT58+xvfff+/skBzim2++MYDTXmPHjjWMk0t0/uUvfzFCQ0MNq9VqXHfddUZaWpqzw75kztQXgDFnzpz6NpWVlcZjjz1mBAQEGJ6ensatt95q5ObmOjXuS2XcuHFGTEyM4ebmZgQHBxvXXXddfcJlNLO+OJv/TrqaW5+MHj3aCA8PN9zc3IzIyEhj9OjRRkZGRv3+5tYfhmEYn3/+udG1a1fDarUaHTt2NF5//fUG+5vbz9Xly5cbwBnvsTl+fVxulB8pPzKUH51G+dEva875kXKj0yk3Op2z8yOTYf/hLiIiIiIiIiIi4jCaU0pERERERERERBxORSkREREREREREXE4FaVERERERERERMThVJQSERERERERERGHU1FKREREREREREQcTkUpERERERERERFxOBWlRERERERERETE4VSUEhERERERERERh1NRSkTECUwmE4sWLXJ2GCIiIiJNgnIjkeZJRSkRaXbuv/9+TCbTaa8bb7zR2aGJiIiIOJxyIxFxFhdnByAi4gw33ngjc+bMabDNarU6LR4RERERZ1JuJCLOoJFSItIsWa1WwsLCGrwCAgLg5PDxWbNmMWzYMDw8PGjdujULFixocPyOHTsYPHgwHh4etGjRgkceeYTy8vIGbd5++226dOmC1WolPDycCRMmNNh/5MgRbr31Vjw9PWnXrh1LlixxwJ2LiIiInE65kYg4g4pSIiJn8Je//IVRo0bx448/MmbMGO6880727NkDQEVFBUOHDiUgIIDNmzczf/58Vq5c2SCxmjVrFklJSTzyyCPs2LGDJUuW0LZt2wbXePbZZ7njjjvYvn07N910E2PGjOHYsWMOv1cRERGRX6LcSEQuCUNEpJkZO3asYbFYDC8vrwavv/3tb4ZhGAZgjB8/vsExiYmJxqOPPmoYhmG8/vrrRkBAgFFeXl6/f+nSpYbZbDby8vIMwzCMiIgI409/+tNZYwCMP//5z/Wfy8vLDcD46quvLvr9ioiIiJyLciMRcRbNKSUizdKgQYOYNWtWg22BgYH17/v27dtgX9++fUlJSQFgz549dO/eHS8vr/r9/fr1w2azkZaWhslk4vDhw1x33XXnjCEuLq7+vZeXF76+vhQUFFzwvYmIiIj8WsqNRMQZVJQSkWbJy8vrtCHjF4uHh0ej2rm6ujb4bDKZsNlslyQmERERkXNRbiQizqA5pUREzuD7778/7XOnTp0A6NSpEz/++CMVFRX1+zds2IDZbKZDhw74+PjQqlUrVq1a5fC4RURERC4F5UYicilopJSINEvV1dXk5eU12Obi4kJQUBAA8+fPJyEhgf79+/PBBx+wadMm3nrrLQDGjBnDtGnTGDt2LM888wyFhYVMnDiRe++9l9DQUACeeeYZxo8fT0hICMOGDaOsrIwNGzYwceJEJ9ytiIiIyLkpNxIRZ1BRSkSapWXLlhEeHt5gW4cOHUhNTYWTq7989NFHPPbYY4SHh/Phhx/SuXNnADw9PVm+fDmTJk2id+/eeHp6MmrUKF544YX6c40dO5aqqipefPFFfv/73xMUFMRtt93m4LsUERERaRzlRiLiDCbDvtKBiIicZDKZWLhwISNGjHB2KCIiIiJOp9xIRC4VzSklIiIiIiIiIiIOp6KUiIiIiIiIiIg4nB7fExERERERERERh9NIKRERERERERERcTgVpURERERERERExOFUlBIREREREREREYdTUUpERERERERERBxORSkREREREREREXE4FaVERERERERERMThVJQSERERERERERGHU1FKREREREREREQcTkUpERERERERERFxuP8Pz1bwqQBibxUAAAAASUVORK5CYII=",
|
|
"text/plain": [
|
|
"<Figure size 1200x400 with 2 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Plot training history\n",
|
|
"plt.figure(figsize=(12, 4))\n",
|
|
"plt.subplot(1, 2, 1)\n",
|
|
"plt.plot(history.history[\"accuracy\"])\n",
|
|
"plt.plot(history.history[\"val_accuracy\"])\n",
|
|
"plt.title(\"Model Accuracy\")\n",
|
|
"plt.ylabel(\"Accuracy\")\n",
|
|
"plt.xlabel(\"Epoch\")\n",
|
|
"plt.legend([\"Train\", \"Validation\"], loc=\"upper left\")\n",
|
|
"\n",
|
|
"plt.subplot(1, 2, 2)\n",
|
|
"plt.plot(history.history[\"loss\"])\n",
|
|
"plt.plot(history.history[\"val_loss\"])\n",
|
|
"plt.title(\"Model Loss\")\n",
|
|
"plt.ylabel(\"Loss\")\n",
|
|
"plt.xlabel(\"Epoch\")\n",
|
|
"plt.legend([\"Train\", \"Validation\"], loc=\"upper left\")\n",
|
|
"plt.tight_layout()\n",
|
|
"plt.savefig(\"question_prediction_training_history.png\")\n",
|
|
"plt.show()\n",
|
|
"\n",
|
|
"# Simpan model dan tokenizer\n",
|
|
"model.save(\"question_prediction_model_final.h5\")\n",
|
|
"\n",
|
|
"# Simpan tokenizer\n",
|
|
"tokenizer_data = {\n",
|
|
" \"word_tokenizer\": tokenizer.to_json(),\n",
|
|
" \"ner_tokenizer\": ner_tokenizer.to_json(),\n",
|
|
" \"srl_tokenizer\": srl_tokenizer.to_json(),\n",
|
|
" \"q_type_tokenizer\": q_type_tokenizer.to_json(),\n",
|
|
" \"max_context_len\": max_context_len,\n",
|
|
" \"max_question_len\": max_question_len,\n",
|
|
" \"max_token_len\": max_token_len,\n",
|
|
"}\n",
|
|
"\n",
|
|
"with open(\"question_prediction_tokenizers.json\", \"w\") as f:\n",
|
|
" json.dump(tokenizer_data, f)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 239,
|
|
"id": "71ec455a",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
"Model Performance Metrics:\n",
|
|
"Average BLEU Score: 6.29%\n",
|
|
"Average BLEU-1 Precision: 36.76%\n",
|
|
"Average BLEU-2 Precision: 20.73%\n",
|
|
"Average BLEU-3 Precision: 12.22%\n",
|
|
"Average BLEU-4 Precision: 6.74%\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"from collections import Counter\n",
|
|
"import pandas as pd\n",
|
|
"import numpy as np\n",
|
|
"\n",
|
|
"def evaluate_model_performance(test_data):\n",
|
|
" output_path = \"bleu_question_calculation.xlsx\"\n",
|
|
"\n",
|
|
" bleu_scores = []\n",
|
|
" rows = []\n",
|
|
"\n",
|
|
" for i in range(len(test_data)):\n",
|
|
" sample_context = contexts[test_data[i]]\n",
|
|
" sample_tokens = tokens_list[test_data[i]]\n",
|
|
" sample_ner = ner_list[test_data[i]]\n",
|
|
" sample_srl = srl_list[test_data[i]]\n",
|
|
" sample_q_type = q_types[test_data[i]]\n",
|
|
" actual_question = questions[test_data[i]]\n",
|
|
"\n",
|
|
" pred_question = predict_question(\n",
|
|
" sample_context, sample_tokens, sample_ner, sample_srl, sample_q_type\n",
|
|
" )\n",
|
|
"\n",
|
|
" actual_tokens = actual_question.split()\n",
|
|
" pred_tokens = pred_question.split()\n",
|
|
"\n",
|
|
" max_n = 4\n",
|
|
" weights = [1 / max_n] * max_n\n",
|
|
" clipped_counts = []\n",
|
|
" total_counts = []\n",
|
|
" precisions = []\n",
|
|
"\n",
|
|
" # print(f\"Sample {i+1}:\")\n",
|
|
" # print(f\"Actual Tokens: {actual_tokens}\")\n",
|
|
" # print(f\"Predicted Tokens: {pred_tokens}\")\n",
|
|
"\n",
|
|
" # Kalkulasi untuk setiap n-gram\n",
|
|
" for n in range(1, max_n + 1):\n",
|
|
" ref_ngrams = Counter(tuple(actual_tokens[j:j + n]) for j in range(len(actual_tokens) - n + 1))\n",
|
|
" cand_ngrams = Counter(tuple(pred_tokens[j:j + n]) for j in range(len(pred_tokens) - n + 1))\n",
|
|
"\n",
|
|
" clip_sum = sum(min(cnt, ref_ngrams.get(ng, 0)) for ng, cnt in cand_ngrams.items())\n",
|
|
" total = sum(cand_ngrams.values())\n",
|
|
" p_n = clip_sum / total if total > 0 else 0\n",
|
|
"\n",
|
|
" clipped_counts.append(clip_sum)\n",
|
|
" total_counts.append(total)\n",
|
|
" precisions.append(p_n)\n",
|
|
"\n",
|
|
" # print(f\"{n}-gram: clipped count = {clip_sum}, total candidate = {total}, precision = {p_n:.4f}\")\n",
|
|
"\n",
|
|
" c = len(pred_tokens)\n",
|
|
" r = len(actual_tokens)\n",
|
|
"\n",
|
|
" if c == 0:\n",
|
|
" bp = 0 \n",
|
|
" # print(f\"Brevity Penalty: BP = {bp:.4f} (c={c}, r={r}) - No predicted tokens.\")\n",
|
|
" else:\n",
|
|
" bp = 1 if c > r else np.exp(1 - r / c)\n",
|
|
" # print(f\"Brevity Penalty: BP = {bp:.4f} (c={c}, r={r})\")\n",
|
|
"\n",
|
|
" if all(p > 0 for p in precisions):\n",
|
|
" bleu = bp * np.exp(sum(w * np.log(p) for w, p in zip(weights, precisions)))\n",
|
|
" else:\n",
|
|
" bleu = 0.0\n",
|
|
"\n",
|
|
" # print(f\"BLEU score = {bleu:.4f}\\n\")\n",
|
|
"\n",
|
|
" bleu_scores.append(bleu)\n",
|
|
" \n",
|
|
" # Membuat row data dengan kolom terpisah\n",
|
|
" row_data = {\n",
|
|
" \"Sample\": i + 1,\n",
|
|
" \"Actual_Question\": actual_question,\n",
|
|
" \"Predicted_Question\": pred_question,\n",
|
|
" \"Actual_Tokens_Count\": len(actual_tokens),\n",
|
|
" \"Predicted_Tokens_Count\": len(pred_tokens),\n",
|
|
" \n",
|
|
" # BLEU-1\n",
|
|
" \"BLEU1_Clipped_Count\": clipped_counts[0],\n",
|
|
" \"BLEU1_Total_Count\": total_counts[0],\n",
|
|
" \"BLEU1_Precision\": precisions[0],\n",
|
|
" \n",
|
|
" # BLEU-2\n",
|
|
" \"BLEU2_Clipped_Count\": clipped_counts[1],\n",
|
|
" \"BLEU2_Total_Count\": total_counts[1],\n",
|
|
" \"BLEU2_Precision\": precisions[1],\n",
|
|
" \n",
|
|
" # BLEU-3\n",
|
|
" \"BLEU3_Clipped_Count\": clipped_counts[2],\n",
|
|
" \"BLEU3_Total_Count\": total_counts[2],\n",
|
|
" \"BLEU3_Precision\": precisions[2],\n",
|
|
" \n",
|
|
" # BLEU-4\n",
|
|
" \"BLEU4_Clipped_Count\": clipped_counts[3],\n",
|
|
" \"BLEU4_Total_Count\": total_counts[3],\n",
|
|
" \"BLEU4_Precision\": precisions[3],\n",
|
|
" \n",
|
|
" # Brevity Penalty dan BLEU Score\n",
|
|
" \"Brevity_Penalty\": bp,\n",
|
|
" \"BLEU_Score\": bleu\n",
|
|
" }\n",
|
|
" \n",
|
|
" rows.append(row_data)\n",
|
|
"\n",
|
|
" # Membuat DataFrame dan menyimpan ke Excel\n",
|
|
" df = pd.DataFrame(rows)\n",
|
|
" \n",
|
|
" # Menambahkan sheet untuk summary statistics\n",
|
|
" with pd.ExcelWriter(output_path, engine='openpyxl') as writer:\n",
|
|
" # Sheet detail untuk setiap sample\n",
|
|
" df.to_excel(writer, sheet_name='BLEU_Details', index=False)\n",
|
|
" \n",
|
|
" # Sheet summary untuk statistik keseluruhan\n",
|
|
" summary_data = {\n",
|
|
" 'Metric': [\n",
|
|
" 'Average BLEU Score',\n",
|
|
" 'Average BLEU-1 Precision',\n",
|
|
" 'Average BLEU-2 Precision', \n",
|
|
" 'Average BLEU-3 Precision',\n",
|
|
" 'Average BLEU-4 Precision',\n",
|
|
" 'Average Brevity Penalty',\n",
|
|
" 'Total Samples'\n",
|
|
" ],\n",
|
|
" 'Value': [\n",
|
|
" np.mean(bleu_scores),\n",
|
|
" df['BLEU1_Precision'].mean(),\n",
|
|
" df['BLEU2_Precision'].mean(),\n",
|
|
" df['BLEU3_Precision'].mean(),\n",
|
|
" df['BLEU4_Precision'].mean(),\n",
|
|
" df['Brevity_Penalty'].mean(),\n",
|
|
" len(test_data)\n",
|
|
" ]\n",
|
|
" }\n",
|
|
" \n",
|
|
" summary_df = pd.DataFrame(summary_data)\n",
|
|
" summary_df.to_excel(writer, sheet_name='Summary', index=False)\n",
|
|
" \n",
|
|
" # print(f\"Hasil disimpan di: {output_path}\")\n",
|
|
" # print(\"File Excel berisi 2 sheet:\")\n",
|
|
" # print(\"1. 'BLEU_Details' - Detail kalkulasi untuk setiap sample\")\n",
|
|
" # print(\"2. 'Summary' - Ringkasan statistik keseluruhan\")\n",
|
|
"\n",
|
|
" results = {\n",
|
|
" \"avg_bleu_score\": np.mean(bleu_scores),\n",
|
|
" \"avg_bleu1_precision\": df['BLEU1_Precision'].mean(),\n",
|
|
" \"avg_bleu2_precision\": df['BLEU2_Precision'].mean(),\n",
|
|
" \"avg_bleu3_precision\": df['BLEU3_Precision'].mean(),\n",
|
|
" \"avg_bleu4_precision\": df['BLEU4_Precision'].mean(),\n",
|
|
" }\n",
|
|
"\n",
|
|
" return results\n",
|
|
"\n",
|
|
"# Jalankan evaluasi\n",
|
|
"performance_metrics = evaluate_model_performance(test_indices)\n",
|
|
"\n",
|
|
"print(\"\\nModel Performance Metrics:\")\n",
|
|
"print(f\"Average BLEU Score: {performance_metrics['avg_bleu_score'] * 100:.2f}%\")\n",
|
|
"print(f\"Average BLEU-1 Precision: {performance_metrics['avg_bleu1_precision'] * 100:.2f}%\")\n",
|
|
"print(f\"Average BLEU-2 Precision: {performance_metrics['avg_bleu2_precision'] * 100:.2f}%\")\n",
|
|
"print(f\"Average BLEU-3 Precision: {performance_metrics['avg_bleu3_precision'] * 100:.2f}%\")\n",
|
|
"print(f\"Average BLEU-4 Precision: {performance_metrics['avg_bleu4_precision'] * 100:.2f}%\")"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "myenv",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.10.16"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|