import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, LSTM, Dense, Dropout
from tensorflow.keras.callbacks import EarlyStopping
# Sample data loading and preprocessing assumed here
# For demonstration, we use dummy data shapes
num_encoder_tokens = 100
num_decoder_tokens = 100
max_encoder_seq_length = 10
max_decoder_seq_length = 10
# Define encoder
encoder_inputs = Input(shape=(None, num_encoder_tokens))
encoder_lstm = LSTM(64, return_state=True, dropout=0.3, recurrent_dropout=0.3)
encoder_outputs, state_h, state_c = encoder_lstm(encoder_inputs)
encoder_states = [state_h, state_c]
# Define decoder
decoder_inputs = Input(shape=(None, num_decoder_tokens))
decoder_lstm = LSTM(64, return_sequences=True, return_state=True, dropout=0.3, recurrent_dropout=0.3)
decoder_outputs, _, _ = decoder_lstm(decoder_inputs, initial_state=encoder_states)
decoder_dense = Dense(num_decoder_tokens, activation='softmax')
decoder_outputs = decoder_dense(decoder_outputs)
# Define model
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)
# Compile model
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), loss='categorical_crossentropy', metrics=['accuracy'])
# Early stopping callback
early_stopping = EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)
# Dummy data for demonstration
X_encoder = np.random.random((1000, max_encoder_seq_length, num_encoder_tokens))
X_decoder = np.random.random((1000, max_decoder_seq_length, num_decoder_tokens))
y = np.random.random((1000, max_decoder_seq_length, num_decoder_tokens))
# Train model
history = model.fit(
[X_encoder, X_decoder], y,
batch_size=64,
epochs=30,
validation_split=0.2,
callbacks=[early_stopping]
)