code: def testCreateFeedForwardCommonTowerNetworkWithFeatureColumns(
      self, batch_size=2, feature_dim=4, num_actions=3
  ):
      obs_spec = {
          "global": {
              "dense": tensor_spec.TensorSpec(
                  shape=(feature_dim,), dtype=tf.float32
              ),
              "composer": tensor_spec.TensorSpec((), tf.string),
          },
          "per_arm": {
              "name": tensor_spec.TensorSpec((num_actions,), tf.string),
              "fruit": tensor_spec.TensorSpec(
                  (num_actions,), tf.string
              ),
          },
      }
      columns_dense = tf.feature_column.numeric_column(
          "dense", shape=(feature_dim,)
      )
      columns_composer = tf.feature_column.indicator_column(
          tf.feature_column.categorical_column_with_vocabulary_list(
              "composer", ["wolfgang", "amadeus", "mozart"]
          )
      )
  
      columns_name = tf.feature_column.indicator_column(
          tf.feature_column.categorical_column_with_vocabulary_list(
              "name", ["bob", "george", "wanda"]
          )
      )
      columns_fruit = tf.feature_column.indicator_column(
          tf.feature_column.categorical_column_with_vocabulary_list(
              "fruit", ["banana", "kiwi", "pear"]
          )
      )
  
      net = gafn.create_feed_forward_common_tower_network(
          observation_spec=obs_spec,
          global_layers=(4, 3, 2),
          arm_layers=(6, 5, 4),
          common_layers=(7, 6, 5),
          global_preprocessing_combiner=tf.compat.v2.keras.layers.DenseFeatures(
              [columns_dense, columns_composer]
          ),
          arm_preprocessing_combiner=tf.compat.v2.keras.layers.DenseFeatures(
              [columns_name, columns_fruit]
          ),
      )
      input_nest = {
          "global": {
              "dense": tf.constant(
                  np.random.rand(batch_size, feature_dim).astype(
                      np.float32
                  )
              ),
              "composer": tf.constant(["wolfgang", "mozart"]),
          },
          "per_arm": {
              "name": tf.constant(
                  [
                      [["george"], ["george"], ["george"]],
                      [["bob"], ["bob"], ["bob"]],
                  ]
              ),
              "fruit": tf.constant(
                  [
                      [["banana"], ["banana"], ["banana"]],
                      [["kiwi"], ["kiwi"], ["kiwi"]],
                  ]
              ),
          },
      }
  
      output, _ = net(input_nest)
      self.evaluate(
          [
              tf.compat.v1.global_variables_initializer(),
              tf.compat.v1.tables_initializer(),
          ]
      )
      output = self.evaluate(output)
      self.assertAllEqual(output.shape, (batch_size, num_actions))
  
file_path: agents/tf_agents/bandits/networks/global_and_arm_feature_network_test.py
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  from absl.testing import parameterized
  import numpy
  import tensorflow
  from tf_agents.bandits.networks import global_and_arm_feature_network
  from tf_agents.bandits.specs import utils
  from tf_agents.specs import tensor_spec
  from tf_agents.utils import test_utils
label_desc: Use image node_id 7 for calling the GlobalAndArmFeatureNetworkTest obj's underlying member method code with example usage: obj.testCreateFeedForwardCommonTowerNetworkWithFeatureColumns(batch_size, feature_dim, num_actions) without return types