text: from tensorflow.keras.models import Model
  from tensorflow.keras.layers import Dense, Activation, Permute, Dropout
  from tensorflow.keras.layers import Conv2D, MaxPooling2D, AveragePooling2D
  from tensorflow.keras.layers import SeparableConv2D, DepthwiseConv2D
  from tensorflow.keras.layers import BatchNormalization
  from tensorflow.keras.layers import SpatialDropout2D
  from tensorflow.keras.regularizers import l1_l2
  from tensorflow.keras.layers import Input, Flatten
  from tensorflow.keras.constraints import max_norm
  from tensorflow.keras import backend as K
  
  
  def EEGNet(nb_classes, Chans=64, Samples=128,
             dropoutRate=0.5, kernLength=64, F1=8,
             D=2, F2=16, norm_rate=0.25, dropoutType='Dropout'):
      if dropoutType == 'SpatialDropout2D':
          dropoutType = SpatialDropout2D
      elif dropoutType == 'Dropout':
          dropoutType = Dropout
      else:
          raise ValueError('dropoutType must be one of SpatialDropout2D '
                           'or Dropout, passed as a string.')
  
      input1 = Input(shape=(Chans, Samples, 1))
  
      block1 = Conv2D(F1, (1, kernLength), padding='same',
                      input_shape=(Chans, Samples, 1),
                      use_bias=False)(input1)
      block1 = BatchNormalization()(block1)
      block1 = DepthwiseConv2D((Chans, 1), use_bias=False,
                               depth_multiplier=D,
                               depthwise_constraint=max_norm(1.))(block1)
      block1 = BatchNormalization()(block1)
      block1 = Activation('elu')(block1)
      block1 = AveragePooling2D((1, 4))(block1)
      block1 = dropoutType(dropoutRate)(block1)
  
      block2 = SeparableConv2D(F2, (1, 16),
                               use_bias=False, padding='same')(block1)
      block2 = BatchNormalization()(block2)
      block2 = Activation('elu')(block2)
      block2 = AveragePooling2D((1, 8))(block2)
      block2 = dropoutType(dropoutRate)(block2)
  
      flatten = Flatten(name='flatten')(block2)
  
      dense = Dense(nb_classes, name='dense',
                    kernel_constraint=max_norm(norm_rate))(flatten)
      softmax = Activation('softmax', name='softmax')(dense)
  
      return Model(inputs=input1, outputs=softmax)
  