i have following code to train a lstm model on my crypto timeseri data :
# %%
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
import numpy as np
from tensorflow import keras
import joblib
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM,Dense,Dropout
import os

# %%
csv_directory = r"C:\Users\arisa\Desktop\day_spot_summary"
csv_files = [file for file in os.listdir(csv_directory) if file.endswith('.csv')]
batch_size = 512

# %%

def calculate_targets_min_max_params():
    target_cols = [
        'y_High_1d'
        # , 'y_Low_1d', 'y_Priority_1d',
        # 'y_High_2d', 'y_Low_2d', 'y_Priority_2d',
        # 'y_High_3d', 'y_Low_3d', 'y_Priority_3d',
        # 'y_High_5d', 'y_Low_5d', 'y_Priority_5d'
    ]
    scaler = MinMaxScaler()
    min_vals, max_vals = None, None
    for csv_file in csv_files:
        # Read the CSV file
        file_path = os.path.join(csv_directory, csv_file)
        chunk = pd.read_csv(file_path)
        filtered_chunk = chunk[target_cols]
        if min_vals is None:
            min_vals = filtered_chunk.min().values
            max_vals = filtered_chunk.max().values
        else:
            min_vals = np.minimum(min_vals, filtered_chunk.min().values)
            max_vals = np.maximum(max_vals, filtered_chunk.max().values)
    
    # Set the min and max values in scaler manually
    scaler.data_min_ = min_vals
    scaler.data_max_ = max_vals
    scaler.feature_range = (0, 1)
    scaler.fit(np.array([[0]*len(min_vals), [1]*len(min_vals)]))  # Dummy fit to set attributes correctly
    
    return scaler.data_min_, scaler.data_max_

# %%

# t_min_, t_max_ = calculate_targets_min_max_params()

# %%

# y_scaler = MinMaxScaler()
# y_scaler.data_min_ = t_min_
# y_scaler.data_max_ = t_max_
# y_scaler.fit(np.array([[0]*len(t_min_), [1]*len(t_min_)]))  # Dummy fit

# %%
# joblib.dump(y_scaler, 'nn_y_h1_minmaxscaler.sav')

# %%
from tensorflow.keras.layers import BatchNormalization
from tensorflow.keras.optimizers import SGD


def build_lstm_model(input_shape):
    model = Sequential([
        LSTM(2716, activation='tanh', return_sequences=True, input_shape=input_shape),  # Additional LSTM layer
        # LSTM(64, activation='tanh', return_sequences=True,),
        # Dropout(0.17),
        Dense(2716, activation='relu'),
        
        Dense(32, activation='relu'),
        # BatchNormalization(),
        Dense(1),
    ])
    optimizer = keras.optimizers.Adam(learning_rate=10)
    model.compile(optimizer='adam',
                  loss='mse',  # Use Mean Squared Error for regression
                  metrics=['mae'])  # Mean Absolute Error as an additional metric
    return model

# %%
x_scaler_loaded = joblib.load('nn_x_minmaxscaler.sav')
y_scaler_loaded = joblib.load('nn_y_h1_minmaxscaler.sav')

# %%
def data_generator_lstm( n_steps,x_scaler,y_scaler):
    
    while True:
        for csv_file in csv_files:
            # Read the CSV file
            file_path = os.path.join(csv_directory, csv_file)
            chunk = pd.read_csv(file_path)
        

            feature_data = chunk.drop([
                'y_High_1d', 'y_Low_1d', 'y_Priority_1d',
                 'y_High_2d', 'y_Low_2d', 'y_Priority_2d',
                  'y_High_3d', 'y_Low_3d', 'y_Priority_3d',
                   'y_High_5d', 'y_Low_5d', 'y_Priority_5d'], axis=1)
            target_data = chunk[[
                'y_High_1d'
                #  'y_High_2d', 'y_Low_2d', 'y_Priority_2d',
                #   'y_High_3d', 'y_Low_3d', 'y_Priority_3d',
                #    'y_High_5d', 'y_Low_5d', 'y_Priority_5d'
                   ]]
            
            feature_data_scaled = pd.DataFrame(x_scaler.transform(feature_data), columns=feature_data.columns)
            # Assuming target_data also needs to be scaled, apply scaler separately
            target_data_scaled = pd.DataFrame(y_scaler.transform(target_data), columns=target_data.columns)
            

            # ensuring end_ix does not go out of feature_data_scaled’s bounds
            num_samples = (len(feature_data_scaled) - n_steps) // batch_size
            for i in range(num_samples):
                start_ix = i * batch_size
                end_ix = start_ix + n_steps

                X = feature_data_scaled[start_ix:end_ix]
                # using .iloc to avoid KeyError, and selecting the corresponding outputs
                y = target_data_scaled.iloc[start_ix:end_ix].iloc[-1]

                yield X.values.reshape((1, n_steps, -1)), y.values.reshape((1, -1))
            
            

# %%


model = build_lstm_model((30, 2716))

model.summary()




# %%
import warnings
warnings.filterwarnings(action='ignore', message='X has feature names, but MinMaxScaler was fitted without feature names')
train_generator = data_generator_lstm(30,x_scaler_loaded,y_scaler_loaded)

from tensorflow.keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)
# Update total_samples, train_samples, and val_samples according to your dataset after transformations

model.fit(
    train_generator,
    steps_per_epoch=200,
    epochs=300,
    # callbacks=[early_stopping]
    # Add validation_data if you have a validation generator
)

# %%
model.save('lstm_1hot_extra_2716.h5')





when im fitting model the log is like:
Epoch 1/300
200/200 [==============================] - 241s 1s/step - loss: 275.8762 - mae: 8.0807
Epoch 2/300
200/200 [==============================] - 227s 1s/step - loss: 216.0684 - mae: 7.8818
Epoch 3/300
200/200 [==============================] - 213s 1s/step - loss: 267.3682 - mae: 7.6443
Epoch 4/300
200/200 [==============================] - 216s 1s/step - loss: 207.7245 - mae: 7.7060
Epoch 5/300
200/200 [==============================] - 227s 1s/step - loss: 264.2340 - mae: 7.4665
Epoch 6/300
200/200 [==============================] - 208s 1s/step - loss: 206.6096 - mae: 7.7106
Epoch 7/300
200/200 [==============================] - 201s 999ms/step - loss: 263.5975 - mae: 7.5475
Epoch 8/300
200/200 [==============================] - 196s 981ms/step - loss: 199.3741 - mae: 7.4739
Epoch 9/300
200/200 [==============================] - 250s 1s/step - loss: 264.9374 - mae: 7.7277
Epoch 10/300
200/200 [==============================] - 204s 1s/step - loss: 196.4498 - mae: 7.3484
Epoch 11/300
200/200 [==============================] - 211s 1s/step - loss: 193.5252 - mae: 7.2368
Epoch 12/300
200/200 [==============================] - 209s 1s/step - loss: 261.9489 - mae: 7.7476
Epoch 13/300
 40/200 [=====>........................] - ETA: 2:28 - loss: 73.8843 - mae: 6.8651


make proper changes to my code to make sure that model trains properly and loss decrease