import tensorflow as tf
from tensorflow.keras.layers import Input, LSTM, Dense, Attention, RepeatVector, TimeDistributed
from tensorflow.keras.models import Model
import numpy as np
# Sample data: simple sentences encoded as sequences of integers
input_texts = ["the cat sat on the mat", "dogs are playing outside", "the sun is bright today"]
word_index = {word: i+1 for i, word in enumerate(set(' '.join(input_texts).split()))}
max_len = max(len(text.split()) for text in input_texts)
# Convert texts to sequences
input_sequences = np.array([[word_index[word] for word in text.split()] + [0]*(max_len - len(text.split())) for text in input_texts])
vocab_size = len(word_index) + 1
# Define encoder
encoder_inputs = Input(shape=(max_len,))
embedding = tf.keras.layers.Embedding(input_dim=vocab_size, output_dim=8)(encoder_inputs)
encoder_lstm = LSTM(16, return_sequences=True, return_state=True)
encoder_outputs, state_h, state_c = encoder_lstm(embedding)
# Attention layer
attention = Attention()([encoder_outputs, encoder_outputs])
# Context vector: sum of attention outputs
context_vector = tf.reduce_sum(attention, axis=1)
# Decoder
repeated_context = RepeatVector(max_len)(context_vector)
decoder_dense = TimeDistributed(Dense(vocab_size, activation='softmax'))(repeated_context)
outputs = decoder_dense
model = Model(encoder_inputs, outputs)
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# Prepare targets (integer sequences) for sparse_categorical_crossentropy reconstruction
targets = np.expand_dims(input_sequences, -1)
# Train model
model.fit(input_sequences, targets, epochs=50, batch_size=2, verbose=0)
# Evaluate model
loss, accuracy = model.evaluate(input_sequences, targets, verbose=0)
print(f"Reconstruction accuracy after improvement: {accuracy*100:.2f}%")