-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlstm.py
More file actions
54 lines (47 loc) · 2.4 KB
/
Copy pathlstm.py
File metadata and controls
54 lines (47 loc) · 2.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
from keras.src.layers import Bidirectional
from sklearn.metrics import f1_score
from sklearn.preprocessing import LabelEncoder
from keras.models import Sequential
from keras.layers import Embedding, LSTM, Dense, Dropout, BatchNormalization
from keras.optimizers import Adam
class LSTMClassifier:
def __init__(self, vocab_size, embedding_dim=128, lstm_units=256, dropout_rate=0.3, learning_rate=0.0003, num_classes=10):
self.vocab_size = vocab_size
self.embedding_dim = embedding_dim
self.lstm_units = lstm_units
self.dropout_rate = dropout_rate
self.learning_rate = learning_rate
self.num_classes = num_classes
self.model = self._build_model()
self.label_encoder = LabelEncoder()
def _build_model(self):
model = Sequential()
model.add(Embedding(input_dim=self.vocab_size, output_dim=self.embedding_dim, input_length=500))
model.add(Bidirectional(LSTM(128, return_sequences=True)))
model.add(Dropout(self.dropout_rate)) # Adding dropout
model.add(Bidirectional(LSTM(128, return_sequences=True)))
model.add(Dropout(self.dropout_rate))
model.add(Bidirectional(LSTM(128)))
model.add(BatchNormalization())
model.add(Dense(64, activation='relu'))
model.add(Dense(self.num_classes, activation='softmax')) # Adjusted for multi-class classification
model.compile(optimizer=Adam(learning_rate=self.learning_rate), loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
return model
def fit(self, X_train, y_train, X_test, y_test, epochs=40, batch_size=16):
"""Trains the LSTM model."""
# Ensure labels are integer-encoded using LabelEncoder
y_train = self.label_encoder.fit_transform(y_train)
y_test = self.label_encoder.transform(y_test)
# Train the model
self.model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size, validation_data=(X_test, y_test))
def evaluate(self, X_test, y_test):
"""Evaluates the LSTM model and returns F1 score."""
# Predict on the test set
y_test = self.label_encoder.transform(y_test)
y_pred = self.model.predict(X_test)
y_pred = y_pred.argmax(axis=1)
# Evaluate the F1 score using scikit-learn
f1 = f1_score(y_test, y_pred, average='macro')
print(f"LSTM Model F1 Score: {f1:.4f}")
return f1