getting this error while training my GAN model for stock prediction with GRU as generator and CNN as discriminator, here's the code. I am getting value error at d_loss_fake data cardinality is ambiguous

import pandas as pd
import pandas_ta as ta
import numpy as np
import tensorflow as tf
from keras.models import Sequential
from keras.layers import GRU, Conv1D, MaxPooling1D, Flatten, Dense, concatenate, Reshape
from keras import Model, Input
from keras.optimizers import Adam
from sklearn.metrics import mean_absolute_error, mean_squared_error

# load training and testing data from CSV files and READ them into Dataframes
train_data_path = (r"C:\Users\lenovo\Projects\Stock_prediction_3.0\IBM_train.csv")
test_data_path = (r"C:\Users\lenovo\Projects\Stock_prediction_3.0\IBM_test.csv")
try:
  df_train = pd.read_csv(train_data_path, index_col="timestamp", parse_dates=True)
  df_test = pd.read_csv(test_data_path, index_col="timestamp", parse_dates=True)
except FileNotFoundError:
  print("Error: CSV files not found. Please check the paths.")
  exit()

# Function for technical analysis
def calculate_indicators(df, window_sizes=[20, 50, 14, 12, 26]):
 
    df['CCI'] = ta.cci(df['high'], df['low'], df['close'], window=window_sizes[0])
    # Calculate RSI
    df['RSI_close'] = ta.rsi(df['close'], window=window_sizes[2])
    df['RSI_volume'] = ta.rsi(df['volume'], window=window_sizes[2])

    # Calculate EMA
    df["EMA_close"] = ta.ema(df['close'], window=window_sizes[0])
    df["EMA_volume"] = ta.ema(df['volume'], window=window_sizes[0])

    # Calculate SMA
    df["SMA_close"] = ta.sma(df['close'], window=window_sizes[1])
    df["SMA_volume"] = ta.sma(df['volume'], window=window_sizes[1])

    # Calculate ATR
    df['ATR_close'] = ta.atr(df['high'], df['low'], df['close'], length=window_sizes[0])

    return df

window_sizes = [20, 50, 14, 12, 26]
df_train = calculate_indicators(df_train, window_sizes)
df_test = calculate_indicators(df_test, window_sizes)

# Select relevant features
features = ['close','high','volume','low','RSI_close','RSI_volume','CCI','EMA_close','EMA_volume','SMA_close','SMA_volume','ATR_close']

# Normalize 'close' values
def normalize(df):
    df = df.dropna()
    df['close'] = (df['close'] - df['close'].min()) / (df['close'].max() - df['close'].min())
    df = df.replace([np.inf, -np.inf], np.nan).dropna()
    return df

df_train = normalize(df_train)
df_test = normalize(df_test)

# Define GRU generator
generator_input = Input(shape=(len(features), 1))
generator_output = GRU(64, return_sequences=True)(generator_input)
generator_output = GRU(32, return_sequences=False)(generator_output)
generator_output = Dense(1)(generator_output)
generator = Model(inputs=generator_input, outputs=generator_output)

#Define GRU discriminator
discriminator_input = Input(shape=(len(features), 1))
# Pass directly to Conv1D without additional Reshape
x = Conv1D(filters=32, kernel_size=2, activation="relu", padding="same")(discriminator_input)
x = MaxPooling1D(pool_size=1)(x)  # Now compatible with 3D input
x = Conv1D(filters=64, kernel_size=2, activation="relu", padding="same")(x)
x = MaxPooling1D(pool_size=1)(x)  
x = Dense(32, activation="relu")(x)
discriminator_output = Dense(1, activation="sigmoid")(x)
discriminator = Model(inputs=discriminator_input, outputs=discriminator_output)

# Define GAN model
gan_input = Input(shape=(len(features), 1))
gan_output = discriminator(generator(gan_input))
gan = Model(inputs=gan_input, outputs=gan_output)

# Compile models
discriminator.compile(optimizer=Adam(learning_rate=0.001), loss="binary_crossentropy", metrics=["accuracy"])
gan.compile(optimizer=Adam(learning_rate=0.001), loss="binary_crossentropy")

# Train GAN model
def train_gan(gan, generator, discriminator, df_train_norm, epochs=100, batch_size=32, save_interval=10):
    x_train = df_train_norm[features].values.reshape(-1, len(features), 1)
    x_train = x_train.astype('float32')  # Convert to float32
    y_train = np.ones((df_train_norm.shape[0], 1), dtype='float32')
    x_train = tf.stack(x_train)
    y_train = tf.stack(y_train)

    for epoch in range(epochs):
        # Train discriminator
        d_loss_real = discriminator.train_on_batch(x_train, y_train)
        d_loss_fake = discriminator.train_on_batch(generator.predict(x_train), np.zeros((batch_size, 1)))
        d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)

        # Train generator
        g_loss = gan.train_on_batch(x_train, y_train)

        # Print training progress
        if epoch % save_interval == 0:
            print(f"Epoch: {epoch+1}/{epochs}, Discriminator Loss: {d_loss:.4f}, Generator Loss: {g_loss:.4f}")

# Train the model
train_gan(gan, generator, discriminator, df_train)

I tried converting both train variables to tf.stack but still it shows value error at d_loss_fake while training the discriminator

0

There are 0 best solutions below