class_docstr: main model 
class_docstr_tok: ["main","model"]
docstr: linear layer for dim reduction
  x: shape [batch, time, feat, channel]
  output: shape [b, t, f]
docstr_tok: ["linear","layer","for","dim","reduction","x",":","shape","[","batch",",","time",",","feat",",","channel","]","output",":","shape","[","b",",","t",",","f","]"]
code: def linear_block(self, x):
      """
      linear layer for dim reduction
      x: shape [batch, time, feat, channel]
      output: shape [b, t, f]
      """
      with tf.variable_scope("linear"):
          times, feat, channel = x.shape.as_list()[1:]
          x = tf.reshape(x, [-1, feat * channel])
          if self.netconf["use_dropout"]:
              x = tf.layers.dropout(
                  x, self.netconf["dropout_rate"], training=self.train
              )
          x = common_layers.linear(
              x, "linear1", [feat * channel, self.netconf["linear_num"]]
          )
          # x = tf.nn.relu6(x)
          x = tf.reshape(x, [-1, times, self.netconf["linear_num"]])
      return x
  
imports: from absl import logging
  import delta.compat
  from delta import utils
  from delta.layers import common_layers
  from delta.data.feat.tf_speech_feature import speech_params, extract_feature
  from delta.models.base_model import RawModel
  from delta.utils.register import registers
label_desc: Use image node_id 5 for calling the EmoCRNNRawModel obj's underlying member method code with example usage: obj.linear_block(x) and returns: x