Source code for model

import tensorflow as tf

[docs] class generator(tf.keras.Model): def __init__(self, n_input=7, n_past_points=40, n_labels=3, data_noise_dim=50): super(generator, self).__init__() self.n_input = n_input self.n_past_points = n_past_points # Single dense layer to generate initial representation # Combine data and labels directly self.d1 = tf.keras.layers.Dense(n_past_points * 16, use_bias=False) self.bn1 = tf.keras.layers.BatchNormalization() self.lRe1 = tf.keras.layers.LeakyReLU() # Two conv transpose layers to upsample features self.conv1 = tf.keras.layers.Conv1DTranspose(32, 4, strides=1, padding='same', use_bias=False) self.bn2 = tf.keras.layers.BatchNormalization() self.lRe2 = tf.keras.layers.LeakyReLU() # Final conv to output channels self.conv2 = tf.keras.layers.Conv1D(n_input, 3, strides=1, padding='same', activation='tanh')
[docs] def call(self, inputs, training=None): # Concatenated input: [data_noise + labels] # Process together instead of separately x = self.d1(inputs) x = self.bn1(x, training=training) x = self.lRe1(x) x = tf.reshape(x, [-1, self.n_past_points, 16]) # Upsample features x = self.conv1(x) x = self.bn2(x, training=training) x = self.lRe2(x) # Generate output x = self.conv2(x) return x
[docs] class Model(tf.keras.Model): def __init__(self, n_classes, n_input): super(Model, self).__init__() self.conv1 = tf.keras.layers.Conv1D(filters=64, kernel_size=6, padding='causal') self.p1 = tf.keras.layers.MaxPooling1D(pool_size=2, strides=2, padding='same') self.bn1 = tf.keras.layers.BatchNormalization() self.drop1 = tf.keras.layers.Dropout(rate=0.2) self.conv2 = tf.keras.layers.Conv1D(filters=64, kernel_size=6, padding="causal") self.p2 = tf.keras.layers.MaxPooling1D(pool_size=2, strides=2, padding='same') self.bn2 = tf.keras.layers.BatchNormalization() self.drop2 = tf.keras.layers.Dropout(rate=0.2) self.f2 = tf.keras.layers.Flatten() self.d1 = tf.keras.layers.Dense(64, kernel_regularizer='l2', activation='relu') self.drop3 = tf.keras.layers.Dropout(rate=0.2) self.bn3 = tf.keras.layers.BatchNormalization() self.d2 = tf.keras.layers.Dense(32, kernel_regularizer='l2', activation='relu') self.drop4 = tf.keras.layers.Dropout(rate=0.2) self.bn4 = tf.keras.layers.BatchNormalization() self.d3 = tf.keras.layers.Dense(16, kernel_regularizer='l2', activation='relu') self.drop5 = tf.keras.layers.Dropout(rate=0.2) self.bn5 = tf.keras.layers.BatchNormalization() self.d4 = tf.keras.layers.Dense(n_classes, activation='sigmoid')
[docs] def call(self, inputs, training=None): x = self.conv1(inputs, training=training) x = self.p1(x, training=training) x = self.bn1(x, training=training) x = self.drop1(x, training=training) x = self.conv2(x, training=training) x = self.p2(x, training=training) x = self.bn2(x, training=training) x = self.drop2(x, training=training) x = self.f2(x, training=training) x = self.d1(x, training=training) x = self.drop3(x, training=training) x = self.bn3(x, training=training) x = self.d2(x, training=training) x = self.drop4(x, training=training) x = self.bn4(x, training=training) x = self.d3(x, training=training) x = self.drop5(x, training=training) x = self.bn5(x, training=training) return self.d4(x)
[docs] def loadModel(self, model_path): # self.model = Model(n_classes, n_input) self.load_weights(model_path)
[docs] class TCN(tf.keras.Model): def __init__(self, n_output, n_input, num_layers=6, num_filters=64, kernel_size=3, dropout_rate=0.2): super(TCN, self).__init__() # Initial Input Layer self.input_layer = tf.keras.layers.Input(shape=(None, n_input)) # TCN Blocks for i in range(num_layers): dilation_rate = 2 ** i tcn_block = self.build_tcn_block(num_filters, kernel_size, dilation_rate, dropout_rate) setattr(self, f'tcn_block_{i}', tcn_block) # Fully Connected Layers self.fc1 = tf.keras.layers.Dense(256, activation='relu') self.fc2 = tf.keras.layers.Dense(128, activation='relu') # Output Layer for Regression self.output_layer = tf.keras.layers.Dense(n_output, activation='softmax')
[docs] def build_tcn_block(self, num_filters, kernel_size, dilation_rate, dropout_rate): tcn_block = tf.keras.models.Sequential([ tf.keras.layers.Conv1D(filters=num_filters, kernel_size=kernel_size, padding='causal', dilation_rate=dilation_rate, activation='relu'), tf.keras.layers.BatchNormalization(), tf.keras.layers.SpatialDropout1D(dropout_rate) ]) return tcn_block
[docs] def call(self, inputs, training=None): x = inputs # No need to call the input layer explicitly # TCN Blocks for i in range(8): x = getattr(self, f'tcn_block_{i}')(x) # Global Average Pooling x = tf.keras.layers.GlobalAveragePooling1D()(x) # Fully Connected Layers x = self.fc1(x) x = self.fc2(x) # Output Layer for Regression return self.output_layer(x)
[docs] def loadModel(self, model_path): self.load_weights(model_path)
[docs] class LSTMGRUModel(tf.keras.Model): def __init__(self, n_input, num_units=32): super(LSTMGRUModel, self).__init__() # Input Layer self.input_layer = tf.keras.layers.Input(shape=(None, n_input)) # Flatten self.f1 = tf.keras.layers.Flatten() # Avg pooling self.avg1 = tf.keras.layers.GlobalAveragePooling1D() # LSTM and GRU Layers self.lstm_layer = tf.keras.layers.LSTM(num_units, return_sequences=True, kernel_regularizer=tf.keras.regularizers.l2(0.001)) # self.lstm_bn = tf.keras.layers.BatchNormalization() self.gru_layer = tf.keras.layers.GRU(num_units, return_sequences=True, kernel_regularizer=tf.keras.regularizers.l2(0.001)) # self.gru_bn = tf.keras.layers.BatchNormalization() self.gru_layer = tf.keras.layers.GRU(num_units, return_sequences=True, kernel_regularizer=tf.keras.regularizers.l2(0.001)) self.dropout = tf.keras.layers.Dropout(0.2) # Dense Layer for Binary Classification self.output_layer = tf.keras.layers.Dense(3, activation='softmax')
[docs] def call(self, inputs, training=None): x = inputs x = self.lstm_layer(x) #x = self.lstm_bn(x) x = self.gru_layer(x) #x = self.gru_bn(x) x = self.dropout(x, training=training) x = self.avg1(x) return self.output_layer(x)
[docs] def load_model(self, model_path): self.load_weights(model_path)