code: def forward(self, ni):
      feature = self.flatten(self.conv3(self.conv2(self.conv1(ni))))
  
      # apply noise to all linear layer
      if self.noise_scale != 0:
          noises = []
          for layer in [self.preq, self.qvalue, self.pres, self.svalue]:
              for var in layer.trainable_weights:
                  noise = tf.random.normal(
                      tf.shape(var), 0, self.noise_scale
                  )
                  noises.append(noise)
                  var.assign_add(noise)
  
      qvalue = self.qvalue(self.preq(feature))
      svalue = self.svalue(self.pres(feature))
  
      if self.noise_scale != 0:
          idx = 0
          for layer in [self.preq, self.qvalue, self.pres, self.svalue]:
              for var in layer.trainable_weights:
                  var.assign_sub(noises[idx])
                  idx += 1
  
      if dueling:
          # dueling network
          return (
              svalue + qvalue - tf.reduce_mean(qvalue, 1, keepdims=True)
          )
      else:
          return qvalue
  
imports: import argparse
  import os
  import random
  import time
  import gym
  import matplotlib.pyplot
  import numpy
  import tensorflow
  import tensorlayer
label_desc: Use image node_id 2 for calling the CNN obj's underlying member method code with example usage: obj.forward(ni) and returns: unknown, qvalue